diff --git a/public/assets/css/app.css b/public/assets/css/app.css index 8785591205..d5f8d293d5 100644 --- a/public/assets/css/app.css +++ b/public/assets/css/app.css @@ -1,8959 +1,7 @@ -/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ -html { - font-family: sans-serif; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background-color: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - font-size: 2em; - margin: 0.67em 0; -} -mark { - background: #ff0; - color: #000; -} -small { - font-size: 80%; -} -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - box-sizing: content-box; - height: 0; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - color: inherit; - font: inherit; - margin: 0; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-appearance: textfield; - box-sizing: content-box; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} -legend { - border: 0; - padding: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-collapse: collapse; - border-spacing: 0; -} -td, -th { - padding: 0; -} -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ -@media print { - *, - *:before, - *:after { - background: transparent !important; - color: #000 !important; - box-shadow: none !important; - text-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="#"]:after, - a[href^="javascript:"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\2a"; -} -.glyphicon-plus:before { - content: "\2b"; -} -.glyphicon-euro:before, -.glyphicon-eur:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -.glyphicon-cd:before { - content: "\e201"; -} -.glyphicon-save-file:before { - content: "\e202"; -} -.glyphicon-open-file:before { - content: "\e203"; -} -.glyphicon-level-up:before { - content: "\e204"; -} -.glyphicon-copy:before { - content: "\e205"; -} -.glyphicon-paste:before { - content: "\e206"; -} -.glyphicon-alert:before { - content: "\e209"; -} -.glyphicon-equalizer:before { - content: "\e210"; -} -.glyphicon-king:before { - content: "\e211"; -} -.glyphicon-queen:before { - content: "\e212"; -} -.glyphicon-pawn:before { - content: "\e213"; -} -.glyphicon-bishop:before { - content: "\e214"; -} -.glyphicon-knight:before { - content: "\e215"; -} -.glyphicon-baby-formula:before { - content: "\e216"; -} -.glyphicon-tent:before { - content: "\26fa"; -} -.glyphicon-blackboard:before { - content: "\e218"; -} -.glyphicon-bed:before { - content: "\e219"; -} -.glyphicon-apple:before { - content: "\f8ff"; -} -.glyphicon-erase:before { - content: "\e221"; -} -.glyphicon-hourglass:before { - content: "\231b"; -} -.glyphicon-lamp:before { - content: "\e223"; -} -.glyphicon-duplicate:before { - content: "\e224"; -} -.glyphicon-piggy-bank:before { - content: "\e225"; -} -.glyphicon-scissors:before { - content: "\e226"; -} -.glyphicon-bitcoin:before { - content: "\e227"; -} -.glyphicon-btc:before { - content: "\e227"; -} -.glyphicon-xbt:before { - content: "\e227"; -} -.glyphicon-yen:before { - content: "\00a5"; -} -.glyphicon-jpy:before { - content: "\00a5"; -} -.glyphicon-ruble:before { - content: "\20bd"; -} -.glyphicon-rub:before { - content: "\20bd"; -} -.glyphicon-scale:before { - content: "\e230"; -} -.glyphicon-ice-lolly:before { - content: "\e231"; -} -.glyphicon-ice-lolly-tasted:before { - content: "\e232"; -} -.glyphicon-education:before { - content: "\e233"; -} -.glyphicon-option-horizontal:before { - content: "\e234"; -} -.glyphicon-option-vertical:before { - content: "\e235"; -} -.glyphicon-menu-hamburger:before { - content: "\e236"; -} -.glyphicon-modal-window:before { - content: "\e237"; -} -.glyphicon-oil:before { - content: "\e238"; -} -.glyphicon-grain:before { - content: "\e239"; -} -.glyphicon-sunglasses:before { - content: "\e240"; -} -.glyphicon-text-size:before { - content: "\e241"; -} -.glyphicon-text-color:before { - content: "\e242"; -} -.glyphicon-text-background:before { - content: "\e243"; -} -.glyphicon-object-align-top:before { - content: "\e244"; -} -.glyphicon-object-align-bottom:before { - content: "\e245"; -} -.glyphicon-object-align-horizontal:before { - content: "\e246"; -} -.glyphicon-object-align-left:before { - content: "\e247"; -} -.glyphicon-object-align-vertical:before { - content: "\e248"; -} -.glyphicon-object-align-right:before { - content: "\e249"; -} -.glyphicon-triangle-right:before { - content: "\e250"; -} -.glyphicon-triangle-left:before { - content: "\e251"; -} -.glyphicon-triangle-bottom:before { - content: "\e252"; -} -.glyphicon-triangle-top:before { - content: "\e253"; -} -.glyphicon-console:before { - content: "\e254"; -} -.glyphicon-superscript:before { - content: "\e255"; -} -.glyphicon-subscript:before { - content: "\e256"; -} -.glyphicon-menu-left:before { - content: "\e257"; -} -.glyphicon-menu-right:before { - content: "\e258"; -} -.glyphicon-menu-down:before { - content: "\e259"; -} -.glyphicon-menu-up:before { - content: "\e260"; -} -* { - box-sizing: border-box; -} -*:before, -*:after { - box-sizing: border-box; -} -html { - font-size: 10px; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #337ab7; - text-decoration: none; -} -a:hover, -a:focus { - color: #23527c; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - transition: all 0.2s ease-in-out; - display: inline-block; - max-width: 100%; - height: auto; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -[role="button"] { - cursor: pointer; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777777; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -mark, -.mark { - background-color: #fcf8e3; - padding: .2em; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #777777; -} -.text-primary { - color: #337ab7; -} -a.text-primary:hover { - color: #286090; -} -.text-success { - color: #3c763d; -} -a.text-success:hover { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #337ab7; -} -a.bg-primary:hover { - background-color: #286090; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eeeeee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - list-style: none; - margin-left: -5px; -} -.list-inline > li { - display: inline-block; - padding-left: 5px; - padding-right: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777777; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eeeeee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; - text-align: right; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; - box-shadow: none; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - word-break: break-all; - word-wrap: break-word; - color: #333333; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; -} -.row { - margin-left: -15px; - margin-right: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-left: 15px; - padding-right: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0%; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0%; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0%; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0%; - } -} -table { - background-color: transparent; -} -caption { - padding-top: 8px; - padding-bottom: 8px; - color: #777777; - text-align: left; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-of-type(odd) { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - float: none; - display: table-column; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - float: none; - display: table-cell; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -.table-responsive { - overflow-x: auto; - min-height: 0.01%; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - padding: 0; - margin: 0; - border: 0; - min-width: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); -} -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #999; -} -.form-control::-webkit-input-placeholder { - color: #999; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - background-color: #eeeeee; - opacity: 1; -} -.form-control[disabled], -fieldset[disabled] .form-control { - cursor: not-allowed; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"], - input[type="time"], - input[type="datetime-local"], - input[type="month"] { - line-height: 34px; - } - input[type="date"].input-sm, - input[type="time"].input-sm, - input[type="datetime-local"].input-sm, - input[type="month"].input-sm, - .input-group-sm input[type="date"], - .input-group-sm input[type="time"], - .input-group-sm input[type="datetime-local"], - .input-group-sm input[type="month"] { - line-height: 30px; - } - input[type="date"].input-lg, - input[type="time"].input-lg, - input[type="datetime-local"].input-lg, - input[type="month"].input-lg, - .input-group-lg input[type="date"], - .input-group-lg input[type="time"], - .input-group-lg input[type="datetime-local"], - .input-group-lg input[type="month"] { - line-height: 46px; - } -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - min-height: 20px; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-left: -20px; - margin-top: 4px \9; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - vertical-align: middle; - font-weight: normal; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; - min-height: 34px; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-left: 0; - padding-right: 0; -} -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.form-group-sm .form-control { - height: 30px; - line-height: 30px; -} -textarea.form-group-sm .form-control, -select[multiple].form-group-sm .form-control { - height: auto; -} -.form-group-sm .form-control-static { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - min-height: 32px; -} -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.form-group-lg .form-control { - height: 46px; - line-height: 46px; -} -textarea.form-group-lg .form-control, -select[multiple].form-group-lg .form-control { - height: auto; -} -.form-group-lg .form-control-static { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - min-height: 38px; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.form-control-feedback { - position: absolute; - top: 0; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; - pointer-events: none; -} -.input-lg + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} -.input-sm + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline, -.has-success.radio label, -.has-success.checkbox label, -.has-success.radio-inline label, -.has-success.checkbox-inline label { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.has-success .form-control:focus { - border-color: #2b542c; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - border-color: #3c763d; - background-color: #dff0d8; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline, -.has-warning.radio label, -.has-warning.checkbox label, -.has-warning.radio-inline label, -.has-warning.checkbox-inline label { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.has-warning .form-control:focus { - border-color: #66512c; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - border-color: #8a6d3b; - background-color: #fcf8e3; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline, -.has-error.radio label, -.has-error.checkbox label, -.has-error.radio-inline label, -.has-error.checkbox-inline label { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.has-error .form-control:focus { - border-color: #843534; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - border-color: #a94442; - background-color: #f2dede; -} -.has-error .form-control-feedback { - color: #a94442; -} -.has-feedback label ~ .form-control-feedback { - top: 25px; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-static { - display: inline-block; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - margin-top: 0; - margin-bottom: 0; - padding-top: 7px; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-left: -15px; - margin-right: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - margin-bottom: 0; - padding-top: 7px; - } -} -.form-horizontal .has-feedback .form-control-feedback { - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 14.333333px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - } -} -.btn { - display: inline-block; - margin-bottom: 0; - font-weight: normal; - text-align: center; - vertical-align: middle; - touch-action: manipulation; - cursor: pointer; - background-image: none; - border: 1px solid transparent; - white-space: nowrap; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - border-radius: 4px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus, -.btn.focus, -.btn:active.focus, -.btn.active.focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus, -.btn.focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - outline: 0; - background-image: none; - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - cursor: not-allowed; - pointer-events: none; - opacity: 0.65; - filter: alpha(opacity=65); - box-shadow: none; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus, -.btn-default.focus, -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled.focus, -.btn-default[disabled].focus, -fieldset[disabled] .btn-default.focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary.focus, -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled.focus, -.btn-primary[disabled].focus, -fieldset[disabled] .btn-primary.focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary .badge { - color: #337ab7; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:hover, -.btn-success:focus, -.btn-success.focus, -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled.focus, -.btn-success[disabled].focus, -fieldset[disabled] .btn-success.focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:hover, -.btn-info:focus, -.btn-info.focus, -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled.focus, -.btn-info[disabled].focus, -fieldset[disabled] .btn-info.focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning.focus, -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled.focus, -.btn-warning[disabled].focus, -fieldset[disabled] .btn-warning.focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger.focus, -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled.focus, -.btn-danger[disabled].focus, -fieldset[disabled] .btn-danger.focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - color: #337ab7; - font-weight: normal; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link.active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #23527c; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #777777; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - transition: opacity 0.15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - transition-property: height, visibility; - transition-duration: 0.35s; - transition-timing-function: ease; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px dashed; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - font-size: 14px; - text-align: left; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - text-decoration: none; - color: #262626; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - outline: 0; - background-color: #337ab7; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #777777; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - cursor: not-allowed; -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - left: auto; - right: 0; -} -.dropdown-menu-left { - left: 0; - right: auto; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777777; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid; - content: ""; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - left: auto; - right: 0; - } - .navbar-right .dropdown-menu-left { - left: 0; - right: auto; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; -} -.btn-group.open .dropdown-toggle { - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.btn-group.open .dropdown-toggle.btn-link { - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-bottom-left-radius: 4px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - float: none; - display: table-cell; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-left: 0; - padding-right: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555555; - text-align: center; - background-color: #eeeeee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - margin-left: -1px; -} -.nav { - margin-bottom: 0; - padding-left: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #777777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777777; - text-decoration: none; - background-color: transparent; - cursor: not-allowed; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #337ab7; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - margin-bottom: 5px; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #337ab7; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - margin-bottom: 5px; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-overflow-scrolling: touch; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-device-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; - height: 50px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -.navbar-brand > img { - display: block; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 8px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } -} -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 8px; - margin-bottom: 8px; -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .form-control-static { - display: inline-block; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } - .navbar-form .form-group:last-child { - margin-bottom: 0; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - box-shadow: none; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - margin-bottom: 0; - border-top-right-radius: 4px; - border-top-left-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - float: left; - } - .navbar-right { - float: right !important; - float: right; - margin-right: -15px; - } - .navbar-right ~ .navbar-right { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - background-color: #e7e7e7; - color: #555; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #9d9d9d; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - background-color: #080808; - color: #fff; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #9d9d9d; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #9d9d9d; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #9d9d9d; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - content: "/\00a0"; - padding: 0 5px; - color: #ccc; -} -.breadcrumb > .active { - color: #777777; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - line-height: 1.42857143; - text-decoration: none; - color: #337ab7; - background-color: #fff; - border: 1px solid #ddd; - margin-left: -1px; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-bottom-right-radius: 4px; - border-top-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #23527c; - background-color: #eeeeee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #fff; - background-color: #337ab7; - border-color: #337ab7; - cursor: default; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777777; - background-color: #fff; - border-color: #ddd; - cursor: not-allowed; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-bottom-left-radius: 6px; - border-top-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-bottom-right-radius: 6px; - border-top-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - list-style: none; - text-align: center; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777777; - background-color: #fff; - cursor: not-allowed; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #777777; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #5e5e5e; -} -.label-primary { - background-color: #337ab7; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #286090; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - color: #fff; - line-height: 1; - vertical-align: baseline; - white-space: nowrap; - text-align: center; - background-color: #777777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge, -.btn-group-xs > .btn .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #337ab7; - background-color: #fff; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding: 30px 15px; - margin-bottom: 30px; - color: inherit; - background-color: #eeeeee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron, -.container-fluid .jumbotron { - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding: 48px 0; - } - .container .jumbotron, - .container-fluid .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - transition: border 0.2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-left: auto; - margin-right: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #337ab7; -} -.thumbnail .caption { - padding: 9px; - color: #333333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #3c763d; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #31708f; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - background-color: #fcf8e3; - border-color: #faebcc; - color: #8a6d3b; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - background-color: #f2dede; - border-color: #ebccd1; - color: #a94442; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-radius: 4px; - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} -.progress-bar { - float: left; - width: 0%; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #337ab7; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - transition: width 0.6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media, -.media-body { - zoom: 1; - overflow: hidden; -} -.media-body { - width: 10000px; -} -.media-object { - display: block; -} -.media-right, -.media > .pull-right { - padding-left: 10px; -} -.media-left, -.media > .pull-left { - padding-right: 10px; -} -.media-left, -.media-right, -.media-body { - display: table-cell; - vertical-align: top; -} -.media-middle { - vertical-align: middle; -} -.media-bottom { - vertical-align: bottom; -} -.media-heading { - margin-top: 0; - margin-bottom: 5px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - margin-bottom: 20px; - padding-left: 0; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -a.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -a.list-group-item:focus { - text-decoration: none; - color: #555; - background-color: #f5f5f5; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - background-color: #eeeeee; - color: #777777; - cursor: not-allowed; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #777777; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #c7ddef; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -a.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -a.list-group-item-success.active:hover, -a.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -a.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -a.list-group-item-info.active:hover, -a.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -a.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -a.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a, -.panel-title > small, -.panel-title > .small, -.panel-title > small > a, -.panel-title > .small > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group, -.panel > .panel-collapse > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item, -.panel > .panel-collapse > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child, -.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child, -.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table caption, -.panel > .table-responsive > .table caption, -.panel > .panel-collapse > .table caption { - padding-left: 15px; - padding-right: 15px; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive, -.panel > .table + .panel-body, -.panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - border: 0; - margin-bottom: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body, -.panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #337ab7; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #337ab7; -} -.panel-primary > .panel-heading .badge { - color: #337ab7; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #337ab7; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - left: 0; - bottom: 0; - height: 100%; - width: 100%; - border: 0; -} -.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - filter: alpha(opacity=50); -} -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.modal-open { - overflow: hidden; -} -.modal { - display: none; - overflow: hidden; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transform: translate(0, -25%); - transform: translate(0, -25%); - transition: -webkit-transform 0.3s ease-out; - transition: transform 0.3s ease-out; - transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; -} -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - transform: translate(0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - background-clip: padding-box; - outline: 0; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; - filter: alpha(opacity=0); -} -.modal-backdrop.in { - opacity: 0.5; - filter: alpha(opacity=50); -} -.modal-header { - padding: 15px; - border-bottom: 1px solid #e5e5e5; - min-height: 16.42857143px; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; - font-weight: normal; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); -} -.tooltip.top { - margin-top: -3px; - padding: 5px 0; -} -.tooltip.right { - margin-left: 3px; - padding: 0 5px; -} -.tooltip.bottom { - margin-top: 3px; - padding: 5px 0; -} -.tooltip.left { - margin-left: -3px; - padding: 0 5px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - bottom: 0; - right: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - bottom: 0; - left: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - right: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - left: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - white-space: normal; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 14px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - border-width: 10px; - content: ""; -} -.popover.top > .arrow { - left: 50%; - margin-left: -11px; - border-bottom-width: 0; - border-top-color: #999999; - border-top-color: rgba(0, 0, 0, 0.25); - bottom: -11px; -} -.popover.top > .arrow:after { - content: " "; - bottom: 1px; - margin-left: -10px; - border-bottom-width: 0; - border-top-color: #fff; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-left-width: 0; - border-right-color: #999999; - border-right-color: rgba(0, 0, 0, 0.25); -} -.popover.right > .arrow:after { - content: " "; - left: 1px; - bottom: -10px; - border-left-width: 0; - border-right-color: #fff; -} -.popover.bottom > .arrow { - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999999; - border-bottom-color: rgba(0, 0, 0, 0.25); - top: -11px; -} -.popover.bottom > .arrow:after { - content: " "; - top: 1px; - margin-left: -10px; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999999; - border-left-color: rgba(0, 0, 0, 0.25); -} -.popover.left > .arrow:after { - content: " "; - right: 1px; - border-right-width: 0; - border-left-color: #fff; - bottom: -10px; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - overflow: hidden; - width: 100%; -} -.carousel-inner > .item { - display: none; - position: relative; - transition: 0.6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -@media all and (transform-3d), (-webkit-transform-3d) { - .carousel-inner > .item { - transition: -webkit-transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000; - perspective: 1000; - } - .carousel-inner > .item.next, - .carousel-inner > .item.active.right { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - left: 0; - } - .carousel-inner > .item.prev, - .carousel-inner > .item.active.left { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - left: 0; - } - .carousel-inner > .item.next.left, - .carousel-inner > .item.prev.right, - .carousel-inner > .item.active { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - left: 0; - } -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 15%; - opacity: 0.5; - filter: alpha(opacity=50); - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); -} -.carousel-control.left { - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); -} -.carousel-control.right { - left: auto; - right: 0; - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); -} -.carousel-control:hover, -.carousel-control:focus { - outline: 0; - color: #fff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - line-height: 1; - font-family: serif; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - margin-left: -30%; - padding-left: 0; - list-style: none; - text-align: center; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - border: 1px solid #fff; - border-radius: 10px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); -} -.carousel-indicators .active { - margin: 0; - width: 12px; - height: 12px; - background-color: #fff; -} -.carousel-caption { - position: absolute; - left: 15%; - right: 15%; - bottom: 20px; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -15px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -15px; - } - .carousel-caption { - left: 20%; - right: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-footer:before, -.modal-footer:after { - content: " "; - display: table; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; -} -.affix { - position: fixed; -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*! +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */.btn,.btn-group,.btn-group-vertical,.caret,.checkbox-inline,.radio-inline,img{vertical-align:middle}body,figure{margin:0}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}.fa,.glyphicon,body{-moz-osx-font-smoothing:grayscale}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}.glyphicon,address{font-style:normal}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-weight:400;line-height:1;-webkit-font-smoothing:antialiased}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}.glyphicon-jpy:before,.glyphicon-yen:before{content:"\00a5"}.glyphicon-rub:before,.glyphicon-ruble:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*,:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{text-decoration:none}a:focus{outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}dl,ol,ul{margin-top:0}.lead,address,dl{margin-bottom:20px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{font-size:16px;font-weight:300;line-height:1.4}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.btn.uppercase,.description-block>.description-text,.info-box-text,.initialism,.nav-stacked>li.header{text-transform:uppercase}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;border-bottom:1px solid #eee}ol,ul{margin-bottom:10px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.container{width:750px}}.box-body:after,.box-comments .box-comment:after,.box-footer:after,.box-header:after,.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.chat .item:after,.chat .item>.attachment:after,.clearfix:after,.colorpicker-color,.colorpicker-selectors,.colorpicker:after,.contacts-list>li:after,.container-fluid:after,.container:after,.control-sidebar-menu>li>a:after,.direct-chat-msg:after,.dl-horizontal dd:after,.dropdown-menu>li>a,.form-horizontal .form-group:after,.main-header .logo,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after,.navbar:after,.pager:after,.panel-body:after,.row:after,.user-block:after,.user-panel:after,.wrapper:after{clear:both}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}legend,pre{display:block;color:#333}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-left:15px;padding-right:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top}.table>thead>tr>th{vertical-align:bottom}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.btn-group>.btn-group,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-group-sm .form-control,.input-sm{font-size:12px;border-radius:3px;padding:5px 10px}.form-control:focus{outline:0}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;min-height:32px}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;min-height:38px}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.collapsing,.dropdown,.dropup{position:relative}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.btn-group.open .dropdown-toggle,.btn.active,.btn:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;touch-action:manipulation;cursor:pointer;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.alert a,.callout a{text-decoration:underline}.btn.active,.btn:active{outline:0}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;transition-property:height,visibility;transition-duration:.35s;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;background-clip:padding-box}.dropdown-menu-right,.dropdown-menu.pull-right{left:auto;right:0}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{font-weight:400}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{font-size:12px;color:#777}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover,.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle.btn-link{box-shadow:none}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group,.input-group-btn>.btn+.btn{margin-left:-1px}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{display:block;position:relative}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}}.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-danger,.progress-striped .progress-bar-info,.progress-striped .progress-bar-success,.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;box-shadow:none}}.breadcrumb>li,.pagination{display:inline-block}.btn .badge,.btn .label{top:-1px;position:relative}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-left{float:left!important;float:left}.navbar-right{float:right!important;float:right;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.badge,.label{font-weight:700;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}.label:empty{display:none}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;background-color:#777;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert,.thumbnail{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-left:auto;margin-right:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;background-color:#f5f5f5}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.popover,.tooltip{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.carousel-caption,.carousel-control{text-shadow:0 1px 2px rgba(0,0,0,.6)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-content,.popover{background-clip:padding-box}.modal{display:none;position:fixed;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);transform:translate(0,-25%);transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;outline:0}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.43px}.layout-boxed .wrapper,.wrapper,body,html{min-height:100%}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.top-left .tooltip-arrow{right:5px;margin-bottom:-5px}.tooltip.top-right .tooltip-arrow{left:5px;margin-bottom:-5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px}.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-size:14px;line-height:1.42857143;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.carousel-caption,.carousel-control,.carousel-indicators,.fa-fw,.fa-li{text-align:center}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.left>.arrow:after,.popover.right>.arrow:after{content:" ";bottom:-10px}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{left:1px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff}.carousel-control.left{background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}.center-block{display:block;margin-left:auto;margin-right:auto}.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}.pull-right{float:right!important}.pull-left{float:left!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.fa,.fa-stack{display:inline-block}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ -/* FONT PATH - * -------------------------- */ -@font-face { - font-family: 'FontAwesome'; - src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); - font-weight: normal; - font-style: normal; -} -.fa { - display: inline-block; - font: normal normal normal 14px/1 FontAwesome; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -/* makes the font 33% larger relative to the icon container */ -.fa-lg { - font-size: 1.33333333em; - line-height: 0.75em; - vertical-align: -15%; -} -.fa-2x { - font-size: 2em; -} -.fa-3x { - font-size: 3em; -} -.fa-4x { - font-size: 4em; -} -.fa-5x { - font-size: 5em; -} -.fa-fw { - width: 1.28571429em; - text-align: center; -} -.fa-ul { - padding-left: 0; - margin-left: 2.14285714em; - list-style-type: none; -} -.fa-ul > li { - position: relative; -} -.fa-li { - position: absolute; - left: -2.14285714em; - width: 2.14285714em; - top: 0.14285714em; - text-align: center; -} -.fa-li.fa-lg { - left: -1.85714286em; -} -.fa-border { - padding: .2em .25em .15em; - border: solid 0.08em #eee; - border-radius: .1em; -} -.fa-pull-left { - float: left; -} -.fa-pull-right { - float: right; -} -.fa.fa-pull-left { - margin-right: .3em; -} -.fa.fa-pull-right { - margin-left: .3em; -} -/* Deprecated as of 4.4.0 */ -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.fa.pull-left { - margin-right: .3em; -} -.fa.pull-right { - margin-left: .3em; -} -.fa-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} -.fa-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); -} -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - transform: rotate(180deg); -} -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - transform: rotate(270deg); -} -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - transform: scale(1, -1); -} -:root .fa-rotate-90, -:root .fa-rotate-180, -:root .fa-rotate-270, -:root .fa-flip-horizontal, -:root .fa-flip-vertical { - -webkit-filter: none; - filter: none; -} -.fa-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.fa-stack-1x, -.fa-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.fa-stack-1x { - line-height: inherit; -} -.fa-stack-2x { - font-size: 2em; -} -.fa-inverse { - color: #fff; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.fa-glass:before { - content: "\f000"; -} -.fa-music:before { - content: "\f001"; -} -.fa-search:before { - content: "\f002"; -} -.fa-envelope-o:before { - content: "\f003"; -} -.fa-heart:before { - content: "\f004"; -} -.fa-star:before { - content: "\f005"; -} -.fa-star-o:before { - content: "\f006"; -} -.fa-user:before { - content: "\f007"; -} -.fa-film:before { - content: "\f008"; -} -.fa-th-large:before { - content: "\f009"; -} -.fa-th:before { - content: "\f00a"; -} -.fa-th-list:before { - content: "\f00b"; -} -.fa-check:before { - content: "\f00c"; -} -.fa-remove:before, -.fa-close:before, -.fa-times:before { - content: "\f00d"; -} -.fa-search-plus:before { - content: "\f00e"; -} -.fa-search-minus:before { - content: "\f010"; -} -.fa-power-off:before { - content: "\f011"; -} -.fa-signal:before { - content: "\f012"; -} -.fa-gear:before, -.fa-cog:before { - content: "\f013"; -} -.fa-trash-o:before { - content: "\f014"; -} -.fa-home:before { - content: "\f015"; -} -.fa-file-o:before { - content: "\f016"; -} -.fa-clock-o:before { - content: "\f017"; -} -.fa-road:before { - content: "\f018"; -} -.fa-download:before { - content: "\f019"; -} -.fa-arrow-circle-o-down:before { - content: "\f01a"; -} -.fa-arrow-circle-o-up:before { - content: "\f01b"; -} -.fa-inbox:before { - content: "\f01c"; -} -.fa-play-circle-o:before { - content: "\f01d"; -} -.fa-rotate-right:before, -.fa-repeat:before { - content: "\f01e"; -} -.fa-refresh:before { - content: "\f021"; -} -.fa-list-alt:before { - content: "\f022"; -} -.fa-lock:before { - content: "\f023"; -} -.fa-flag:before { - content: "\f024"; -} -.fa-headphones:before { - content: "\f025"; -} -.fa-volume-off:before { - content: "\f026"; -} -.fa-volume-down:before { - content: "\f027"; -} -.fa-volume-up:before { - content: "\f028"; -} -.fa-qrcode:before { - content: "\f029"; -} -.fa-barcode:before { - content: "\f02a"; -} -.fa-tag:before { - content: "\f02b"; -} -.fa-tags:before { - content: "\f02c"; -} -.fa-book:before { - content: "\f02d"; -} -.fa-bookmark:before { - content: "\f02e"; -} -.fa-print:before { - content: "\f02f"; -} -.fa-camera:before { - content: "\f030"; -} -.fa-font:before { - content: "\f031"; -} -.fa-bold:before { - content: "\f032"; -} -.fa-italic:before { - content: "\f033"; -} -.fa-text-height:before { - content: "\f034"; -} -.fa-text-width:before { - content: "\f035"; -} -.fa-align-left:before { - content: "\f036"; -} -.fa-align-center:before { - content: "\f037"; -} -.fa-align-right:before { - content: "\f038"; -} -.fa-align-justify:before { - content: "\f039"; -} -.fa-list:before { - content: "\f03a"; -} -.fa-dedent:before, -.fa-outdent:before { - content: "\f03b"; -} -.fa-indent:before { - content: "\f03c"; -} -.fa-video-camera:before { - content: "\f03d"; -} -.fa-photo:before, -.fa-image:before, -.fa-picture-o:before { - content: "\f03e"; -} -.fa-pencil:before { - content: "\f040"; -} -.fa-map-marker:before { - content: "\f041"; -} -.fa-adjust:before { - content: "\f042"; -} -.fa-tint:before { - content: "\f043"; -} -.fa-edit:before, -.fa-pencil-square-o:before { - content: "\f044"; -} -.fa-share-square-o:before { - content: "\f045"; -} -.fa-check-square-o:before { - content: "\f046"; -} -.fa-arrows:before { - content: "\f047"; -} -.fa-step-backward:before { - content: "\f048"; -} -.fa-fast-backward:before { - content: "\f049"; -} -.fa-backward:before { - content: "\f04a"; -} -.fa-play:before { - content: "\f04b"; -} -.fa-pause:before { - content: "\f04c"; -} -.fa-stop:before { - content: "\f04d"; -} -.fa-forward:before { - content: "\f04e"; -} -.fa-fast-forward:before { - content: "\f050"; -} -.fa-step-forward:before { - content: "\f051"; -} -.fa-eject:before { - content: "\f052"; -} -.fa-chevron-left:before { - content: "\f053"; -} -.fa-chevron-right:before { - content: "\f054"; -} -.fa-plus-circle:before { - content: "\f055"; -} -.fa-minus-circle:before { - content: "\f056"; -} -.fa-times-circle:before { - content: "\f057"; -} -.fa-check-circle:before { - content: "\f058"; -} -.fa-question-circle:before { - content: "\f059"; -} -.fa-info-circle:before { - content: "\f05a"; -} -.fa-crosshairs:before { - content: "\f05b"; -} -.fa-times-circle-o:before { - content: "\f05c"; -} -.fa-check-circle-o:before { - content: "\f05d"; -} -.fa-ban:before { - content: "\f05e"; -} -.fa-arrow-left:before { - content: "\f060"; -} -.fa-arrow-right:before { - content: "\f061"; -} -.fa-arrow-up:before { - content: "\f062"; -} -.fa-arrow-down:before { - content: "\f063"; -} -.fa-mail-forward:before, -.fa-share:before { - content: "\f064"; -} -.fa-expand:before { - content: "\f065"; -} -.fa-compress:before { - content: "\f066"; -} -.fa-plus:before { - content: "\f067"; -} -.fa-minus:before { - content: "\f068"; -} -.fa-asterisk:before { - content: "\f069"; -} -.fa-exclamation-circle:before { - content: "\f06a"; -} -.fa-gift:before { - content: "\f06b"; -} -.fa-leaf:before { - content: "\f06c"; -} -.fa-fire:before { - content: "\f06d"; -} -.fa-eye:before { - content: "\f06e"; -} -.fa-eye-slash:before { - content: "\f070"; -} -.fa-warning:before, -.fa-exclamation-triangle:before { - content: "\f071"; -} -.fa-plane:before { - content: "\f072"; -} -.fa-calendar:before { - content: "\f073"; -} -.fa-random:before { - content: "\f074"; -} -.fa-comment:before { - content: "\f075"; -} -.fa-magnet:before { - content: "\f076"; -} -.fa-chevron-up:before { - content: "\f077"; -} -.fa-chevron-down:before { - content: "\f078"; -} -.fa-retweet:before { - content: "\f079"; -} -.fa-shopping-cart:before { - content: "\f07a"; -} -.fa-folder:before { - content: "\f07b"; -} -.fa-folder-open:before { - content: "\f07c"; -} -.fa-arrows-v:before { - content: "\f07d"; -} -.fa-arrows-h:before { - content: "\f07e"; -} -.fa-bar-chart-o:before, -.fa-bar-chart:before { - content: "\f080"; -} -.fa-twitter-square:before { - content: "\f081"; -} -.fa-facebook-square:before { - content: "\f082"; -} -.fa-camera-retro:before { - content: "\f083"; -} -.fa-key:before { - content: "\f084"; -} -.fa-gears:before, -.fa-cogs:before { - content: "\f085"; -} -.fa-comments:before { - content: "\f086"; -} -.fa-thumbs-o-up:before { - content: "\f087"; -} -.fa-thumbs-o-down:before { - content: "\f088"; -} -.fa-star-half:before { - content: "\f089"; -} -.fa-heart-o:before { - content: "\f08a"; -} -.fa-sign-out:before { - content: "\f08b"; -} -.fa-linkedin-square:before { - content: "\f08c"; -} -.fa-thumb-tack:before { - content: "\f08d"; -} -.fa-external-link:before { - content: "\f08e"; -} -.fa-sign-in:before { - content: "\f090"; -} -.fa-trophy:before { - content: "\f091"; -} -.fa-github-square:before { - content: "\f092"; -} -.fa-upload:before { - content: "\f093"; -} -.fa-lemon-o:before { - content: "\f094"; -} -.fa-phone:before { - content: "\f095"; -} -.fa-square-o:before { - content: "\f096"; -} -.fa-bookmark-o:before { - content: "\f097"; -} -.fa-phone-square:before { - content: "\f098"; -} -.fa-twitter:before { - content: "\f099"; -} -.fa-facebook-f:before, -.fa-facebook:before { - content: "\f09a"; -} -.fa-github:before { - content: "\f09b"; -} -.fa-unlock:before { - content: "\f09c"; -} -.fa-credit-card:before { - content: "\f09d"; -} -.fa-feed:before, -.fa-rss:before { - content: "\f09e"; -} -.fa-hdd-o:before { - content: "\f0a0"; -} -.fa-bullhorn:before { - content: "\f0a1"; -} -.fa-bell:before { - content: "\f0f3"; -} -.fa-certificate:before { - content: "\f0a3"; -} -.fa-hand-o-right:before { - content: "\f0a4"; -} -.fa-hand-o-left:before { - content: "\f0a5"; -} -.fa-hand-o-up:before { - content: "\f0a6"; -} -.fa-hand-o-down:before { - content: "\f0a7"; -} -.fa-arrow-circle-left:before { - content: "\f0a8"; -} -.fa-arrow-circle-right:before { - content: "\f0a9"; -} -.fa-arrow-circle-up:before { - content: "\f0aa"; -} -.fa-arrow-circle-down:before { - content: "\f0ab"; -} -.fa-globe:before { - content: "\f0ac"; -} -.fa-wrench:before { - content: "\f0ad"; -} -.fa-tasks:before { - content: "\f0ae"; -} -.fa-filter:before { - content: "\f0b0"; -} -.fa-briefcase:before { - content: "\f0b1"; -} -.fa-arrows-alt:before { - content: "\f0b2"; -} -.fa-group:before, -.fa-users:before { - content: "\f0c0"; -} -.fa-chain:before, -.fa-link:before { - content: "\f0c1"; -} -.fa-cloud:before { - content: "\f0c2"; -} -.fa-flask:before { - content: "\f0c3"; -} -.fa-cut:before, -.fa-scissors:before { - content: "\f0c4"; -} -.fa-copy:before, -.fa-files-o:before { - content: "\f0c5"; -} -.fa-paperclip:before { - content: "\f0c6"; -} -.fa-save:before, -.fa-floppy-o:before { - content: "\f0c7"; -} -.fa-square:before { - content: "\f0c8"; -} -.fa-navicon:before, -.fa-reorder:before, -.fa-bars:before { - content: "\f0c9"; -} -.fa-list-ul:before { - content: "\f0ca"; -} -.fa-list-ol:before { - content: "\f0cb"; -} -.fa-strikethrough:before { - content: "\f0cc"; -} -.fa-underline:before { - content: "\f0cd"; -} -.fa-table:before { - content: "\f0ce"; -} -.fa-magic:before { - content: "\f0d0"; -} -.fa-truck:before { - content: "\f0d1"; -} -.fa-pinterest:before { - content: "\f0d2"; -} -.fa-pinterest-square:before { - content: "\f0d3"; -} -.fa-google-plus-square:before { - content: "\f0d4"; -} -.fa-google-plus:before { - content: "\f0d5"; -} -.fa-money:before { - content: "\f0d6"; -} -.fa-caret-down:before { - content: "\f0d7"; -} -.fa-caret-up:before { - content: "\f0d8"; -} -.fa-caret-left:before { - content: "\f0d9"; -} -.fa-caret-right:before { - content: "\f0da"; -} -.fa-columns:before { - content: "\f0db"; -} -.fa-unsorted:before, -.fa-sort:before { - content: "\f0dc"; -} -.fa-sort-down:before, -.fa-sort-desc:before { - content: "\f0dd"; -} -.fa-sort-up:before, -.fa-sort-asc:before { - content: "\f0de"; -} -.fa-envelope:before { - content: "\f0e0"; -} -.fa-linkedin:before { - content: "\f0e1"; -} -.fa-rotate-left:before, -.fa-undo:before { - content: "\f0e2"; -} -.fa-legal:before, -.fa-gavel:before { - content: "\f0e3"; -} -.fa-dashboard:before, -.fa-tachometer:before { - content: "\f0e4"; -} -.fa-comment-o:before { - content: "\f0e5"; -} -.fa-comments-o:before { - content: "\f0e6"; -} -.fa-flash:before, -.fa-bolt:before { - content: "\f0e7"; -} -.fa-sitemap:before { - content: "\f0e8"; -} -.fa-umbrella:before { - content: "\f0e9"; -} -.fa-paste:before, -.fa-clipboard:before { - content: "\f0ea"; -} -.fa-lightbulb-o:before { - content: "\f0eb"; -} -.fa-exchange:before { - content: "\f0ec"; -} -.fa-cloud-download:before { - content: "\f0ed"; -} -.fa-cloud-upload:before { - content: "\f0ee"; -} -.fa-user-md:before { - content: "\f0f0"; -} -.fa-stethoscope:before { - content: "\f0f1"; -} -.fa-suitcase:before { - content: "\f0f2"; -} -.fa-bell-o:before { - content: "\f0a2"; -} -.fa-coffee:before { - content: "\f0f4"; -} -.fa-cutlery:before { - content: "\f0f5"; -} -.fa-file-text-o:before { - content: "\f0f6"; -} -.fa-building-o:before { - content: "\f0f7"; -} -.fa-hospital-o:before { - content: "\f0f8"; -} -.fa-ambulance:before { - content: "\f0f9"; -} -.fa-medkit:before { - content: "\f0fa"; -} -.fa-fighter-jet:before { - content: "\f0fb"; -} -.fa-beer:before { - content: "\f0fc"; -} -.fa-h-square:before { - content: "\f0fd"; -} -.fa-plus-square:before { - content: "\f0fe"; -} -.fa-angle-double-left:before { - content: "\f100"; -} -.fa-angle-double-right:before { - content: "\f101"; -} -.fa-angle-double-up:before { - content: "\f102"; -} -.fa-angle-double-down:before { - content: "\f103"; -} -.fa-angle-left:before { - content: "\f104"; -} -.fa-angle-right:before { - content: "\f105"; -} -.fa-angle-up:before { - content: "\f106"; -} -.fa-angle-down:before { - content: "\f107"; -} -.fa-desktop:before { - content: "\f108"; -} -.fa-laptop:before { - content: "\f109"; -} -.fa-tablet:before { - content: "\f10a"; -} -.fa-mobile-phone:before, -.fa-mobile:before { - content: "\f10b"; -} -.fa-circle-o:before { - content: "\f10c"; -} -.fa-quote-left:before { - content: "\f10d"; -} -.fa-quote-right:before { - content: "\f10e"; -} -.fa-spinner:before { - content: "\f110"; -} -.fa-circle:before { - content: "\f111"; -} -.fa-mail-reply:before, -.fa-reply:before { - content: "\f112"; -} -.fa-github-alt:before { - content: "\f113"; -} -.fa-folder-o:before { - content: "\f114"; -} -.fa-folder-open-o:before { - content: "\f115"; -} -.fa-smile-o:before { - content: "\f118"; -} -.fa-frown-o:before { - content: "\f119"; -} -.fa-meh-o:before { - content: "\f11a"; -} -.fa-gamepad:before { - content: "\f11b"; -} -.fa-keyboard-o:before { - content: "\f11c"; -} -.fa-flag-o:before { - content: "\f11d"; -} -.fa-flag-checkered:before { - content: "\f11e"; -} -.fa-terminal:before { - content: "\f120"; -} -.fa-code:before { - content: "\f121"; -} -.fa-mail-reply-all:before, -.fa-reply-all:before { - content: "\f122"; -} -.fa-star-half-empty:before, -.fa-star-half-full:before, -.fa-star-half-o:before { - content: "\f123"; -} -.fa-location-arrow:before { - content: "\f124"; -} -.fa-crop:before { - content: "\f125"; -} -.fa-code-fork:before { - content: "\f126"; -} -.fa-unlink:before, -.fa-chain-broken:before { - content: "\f127"; -} -.fa-question:before { - content: "\f128"; -} -.fa-info:before { - content: "\f129"; -} -.fa-exclamation:before { - content: "\f12a"; -} -.fa-superscript:before { - content: "\f12b"; -} -.fa-subscript:before { - content: "\f12c"; -} -.fa-eraser:before { - content: "\f12d"; -} -.fa-puzzle-piece:before { - content: "\f12e"; -} -.fa-microphone:before { - content: "\f130"; -} -.fa-microphone-slash:before { - content: "\f131"; -} -.fa-shield:before { - content: "\f132"; -} -.fa-calendar-o:before { - content: "\f133"; -} -.fa-fire-extinguisher:before { - content: "\f134"; -} -.fa-rocket:before { - content: "\f135"; -} -.fa-maxcdn:before { - content: "\f136"; -} -.fa-chevron-circle-left:before { - content: "\f137"; -} -.fa-chevron-circle-right:before { - content: "\f138"; -} -.fa-chevron-circle-up:before { - content: "\f139"; -} -.fa-chevron-circle-down:before { - content: "\f13a"; -} -.fa-html5:before { - content: "\f13b"; -} -.fa-css3:before { - content: "\f13c"; -} -.fa-anchor:before { - content: "\f13d"; -} -.fa-unlock-alt:before { - content: "\f13e"; -} -.fa-bullseye:before { - content: "\f140"; -} -.fa-ellipsis-h:before { - content: "\f141"; -} -.fa-ellipsis-v:before { - content: "\f142"; -} -.fa-rss-square:before { - content: "\f143"; -} -.fa-play-circle:before { - content: "\f144"; -} -.fa-ticket:before { - content: "\f145"; -} -.fa-minus-square:before { - content: "\f146"; -} -.fa-minus-square-o:before { - content: "\f147"; -} -.fa-level-up:before { - content: "\f148"; -} -.fa-level-down:before { - content: "\f149"; -} -.fa-check-square:before { - content: "\f14a"; -} -.fa-pencil-square:before { - content: "\f14b"; -} -.fa-external-link-square:before { - content: "\f14c"; -} -.fa-share-square:before { - content: "\f14d"; -} -.fa-compass:before { - content: "\f14e"; -} -.fa-toggle-down:before, -.fa-caret-square-o-down:before { - content: "\f150"; -} -.fa-toggle-up:before, -.fa-caret-square-o-up:before { - content: "\f151"; -} -.fa-toggle-right:before, -.fa-caret-square-o-right:before { - content: "\f152"; -} -.fa-euro:before, -.fa-eur:before { - content: "\f153"; -} -.fa-gbp:before { - content: "\f154"; -} -.fa-dollar:before, -.fa-usd:before { - content: "\f155"; -} -.fa-rupee:before, -.fa-inr:before { - content: "\f156"; -} -.fa-cny:before, -.fa-rmb:before, -.fa-yen:before, -.fa-jpy:before { - content: "\f157"; -} -.fa-ruble:before, -.fa-rouble:before, -.fa-rub:before { - content: "\f158"; -} -.fa-won:before, -.fa-krw:before { - content: "\f159"; -} -.fa-bitcoin:before, -.fa-btc:before { - content: "\f15a"; -} -.fa-file:before { - content: "\f15b"; -} -.fa-file-text:before { - content: "\f15c"; -} -.fa-sort-alpha-asc:before { - content: "\f15d"; -} -.fa-sort-alpha-desc:before { - content: "\f15e"; -} -.fa-sort-amount-asc:before { - content: "\f160"; -} -.fa-sort-amount-desc:before { - content: "\f161"; -} -.fa-sort-numeric-asc:before { - content: "\f162"; -} -.fa-sort-numeric-desc:before { - content: "\f163"; -} -.fa-thumbs-up:before { - content: "\f164"; -} -.fa-thumbs-down:before { - content: "\f165"; -} -.fa-youtube-square:before { - content: "\f166"; -} -.fa-youtube:before { - content: "\f167"; -} -.fa-xing:before { - content: "\f168"; -} -.fa-xing-square:before { - content: "\f169"; -} -.fa-youtube-play:before { - content: "\f16a"; -} -.fa-dropbox:before { - content: "\f16b"; -} -.fa-stack-overflow:before { - content: "\f16c"; -} -.fa-instagram:before { - content: "\f16d"; -} -.fa-flickr:before { - content: "\f16e"; -} -.fa-adn:before { - content: "\f170"; -} -.fa-bitbucket:before { - content: "\f171"; -} -.fa-bitbucket-square:before { - content: "\f172"; -} -.fa-tumblr:before { - content: "\f173"; -} -.fa-tumblr-square:before { - content: "\f174"; -} -.fa-long-arrow-down:before { - content: "\f175"; -} -.fa-long-arrow-up:before { - content: "\f176"; -} -.fa-long-arrow-left:before { - content: "\f177"; -} -.fa-long-arrow-right:before { - content: "\f178"; -} -.fa-apple:before { - content: "\f179"; -} -.fa-windows:before { - content: "\f17a"; -} -.fa-android:before { - content: "\f17b"; -} -.fa-linux:before { - content: "\f17c"; -} -.fa-dribbble:before { - content: "\f17d"; -} -.fa-skype:before { - content: "\f17e"; -} -.fa-foursquare:before { - content: "\f180"; -} -.fa-trello:before { - content: "\f181"; -} -.fa-female:before { - content: "\f182"; -} -.fa-male:before { - content: "\f183"; -} -.fa-gittip:before, -.fa-gratipay:before { - content: "\f184"; -} -.fa-sun-o:before { - content: "\f185"; -} -.fa-moon-o:before { - content: "\f186"; -} -.fa-archive:before { - content: "\f187"; -} -.fa-bug:before { - content: "\f188"; -} -.fa-vk:before { - content: "\f189"; -} -.fa-weibo:before { - content: "\f18a"; -} -.fa-renren:before { - content: "\f18b"; -} -.fa-pagelines:before { - content: "\f18c"; -} -.fa-stack-exchange:before { - content: "\f18d"; -} -.fa-arrow-circle-o-right:before { - content: "\f18e"; -} -.fa-arrow-circle-o-left:before { - content: "\f190"; -} -.fa-toggle-left:before, -.fa-caret-square-o-left:before { - content: "\f191"; -} -.fa-dot-circle-o:before { - content: "\f192"; -} -.fa-wheelchair:before { - content: "\f193"; -} -.fa-vimeo-square:before { - content: "\f194"; -} -.fa-turkish-lira:before, -.fa-try:before { - content: "\f195"; -} -.fa-plus-square-o:before { - content: "\f196"; -} -.fa-space-shuttle:before { - content: "\f197"; -} -.fa-slack:before { - content: "\f198"; -} -.fa-envelope-square:before { - content: "\f199"; -} -.fa-wordpress:before { - content: "\f19a"; -} -.fa-openid:before { - content: "\f19b"; -} -.fa-institution:before, -.fa-bank:before, -.fa-university:before { - content: "\f19c"; -} -.fa-mortar-board:before, -.fa-graduation-cap:before { - content: "\f19d"; -} -.fa-yahoo:before { - content: "\f19e"; -} -.fa-google:before { - content: "\f1a0"; -} -.fa-reddit:before { - content: "\f1a1"; -} -.fa-reddit-square:before { - content: "\f1a2"; -} -.fa-stumbleupon-circle:before { - content: "\f1a3"; -} -.fa-stumbleupon:before { - content: "\f1a4"; -} -.fa-delicious:before { - content: "\f1a5"; -} -.fa-digg:before { - content: "\f1a6"; -} -.fa-pied-piper-pp:before { - content: "\f1a7"; -} -.fa-pied-piper-alt:before { - content: "\f1a8"; -} -.fa-drupal:before { - content: "\f1a9"; -} -.fa-joomla:before { - content: "\f1aa"; -} -.fa-language:before { - content: "\f1ab"; -} -.fa-fax:before { - content: "\f1ac"; -} -.fa-building:before { - content: "\f1ad"; -} -.fa-child:before { - content: "\f1ae"; -} -.fa-paw:before { - content: "\f1b0"; -} -.fa-spoon:before { - content: "\f1b1"; -} -.fa-cube:before { - content: "\f1b2"; -} -.fa-cubes:before { - content: "\f1b3"; -} -.fa-behance:before { - content: "\f1b4"; -} -.fa-behance-square:before { - content: "\f1b5"; -} -.fa-steam:before { - content: "\f1b6"; -} -.fa-steam-square:before { - content: "\f1b7"; -} -.fa-recycle:before { - content: "\f1b8"; -} -.fa-automobile:before, -.fa-car:before { - content: "\f1b9"; -} -.fa-cab:before, -.fa-taxi:before { - content: "\f1ba"; -} -.fa-tree:before { - content: "\f1bb"; -} -.fa-spotify:before { - content: "\f1bc"; -} -.fa-deviantart:before { - content: "\f1bd"; -} -.fa-soundcloud:before { - content: "\f1be"; -} -.fa-database:before { - content: "\f1c0"; -} -.fa-file-pdf-o:before { - content: "\f1c1"; -} -.fa-file-word-o:before { - content: "\f1c2"; -} -.fa-file-excel-o:before { - content: "\f1c3"; -} -.fa-file-powerpoint-o:before { - content: "\f1c4"; -} -.fa-file-photo-o:before, -.fa-file-picture-o:before, -.fa-file-image-o:before { - content: "\f1c5"; -} -.fa-file-zip-o:before, -.fa-file-archive-o:before { - content: "\f1c6"; -} -.fa-file-sound-o:before, -.fa-file-audio-o:before { - content: "\f1c7"; -} -.fa-file-movie-o:before, -.fa-file-video-o:before { - content: "\f1c8"; -} -.fa-file-code-o:before { - content: "\f1c9"; -} -.fa-vine:before { - content: "\f1ca"; -} -.fa-codepen:before { - content: "\f1cb"; -} -.fa-jsfiddle:before { - content: "\f1cc"; -} -.fa-life-bouy:before, -.fa-life-buoy:before, -.fa-life-saver:before, -.fa-support:before, -.fa-life-ring:before { - content: "\f1cd"; -} -.fa-circle-o-notch:before { - content: "\f1ce"; -} -.fa-ra:before, -.fa-resistance:before, -.fa-rebel:before { - content: "\f1d0"; -} -.fa-ge:before, -.fa-empire:before { - content: "\f1d1"; -} -.fa-git-square:before { - content: "\f1d2"; -} -.fa-git:before { - content: "\f1d3"; -} -.fa-y-combinator-square:before, -.fa-yc-square:before, -.fa-hacker-news:before { - content: "\f1d4"; -} -.fa-tencent-weibo:before { - content: "\f1d5"; -} -.fa-qq:before { - content: "\f1d6"; -} -.fa-wechat:before, -.fa-weixin:before { - content: "\f1d7"; -} -.fa-send:before, -.fa-paper-plane:before { - content: "\f1d8"; -} -.fa-send-o:before, -.fa-paper-plane-o:before { - content: "\f1d9"; -} -.fa-history:before { - content: "\f1da"; -} -.fa-circle-thin:before { - content: "\f1db"; -} -.fa-header:before { - content: "\f1dc"; -} -.fa-paragraph:before { - content: "\f1dd"; -} -.fa-sliders:before { - content: "\f1de"; -} -.fa-share-alt:before { - content: "\f1e0"; -} -.fa-share-alt-square:before { - content: "\f1e1"; -} -.fa-bomb:before { - content: "\f1e2"; -} -.fa-soccer-ball-o:before, -.fa-futbol-o:before { - content: "\f1e3"; -} -.fa-tty:before { - content: "\f1e4"; -} -.fa-binoculars:before { - content: "\f1e5"; -} -.fa-plug:before { - content: "\f1e6"; -} -.fa-slideshare:before { - content: "\f1e7"; -} -.fa-twitch:before { - content: "\f1e8"; -} -.fa-yelp:before { - content: "\f1e9"; -} -.fa-newspaper-o:before { - content: "\f1ea"; -} -.fa-wifi:before { - content: "\f1eb"; -} -.fa-calculator:before { - content: "\f1ec"; -} -.fa-paypal:before { - content: "\f1ed"; -} -.fa-google-wallet:before { - content: "\f1ee"; -} -.fa-cc-visa:before { - content: "\f1f0"; -} -.fa-cc-mastercard:before { - content: "\f1f1"; -} -.fa-cc-discover:before { - content: "\f1f2"; -} -.fa-cc-amex:before { - content: "\f1f3"; -} -.fa-cc-paypal:before { - content: "\f1f4"; -} -.fa-cc-stripe:before { - content: "\f1f5"; -} -.fa-bell-slash:before { - content: "\f1f6"; -} -.fa-bell-slash-o:before { - content: "\f1f7"; -} -.fa-trash:before { - content: "\f1f8"; -} -.fa-copyright:before { - content: "\f1f9"; -} -.fa-at:before { - content: "\f1fa"; -} -.fa-eyedropper:before { - content: "\f1fb"; -} -.fa-paint-brush:before { - content: "\f1fc"; -} -.fa-birthday-cake:before { - content: "\f1fd"; -} -.fa-area-chart:before { - content: "\f1fe"; -} -.fa-pie-chart:before { - content: "\f200"; -} -.fa-line-chart:before { - content: "\f201"; -} -.fa-lastfm:before { - content: "\f202"; -} -.fa-lastfm-square:before { - content: "\f203"; -} -.fa-toggle-off:before { - content: "\f204"; -} -.fa-toggle-on:before { - content: "\f205"; -} -.fa-bicycle:before { - content: "\f206"; -} -.fa-bus:before { - content: "\f207"; -} -.fa-ioxhost:before { - content: "\f208"; -} -.fa-angellist:before { - content: "\f209"; -} -.fa-cc:before { - content: "\f20a"; -} -.fa-shekel:before, -.fa-sheqel:before, -.fa-ils:before { - content: "\f20b"; -} -.fa-meanpath:before { - content: "\f20c"; -} -.fa-buysellads:before { - content: "\f20d"; -} -.fa-connectdevelop:before { - content: "\f20e"; -} -.fa-dashcube:before { - content: "\f210"; -} -.fa-forumbee:before { - content: "\f211"; -} -.fa-leanpub:before { - content: "\f212"; -} -.fa-sellsy:before { - content: "\f213"; -} -.fa-shirtsinbulk:before { - content: "\f214"; -} -.fa-simplybuilt:before { - content: "\f215"; -} -.fa-skyatlas:before { - content: "\f216"; -} -.fa-cart-plus:before { - content: "\f217"; -} -.fa-cart-arrow-down:before { - content: "\f218"; -} -.fa-diamond:before { - content: "\f219"; -} -.fa-ship:before { - content: "\f21a"; -} -.fa-user-secret:before { - content: "\f21b"; -} -.fa-motorcycle:before { - content: "\f21c"; -} -.fa-street-view:before { - content: "\f21d"; -} -.fa-heartbeat:before { - content: "\f21e"; -} -.fa-venus:before { - content: "\f221"; -} -.fa-mars:before { - content: "\f222"; -} -.fa-mercury:before { - content: "\f223"; -} -.fa-intersex:before, -.fa-transgender:before { - content: "\f224"; -} -.fa-transgender-alt:before { - content: "\f225"; -} -.fa-venus-double:before { - content: "\f226"; -} -.fa-mars-double:before { - content: "\f227"; -} -.fa-venus-mars:before { - content: "\f228"; -} -.fa-mars-stroke:before { - content: "\f229"; -} -.fa-mars-stroke-v:before { - content: "\f22a"; -} -.fa-mars-stroke-h:before { - content: "\f22b"; -} -.fa-neuter:before { - content: "\f22c"; -} -.fa-genderless:before { - content: "\f22d"; -} -.fa-facebook-official:before { - content: "\f230"; -} -.fa-pinterest-p:before { - content: "\f231"; -} -.fa-whatsapp:before { - content: "\f232"; -} -.fa-server:before { - content: "\f233"; -} -.fa-user-plus:before { - content: "\f234"; -} -.fa-user-times:before { - content: "\f235"; -} -.fa-hotel:before, -.fa-bed:before { - content: "\f236"; -} -.fa-viacoin:before { - content: "\f237"; -} -.fa-train:before { - content: "\f238"; -} -.fa-subway:before { - content: "\f239"; -} -.fa-medium:before { - content: "\f23a"; -} -.fa-yc:before, -.fa-y-combinator:before { - content: "\f23b"; -} -.fa-optin-monster:before { - content: "\f23c"; -} -.fa-opencart:before { - content: "\f23d"; -} -.fa-expeditedssl:before { - content: "\f23e"; -} -.fa-battery-4:before, -.fa-battery:before, -.fa-battery-full:before { - content: "\f240"; -} -.fa-battery-3:before, -.fa-battery-three-quarters:before { - content: "\f241"; -} -.fa-battery-2:before, -.fa-battery-half:before { - content: "\f242"; -} -.fa-battery-1:before, -.fa-battery-quarter:before { - content: "\f243"; -} -.fa-battery-0:before, -.fa-battery-empty:before { - content: "\f244"; -} -.fa-mouse-pointer:before { - content: "\f245"; -} -.fa-i-cursor:before { - content: "\f246"; -} -.fa-object-group:before { - content: "\f247"; -} -.fa-object-ungroup:before { - content: "\f248"; -} -.fa-sticky-note:before { - content: "\f249"; -} -.fa-sticky-note-o:before { - content: "\f24a"; -} -.fa-cc-jcb:before { - content: "\f24b"; -} -.fa-cc-diners-club:before { - content: "\f24c"; -} -.fa-clone:before { - content: "\f24d"; -} -.fa-balance-scale:before { - content: "\f24e"; -} -.fa-hourglass-o:before { - content: "\f250"; -} -.fa-hourglass-1:before, -.fa-hourglass-start:before { - content: "\f251"; -} -.fa-hourglass-2:before, -.fa-hourglass-half:before { - content: "\f252"; -} -.fa-hourglass-3:before, -.fa-hourglass-end:before { - content: "\f253"; -} -.fa-hourglass:before { - content: "\f254"; -} -.fa-hand-grab-o:before, -.fa-hand-rock-o:before { - content: "\f255"; -} -.fa-hand-stop-o:before, -.fa-hand-paper-o:before { - content: "\f256"; -} -.fa-hand-scissors-o:before { - content: "\f257"; -} -.fa-hand-lizard-o:before { - content: "\f258"; -} -.fa-hand-spock-o:before { - content: "\f259"; -} -.fa-hand-pointer-o:before { - content: "\f25a"; -} -.fa-hand-peace-o:before { - content: "\f25b"; -} -.fa-trademark:before { - content: "\f25c"; -} -.fa-registered:before { - content: "\f25d"; -} -.fa-creative-commons:before { - content: "\f25e"; -} -.fa-gg:before { - content: "\f260"; -} -.fa-gg-circle:before { - content: "\f261"; -} -.fa-tripadvisor:before { - content: "\f262"; -} -.fa-odnoklassniki:before { - content: "\f263"; -} -.fa-odnoklassniki-square:before { - content: "\f264"; -} -.fa-get-pocket:before { - content: "\f265"; -} -.fa-wikipedia-w:before { - content: "\f266"; -} -.fa-safari:before { - content: "\f267"; -} -.fa-chrome:before { - content: "\f268"; -} -.fa-firefox:before { - content: "\f269"; -} -.fa-opera:before { - content: "\f26a"; -} -.fa-internet-explorer:before { - content: "\f26b"; -} -.fa-tv:before, -.fa-television:before { - content: "\f26c"; -} -.fa-contao:before { - content: "\f26d"; -} -.fa-500px:before { - content: "\f26e"; -} -.fa-amazon:before { - content: "\f270"; -} -.fa-calendar-plus-o:before { - content: "\f271"; -} -.fa-calendar-minus-o:before { - content: "\f272"; -} -.fa-calendar-times-o:before { - content: "\f273"; -} -.fa-calendar-check-o:before { - content: "\f274"; -} -.fa-industry:before { - content: "\f275"; -} -.fa-map-pin:before { - content: "\f276"; -} -.fa-map-signs:before { - content: "\f277"; -} -.fa-map-o:before { - content: "\f278"; -} -.fa-map:before { - content: "\f279"; -} -.fa-commenting:before { - content: "\f27a"; -} -.fa-commenting-o:before { - content: "\f27b"; -} -.fa-houzz:before { - content: "\f27c"; -} -.fa-vimeo:before { - content: "\f27d"; -} -.fa-black-tie:before { - content: "\f27e"; -} -.fa-fonticons:before { - content: "\f280"; -} -.fa-reddit-alien:before { - content: "\f281"; -} -.fa-edge:before { - content: "\f282"; -} -.fa-credit-card-alt:before { - content: "\f283"; -} -.fa-codiepie:before { - content: "\f284"; -} -.fa-modx:before { - content: "\f285"; -} -.fa-fort-awesome:before { - content: "\f286"; -} -.fa-usb:before { - content: "\f287"; -} -.fa-product-hunt:before { - content: "\f288"; -} -.fa-mixcloud:before { - content: "\f289"; -} -.fa-scribd:before { - content: "\f28a"; -} -.fa-pause-circle:before { - content: "\f28b"; -} -.fa-pause-circle-o:before { - content: "\f28c"; -} -.fa-stop-circle:before { - content: "\f28d"; -} -.fa-stop-circle-o:before { - content: "\f28e"; -} -.fa-shopping-bag:before { - content: "\f290"; -} -.fa-shopping-basket:before { - content: "\f291"; -} -.fa-hashtag:before { - content: "\f292"; -} -.fa-bluetooth:before { - content: "\f293"; -} -.fa-bluetooth-b:before { - content: "\f294"; -} -.fa-percent:before { - content: "\f295"; -} -.fa-gitlab:before { - content: "\f296"; -} -.fa-wpbeginner:before { - content: "\f297"; -} -.fa-wpforms:before { - content: "\f298"; -} -.fa-envira:before { - content: "\f299"; -} -.fa-universal-access:before { - content: "\f29a"; -} -.fa-wheelchair-alt:before { - content: "\f29b"; -} -.fa-question-circle-o:before { - content: "\f29c"; -} -.fa-blind:before { - content: "\f29d"; -} -.fa-audio-description:before { - content: "\f29e"; -} -.fa-volume-control-phone:before { - content: "\f2a0"; -} -.fa-braille:before { - content: "\f2a1"; -} -.fa-assistive-listening-systems:before { - content: "\f2a2"; -} -.fa-asl-interpreting:before, -.fa-american-sign-language-interpreting:before { - content: "\f2a3"; -} -.fa-deafness:before, -.fa-hard-of-hearing:before, -.fa-deaf:before { - content: "\f2a4"; -} -.fa-glide:before { - content: "\f2a5"; -} -.fa-glide-g:before { - content: "\f2a6"; -} -.fa-signing:before, -.fa-sign-language:before { - content: "\f2a7"; -} -.fa-low-vision:before { - content: "\f2a8"; -} -.fa-viadeo:before { - content: "\f2a9"; -} -.fa-viadeo-square:before { - content: "\f2aa"; -} -.fa-snapchat:before { - content: "\f2ab"; -} -.fa-snapchat-ghost:before { - content: "\f2ac"; -} -.fa-snapchat-square:before { - content: "\f2ad"; -} -.fa-pied-piper:before { - content: "\f2ae"; -} -.fa-first-order:before { - content: "\f2b0"; -} -.fa-yoast:before { - content: "\f2b1"; -} -.fa-themeisle:before { - content: "\f2b2"; -} -.fa-google-plus-circle:before, -.fa-google-plus-official:before { - content: "\f2b3"; -} -.fa-fa:before, -.fa-font-awesome:before { - content: "\f2b4"; -} -.fa-handshake-o:before { - content: "\f2b5"; -} -.fa-envelope-open:before { - content: "\f2b6"; -} -.fa-envelope-open-o:before { - content: "\f2b7"; -} -.fa-linode:before { - content: "\f2b8"; -} -.fa-address-book:before { - content: "\f2b9"; -} -.fa-address-book-o:before { - content: "\f2ba"; -} -.fa-vcard:before, -.fa-address-card:before { - content: "\f2bb"; -} -.fa-vcard-o:before, -.fa-address-card-o:before { - content: "\f2bc"; -} -.fa-user-circle:before { - content: "\f2bd"; -} -.fa-user-circle-o:before { - content: "\f2be"; -} -.fa-user-o:before { - content: "\f2c0"; -} -.fa-id-badge:before { - content: "\f2c1"; -} -.fa-drivers-license:before, -.fa-id-card:before { - content: "\f2c2"; -} -.fa-drivers-license-o:before, -.fa-id-card-o:before { - content: "\f2c3"; -} -.fa-quora:before { - content: "\f2c4"; -} -.fa-free-code-camp:before { - content: "\f2c5"; -} -.fa-telegram:before { - content: "\f2c6"; -} -.fa-thermometer-4:before, -.fa-thermometer:before, -.fa-thermometer-full:before { - content: "\f2c7"; -} -.fa-thermometer-3:before, -.fa-thermometer-three-quarters:before { - content: "\f2c8"; -} -.fa-thermometer-2:before, -.fa-thermometer-half:before { - content: "\f2c9"; -} -.fa-thermometer-1:before, -.fa-thermometer-quarter:before { - content: "\f2ca"; -} -.fa-thermometer-0:before, -.fa-thermometer-empty:before { - content: "\f2cb"; -} -.fa-shower:before { - content: "\f2cc"; -} -.fa-bathtub:before, -.fa-s15:before, -.fa-bath:before { - content: "\f2cd"; -} -.fa-podcast:before { - content: "\f2ce"; -} -.fa-window-maximize:before { - content: "\f2d0"; -} -.fa-window-minimize:before { - content: "\f2d1"; -} -.fa-window-restore:before { - content: "\f2d2"; -} -.fa-times-rectangle:before, -.fa-window-close:before { - content: "\f2d3"; -} -.fa-times-rectangle-o:before, -.fa-window-close-o:before { - content: "\f2d4"; -} -.fa-bandcamp:before { - content: "\f2d5"; -} -.fa-grav:before { - content: "\f2d6"; -} -.fa-etsy:before { - content: "\f2d7"; -} -.fa-imdb:before { - content: "\f2d8"; -} -.fa-ravelry:before { - content: "\f2d9"; -} -.fa-eercast:before { - content: "\f2da"; -} -.fa-microchip:before { - content: "\f2db"; -} -.fa-snowflake-o:before { - content: "\f2dc"; -} -.fa-superpowers:before { - content: "\f2dd"; -} -.fa-wpexplorer:before { - content: "\f2de"; -} -.fa-meetup:before { - content: "\f2e0"; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -.ekko-lightbox-container { - position: relative; -} -.ekko-lightbox-container > div.ekko-lightbox-item { - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - width: 100%; -} -.ekko-lightbox iframe { - width: 100%; - height: 100%; -} -.ekko-lightbox-nav-overlay { - z-index: 100; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: -webkit-box; - display: flex; -} -.ekko-lightbox-nav-overlay a { - -webkit-box-flex: 1; - flex: 1; - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - opacity: 0; - transition: opacity 0.5s; - color: #fff; - font-size: 30px; - z-index: 100; -} -.ekko-lightbox-nav-overlay a > * { - -webkit-box-flex: 1; - flex-grow: 1; -} -.ekko-lightbox-nav-overlay a > *:focus { - outline: none; -} -.ekko-lightbox-nav-overlay a span { - padding: 0 30px; -} -.ekko-lightbox-nav-overlay a:last-child span { - text-align: right; -} -.ekko-lightbox-nav-overlay a:hover { - text-decoration: none; -} -.ekko-lightbox-nav-overlay a:focus { - outline: none; -} -.ekko-lightbox a:hover { - opacity: 1; - text-decoration: none; -} -.ekko-lightbox .modal-dialog { - display: none; -} -.ekko-lightbox .modal-footer { - text-align: left; -} -.ekko-lightbox-loader { - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - width: 100%; - display: -webkit-box; - display: flex; - /* establish flex container */ - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - /* make main axis vertical */ - -webkit-box-pack: center; - justify-content: center; - /* center items vertically, in this case */ - -webkit-box-align: center; - align-items: center; -} -.ekko-lightbox-loader > div { - width: 40px; - height: 40px; - position: relative; - text-align: center; -} -.ekko-lightbox-loader > div > div { - width: 100%; - height: 100%; - border-radius: 50%; - background-color: #fff; - opacity: 0.6; - position: absolute; - top: 0; - left: 0; - -webkit-animation: sk-bounce 2s infinite ease-in-out; - animation: sk-bounce 2s infinite ease-in-out; -} -.ekko-lightbox-loader > div > div:last-child { - -webkit-animation-delay: -1s; - animation-delay: -1s; -} -.modal-dialog .ekko-lightbox-loader > div > div { - background-color: #333; -} -@-webkit-keyframes sk-bounce { - 0%, - 100% { - -webkit-transform: scale(0); - } - 50% { - -webkit-transform: scale(1); - } -} -@keyframes sk-bounce { - 0%, - 100% { - transform: scale(0); - -webkit-transform: scale(0); - } - 50% { - transform: scale(1); - -webkit-transform: scale(1); - } -} -/*! + */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.7.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.7.0) format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.ekko-lightbox-container{position:relative}.ekko-lightbox-container>div.ekko-lightbox-item{position:absolute;top:0;left:0;bottom:0;right:0;width:100%}.ekko-lightbox iframe{width:100%;height:100%}.ekko-lightbox-nav-overlay{z-index:100;position:absolute;top:0;left:0;width:100%;height:100%;display:-webkit-box;display:flex}.ekko-lightbox-nav-overlay a{-webkit-box-flex:1;flex:1;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;opacity:0;transition:opacity .5s;color:#fff;font-size:30px;z-index:100}.ekko-lightbox-nav-overlay a>*{-webkit-box-flex:1;flex-grow:1}.ekko-lightbox-nav-overlay a>:focus{outline:0}.ekko-lightbox-nav-overlay a span{padding:0 30px}.ekko-lightbox-nav-overlay a:last-child span{text-align:right}.ekko-lightbox-nav-overlay a:hover{text-decoration:none}.ekko-lightbox-nav-overlay a:focus{outline:0}.ekko-lightbox a:hover{opacity:1;text-decoration:none}.ekko-lightbox .modal-dialog{display:none}.ekko-lightbox .modal-footer{text-align:left}.ekko-lightbox-loader{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}.ekko-lightbox-loader>div{width:40px;height:40px;position:relative;text-align:center}.ekko-lightbox-loader>div>div{width:100%;height:100%;border-radius:50%;background-color:#fff;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-bounce 2s infinite ease-in-out;animation:sk-bounce 2s infinite ease-in-out}.ekko-lightbox-loader>div>div:last-child{-webkit-animation-delay:-1s;animation-delay:-1s}.modal-dialog .ekko-lightbox-loader>div>div{background-color:#333}@-webkit-keyframes sk-bounce{0%,100%{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,100%{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}/*! * Bootstrap Colorpicker v2.4.0 * https://itsjavi.com/bootstrap-colorpicker/ * @@ -8961,5352 +9,10 @@ button.close { * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0.txt * - */ -.colorpicker-saturation { - width: 100px; - height: 100px; - background-image: url("../img/bootstrap-colorpicker/saturation.png"); - cursor: crosshair; - float: left; -} -.colorpicker-saturation i { - display: block; - height: 5px; - width: 5px; - border: 1px solid #000; - border-radius: 5px; - position: absolute; - top: 0; - left: 0; - margin: -4px 0 0 -4px; -} -.colorpicker-saturation i b { - display: block; - height: 5px; - width: 5px; - border: 1px solid #fff; - border-radius: 5px; -} -.colorpicker-hue, -.colorpicker-alpha { - width: 15px; - height: 100px; - float: left; - cursor: row-resize; - margin-left: 4px; - margin-bottom: 4px; -} -.colorpicker-hue i, -.colorpicker-alpha i { - display: block; - height: 1px; - background: #000; - border-top: 1px solid #fff; - position: absolute; - top: 0; - left: 0; - width: 100%; - margin-top: -1px; -} -.colorpicker-hue { - background-image: url("../img/bootstrap-colorpicker/hue.png"); -} -.colorpicker-alpha { - background-image: url("../img/bootstrap-colorpicker/alpha.png"); - display: none; -} -.colorpicker-saturation, -.colorpicker-hue, -.colorpicker-alpha { - background-size: contain; -} -.colorpicker { - padding: 4px; - min-width: 130px; - margin-top: 1px; - border-radius: 4px; - z-index: 2500; -} -.colorpicker:before, -.colorpicker:after { - display: table; - content: ""; - line-height: 0; -} -.colorpicker:after { - clear: both; -} -.colorpicker:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 6px; -} -.colorpicker:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - position: absolute; - top: -6px; - left: 7px; -} -.colorpicker div { - position: relative; -} -.colorpicker.colorpicker-with-alpha { - min-width: 140px; -} -.colorpicker.colorpicker-with-alpha .colorpicker-alpha { - display: block; -} -.colorpicker-color { - height: 10px; - margin-top: 5px; - clear: both; - background-image: url("../img/bootstrap-colorpicker/alpha.png"); - background-position: 0 100%; -} -.colorpicker-color div { - height: 10px; -} -.colorpicker-selectors { - display: none; - height: 10px; - margin-top: 5px; - clear: both; -} -.colorpicker-selectors i { - cursor: pointer; - float: left; - height: 10px; - width: 10px; -} -.colorpicker-selectors i + i { - margin-left: 3px; -} -.colorpicker-element .input-group-addon i, -.colorpicker-element .add-on i { - display: inline-block; - cursor: pointer; - height: 16px; - vertical-align: text-top; - width: 16px; -} -.colorpicker.colorpicker-inline { - position: relative; - display: inline-block; - float: none; - z-index: auto; -} -.colorpicker.colorpicker-horizontal { - width: 110px; - min-width: 110px; - height: auto; -} -.colorpicker.colorpicker-horizontal .colorpicker-saturation { - margin-bottom: 4px; -} -.colorpicker.colorpicker-horizontal .colorpicker-color { - width: 100px; -} -.colorpicker.colorpicker-horizontal .colorpicker-hue, -.colorpicker.colorpicker-horizontal .colorpicker-alpha { - width: 100px; - height: 15px; - float: left; - cursor: col-resize; - margin-left: 0px; - margin-bottom: 4px; -} -.colorpicker.colorpicker-horizontal .colorpicker-hue i, -.colorpicker.colorpicker-horizontal .colorpicker-alpha i { - display: block; - height: 15px; - background: #ffffff; - position: absolute; - top: 0; - left: 0; - width: 1px; - border: none; - margin-top: 0px; -} -.colorpicker.colorpicker-horizontal .colorpicker-hue { - background-image: url("../img/bootstrap-colorpicker/hue-horizontal.png"); -} -.colorpicker.colorpicker-horizontal .colorpicker-alpha { - background-image: url("../img/bootstrap-colorpicker/alpha-horizontal.png"); -} -.colorpicker-right:before { - left: auto; - right: 6px; -} -.colorpicker-right:after { - left: auto; - right: 7px; -} -.colorpicker-no-arrow:before { - border-right: 0; - border-left: 0; -} -.colorpicker-no-arrow:after { - border-right: 0; - border-left: 0; -} -.colorpicker.colorpicker-visible, -.colorpicker-alpha.colorpicker-visible, -.colorpicker-saturation.colorpicker-visible, -.colorpicker-hue.colorpicker-visible, -.colorpicker-selectors.colorpicker-visible { - display: block; -} -.colorpicker.colorpicker-hidden, -.colorpicker-alpha.colorpicker-hidden, -.colorpicker-saturation.colorpicker-hidden, -.colorpicker-hue.colorpicker-hidden, -.colorpicker-selectors.colorpicker-hidden { - display: none; -} -.colorpicker-inline.colorpicker-visible { - display: inline-block; -} - -/*! + */.colorpicker-saturation{width:100px;height:100px;background-image:url(../img/bootstrap-colorpicker/saturation.png);cursor:crosshair;float:left}.colorpicker-saturation i{display:block;height:5px;width:5px;border:1px solid #000;border-radius:5px;position:absolute;top:0;left:0;margin:-4px 0 0 -4px}.colorpicker-saturation i b{display:block;height:5px;width:5px;border:1px solid #fff;border-radius:5px}.colorpicker-alpha,.colorpicker-hue{width:15px;height:100px;float:left;cursor:row-resize;margin-left:4px;margin-bottom:4px}.colorpicker-alpha i,.colorpicker-hue i{display:block;height:1px;background:#000;border-top:1px solid #fff;position:absolute;top:0;left:0;width:100%;margin-top:-1px}.colorpicker-hue{background-image:url(../img/bootstrap-colorpicker/hue.png)}.colorpicker-alpha,.colorpicker-color{background-image:url(../img/bootstrap-colorpicker/alpha.png)}.colorpicker-alpha{display:none}.colorpicker:after,.colorpicker:before{content:'';display:inline-block;position:absolute}.colorpicker-alpha,.colorpicker-hue,.colorpicker-saturation{background-size:contain}.colorpicker{padding:4px;min-width:130px;margin-top:1px;border-radius:4px;z-index:2500}.colorpicker:after,.colorpicker:before{line-height:0}.colorpicker:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);top:-7px;left:6px}.colorpicker:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;top:-6px;left:7px}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px}.colorpicker-selectors i{cursor:pointer;float:left;height:10px;width:10px}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .add-on i,.colorpicker-element .input-group-addon i{display:inline-block;cursor:pointer;height:16px;vertical-align:text-top;width:16px}.colorpicker.colorpicker-inline{position:relative;display:inline-block;float:none;z-index:auto}.colorpicker.colorpicker-horizontal{width:110px;min-width:110px;height:auto}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-alpha,.colorpicker.colorpicker-horizontal .colorpicker-hue{width:100px;height:15px;float:left;cursor:col-resize;margin-left:0;margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-alpha i,.colorpicker.colorpicker-horizontal .colorpicker-hue i{display:block;height:15px;background:#fff;position:absolute;top:0;left:0;width:1px;border:none;margin-top:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url(../img/bootstrap-colorpicker/hue-horizontal.png)}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url(../img/bootstrap-colorpicker/alpha-horizontal.png)}.colorpicker-right:before{left:auto;right:6px}.colorpicker-right:after{left:auto;right:7px}.colorpicker-no-arrow:after,.colorpicker-no-arrow:before{border-right:0;border-left:0}.colorpicker-alpha.colorpicker-visible,.colorpicker-hue.colorpicker-visible,.colorpicker-saturation.colorpicker-visible,.colorpicker-selectors.colorpicker-visible,.colorpicker.colorpicker-visible{display:block}.colorpicker-alpha.colorpicker-hidden,.colorpicker-hue.colorpicker-hidden,.colorpicker-saturation.colorpicker-hidden,.colorpicker-selectors.colorpicker-hidden,.colorpicker.colorpicker-hidden{display:none}.colorpicker-inline.colorpicker-visible{display:inline-block}/*! * AdminLTE v2.3.0 * Author: Almsaeed Studio * Website: Almsaeed Studio * License: Open source - MIT * Please visit http://opensource.org/licenses/MIT for more information -!*/ -/* - * Core: General Layout Style - * ------------------------- - */ -html, -body { - min-height: 100%; -} -.layout-boxed html, -.layout-boxed body { - height: 100%; -} -body { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif; - font-weight: 400; - overflow-x: hidden; - overflow-y: auto; -} -/* Layout */ -.wrapper { - min-height: 100%; - position: static; - overflow: hidden; -} -.wrapper:before, -.wrapper:after { - content: " "; - display: table; -} -.wrapper:after { - clear: both; -} -.layout-boxed .wrapper { - max-width: 1250px; - margin: 0 auto; - min-height: 100%; - box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); - position: relative; -} -.layout-boxed { - background: url('../img/boxed-bg.jpg') repeat fixed; -} -/* - * Content Wrapper - contains the main content - * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper ``` - */ -.content-wrapper, -.right-side, -.main-footer { - transition: margin 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out; - transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out; - transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out; - margin-left: 230px; - z-index: 820; -} -.layout-top-nav .content-wrapper, -.layout-top-nav .right-side, -.layout-top-nav .main-footer { - margin-left: 0; -} -@media (max-width: 767px) { - .content-wrapper, - .right-side, - .main-footer { - margin-left: 0; - } -} -@media (min-width: 768px) { - .sidebar-collapse .content-wrapper, - .sidebar-collapse .right-side, - .sidebar-collapse .main-footer { - margin-left: 0; - } -} -@media (max-width: 767px) { - .sidebar-open .content-wrapper, - .sidebar-open .right-side, - .sidebar-open .main-footer { - -webkit-transform: translate(230px, 0); - transform: translate(230px, 0); - } -} -.content-wrapper, -.right-side { - min-height: 100%; - background-color: #ecf0f5; - z-index: 800; -} -.main-footer { - background: #fff; - padding: 15px; - color: #444; - border-top: 1px solid #d2d6de; -} -/* Fixed layout */ -.fixed .main-header, -.fixed .main-sidebar, -.fixed .left-side { - position: fixed; -} -.fixed .main-header { - top: 0; - right: 0; - left: 0; -} -.fixed .content-wrapper, -.fixed .right-side { - padding-top: 50px; -} -@media (max-width: 767px) { - .fixed .content-wrapper, - .fixed .right-side { - padding-top: 100px; - } -} -.fixed.layout-boxed .wrapper { - max-width: 100%; -} -body.hold-transition .content-wrapper, -body.hold-transition .right-side, -body.hold-transition .main-footer, -body.hold-transition .main-sidebar, -body.hold-transition .left-side, -body.hold-transition .main-header > .navbar, -body.hold-transition .main-header .logo { - /* Fix for IE */ - transition: none; -} -/* Content */ -.content { - min-height: 250px; - padding: 15px; - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; -} -/* H1 - H6 font */ -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: 'Source Sans Pro', sans-serif; -} -/* General Links */ -a { - color: #3c8dbc; -} -a:hover, -a:active, -a:focus { - outline: none; - text-decoration: none; - color: #72afd2; -} -/* Page Header */ -.page-header { - margin: 10px 0 20px 0; - font-size: 22px; -} -.page-header > small { - color: #666; - display: block; - margin-top: 5px; -} -/* - * Component: Main Header - * ---------------------- - */ -.main-header { - position: relative; - max-height: 100px; - z-index: 1030; -} -.main-header > .navbar { - transition: margin-left 0.3s ease-in-out; - margin-bottom: 0; - margin-left: 230px; - border: none; - min-height: 50px; - border-radius: 0; -} -.layout-top-nav .main-header > .navbar { - margin-left: 0; -} -.main-header #navbar-search-input.form-control { - background: rgba(255, 255, 255, 0.2); - border-color: transparent; -} -.main-header #navbar-search-input.form-control:focus, -.main-header #navbar-search-input.form-control:active { - border-color: rgba(0, 0, 0, 0.1); - background: rgba(255, 255, 255, 0.9); -} -.main-header #navbar-search-input.form-control::-moz-placeholder { - color: #ccc; - opacity: 1; -} -.main-header #navbar-search-input.form-control:-ms-input-placeholder { - color: #ccc; -} -.main-header #navbar-search-input.form-control::-webkit-input-placeholder { - color: #ccc; -} -.main-header .navbar-custom-menu, -.main-header .navbar-right { - float: right; -} -@media (max-width: 991px) { - .main-header .navbar-custom-menu a, - .main-header .navbar-right a { - color: inherit; - background: transparent; - } -} -@media (max-width: 767px) { - .main-header .navbar-right { - float: none; - } - .navbar-collapse .main-header .navbar-right { - margin: 7.5px -15px; - } - .main-header .navbar-right > li { - color: inherit; - border: 0; - } -} -.main-header .sidebar-toggle { - float: left; - background-color: transparent; - background-image: none; - padding: 15px 15px; - font-family: fontAwesome; -} -.main-header .sidebar-toggle:before { - content: "\f0c9"; -} -.main-header .sidebar-toggle:hover { - color: #fff; -} -.main-header .sidebar-toggle:focus, -.main-header .sidebar-toggle:active { - background: transparent; -} -.main-header .sidebar-toggle .icon-bar { - display: none; -} -.main-header .navbar .nav > li.user > a > .fa, -.main-header .navbar .nav > li.user > a > .glyphicon, -.main-header .navbar .nav > li.user > a > .ion { - margin-right: 5px; -} -.main-header .navbar .nav > li > a > .label { - position: absolute; - top: 9px; - right: 7px; - text-align: center; - font-size: 9px; - padding: 2px 3px; - line-height: .9; -} -.main-header .logo { - transition: width 0.3s ease-in-out; - display: block; - float: left; - height: 50px; - font-size: 20px; - line-height: 50px; - text-align: center; - width: 230px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - padding: 0 15px; - font-weight: 300; - overflow: hidden; -} -.main-header .logo .logo-lg { - display: block; -} -.main-header .logo .logo-mini { - display: none; -} -.main-header .navbar-brand { - color: #fff; -} -.content-header { - position: relative; - padding: 15px 15px 0 15px; -} -.content-header > h1 { - margin: 0; - font-size: 24px; -} -.content-header > h1 > small { - font-size: 15px; - display: inline-block; - padding-left: 4px; - font-weight: 300; -} -.content-header > .breadcrumb { - float: right; - background: transparent; - margin-top: 0; - margin-bottom: 0; - font-size: 12px; - padding: 7px 5px; - position: absolute; - top: 15px; - right: 10px; - border-radius: 2px; -} -.content-header > .breadcrumb > li > a { - color: #444; - text-decoration: none; - display: inline-block; -} -.content-header > .breadcrumb > li > a > .fa, -.content-header > .breadcrumb > li > a > .glyphicon, -.content-header > .breadcrumb > li > a > .ion { - margin-right: 5px; -} -.content-header > .breadcrumb > li + li:before { - content: '>\00a0'; -} -@media (max-width: 991px) { - .content-header > .breadcrumb { - position: relative; - margin-top: 5px; - top: 0; - right: 0; - float: none; - background: #d2d6de; - padding-left: 10px; - } - .content-header > .breadcrumb li:before { - color: #97a0b3; - } -} -.navbar-toggle { - color: #fff; - border: 0; - margin: 0; - padding: 15px 15px; -} -@media (max-width: 991px) { - .navbar-custom-menu .navbar-nav > li { - float: left; - } - .navbar-custom-menu .navbar-nav { - margin: 0; - float: left; - } - .navbar-custom-menu .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - line-height: 20px; - } -} -@media (max-width: 767px) { - .main-header { - position: relative; - } - .main-header .logo, - .main-header .navbar { - width: 100%; - float: none; - } - .main-header .navbar { - margin: 0; - } - .main-header .navbar-custom-menu { - float: right; - } -} -@media (max-width: 991px) { - .navbar-collapse.pull-left { - float: none!important; - } - .navbar-collapse.pull-left + .navbar-custom-menu { - display: block; - position: absolute; - top: 0; - right: 40px; - } -} -@media (max-width: 991px) { - .content-header { - padding-top: 110px; - } -} -@media (max-width: 991px) { - ul.sidebar-menu { - padding-top: 120px; - } -} -@media (max-width: 991px) { - .sidebar-toggle-mobile a { - color: white; - } -} -/* - * Component: Sidebar - * ------------------ - */ -.main-sidebar, -.left-side { - position: absolute; - top: 0; - left: 0; - padding-top: 50px; - min-height: 100%; - width: 230px; - z-index: 810; - transition: width 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out; - transition: transform 0.3s ease-in-out, width 0.3s ease-in-out; - transition: transform 0.3s ease-in-out, width 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out; -} -@media (max-width: 767px) { - .main-sidebar, - .left-side { - padding-top: 100px; - } -} -@media (max-width: 767px) { - .main-sidebar, - .left-side { - -webkit-transform: translate(-230px, 0); - transform: translate(-230px, 0); - } -} -@media (min-width: 768px) { - .sidebar-collapse .main-sidebar, - .sidebar-collapse .left-side { - -webkit-transform: translate(-230px, 0); - transform: translate(-230px, 0); - } -} -@media (max-width: 767px) { - .sidebar-open .main-sidebar, - .sidebar-open .left-side { - -webkit-transform: translate(0, 0); - transform: translate(0, 0); - } -} -.sidebar { - padding-bottom: 10px; -} -.sidebar-form input:focus { - border-color: transparent; -} -.user-panel { - position: relative; - width: 100%; - padding: 10px; - overflow: hidden; -} -.user-panel:before, -.user-panel:after { - content: " "; - display: table; -} -.user-panel:after { - clear: both; -} -.user-panel > .image > img { - width: 100%; - max-width: 45px; - height: auto; -} -.user-panel > .info { - padding: 5px 5px 5px 15px; - line-height: 1; - position: absolute; - left: 55px; -} -.user-panel > .info > p { - font-weight: 600; - margin-bottom: 9px; -} -.user-panel > .info > a { - text-decoration: none; - padding-right: 5px; - margin-top: 3px; - font-size: 11px; -} -.user-panel > .info > a > .fa, -.user-panel > .info > a > .ion, -.user-panel > .info > a > .glyphicon { - margin-right: 3px; -} -.sidebar-menu { - list-style: none; - margin: 0; - padding: 0; -} -.sidebar-menu > li { - position: relative; - margin: 0; - padding: 0; -} -.sidebar-menu > li > a { - padding: 12px 5px 12px 15px; - display: block; -} -.sidebar-menu > li > a > .fa, -.sidebar-menu > li > a > .glyphicon, -.sidebar-menu > li > a > .ion { - width: 20px; -} -.sidebar-menu > li .label, -.sidebar-menu > li .badge { - margin-top: 3px; - margin-right: 5px; -} -.sidebar-menu li.header { - padding: 10px 25px 10px 15px; - font-size: 12px; -} -.sidebar-menu li > a > .fa-angle-left { - width: auto; - height: auto; - padding: 0; - margin-right: 10px; - margin-top: 3px; -} -.sidebar-menu li.active > a > .fa-angle-left { - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); -} -.sidebar-menu li.active > .treeview-menu { - display: block; -} -.sidebar-menu .treeview-menu { - display: none; - list-style: none; - padding: 0; - margin: 0; - padding-left: 5px; -} -.sidebar-menu .treeview-menu .treeview-menu { - padding-left: 20px; -} -.sidebar-menu .treeview-menu > li { - margin: 0; -} -.sidebar-menu .treeview-menu > li > a { - padding: 5px 5px 5px 15px; - display: block; - font-size: 14px; -} -.sidebar-menu .treeview-menu > li > a > .fa, -.sidebar-menu .treeview-menu > li > a > .glyphicon, -.sidebar-menu .treeview-menu > li > a > .ion { - width: 20px; -} -.sidebar-menu .treeview-menu > li > a > .fa-angle-left, -.sidebar-menu .treeview-menu > li > a > .fa-angle-down { - width: auto; -} -/* - * Component: Sidebar Mini - */ -@media (min-width: 768px) { - .sidebar-mini.sidebar-collapse .content-wrapper, - .sidebar-mini.sidebar-collapse .right-side, - .sidebar-mini.sidebar-collapse .main-footer { - margin-left: 50px!important; - z-index: 840; - } - .sidebar-mini.sidebar-collapse .main-sidebar { - -webkit-transform: translate(0, 0); - transform: translate(0, 0); - width: 50px!important; - z-index: 850; - } - .sidebar-mini.sidebar-collapse .sidebar-menu > li { - position: relative; - } - .sidebar-mini.sidebar-collapse .sidebar-menu > li > a { - margin-right: 0; - } - .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span { - border-top-right-radius: 4px; - } - .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span { - border-bottom-right-radius: 4px; - } - .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { - padding-top: 5px; - padding-bottom: 5px; - border-bottom-right-radius: 4px; - } - .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right), - .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { - display: block!important; - position: absolute; - width: 180px; - left: 50px; - } - .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span { - top: 0; - margin-left: -3px; - padding: 12px 5px 12px 20px; - background-color: inherit; - } - .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { - top: 44px; - margin-left: 0; - } - .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info, - .sidebar-mini.sidebar-collapse .sidebar-form, - .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span, - .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu, - .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right, - .sidebar-mini.sidebar-collapse .sidebar-menu li.header { - display: none!important; - -webkit-transform: translateZ(0); - } - .sidebar-mini.sidebar-collapse .main-header .logo { - width: 50px; - } - .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini { - display: block; - margin-left: -15px; - margin-right: -15px; - font-size: 18px; - } - .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg { - display: none; - } - .sidebar-mini.sidebar-collapse .main-header .navbar { - margin-left: 50px; - } -} -.sidebar-menu, -.main-sidebar .user-panel, -.sidebar-menu > li.header { - white-space: nowrap; - overflow: hidden; -} -.sidebar-menu:hover { - overflow: visible; -} -.sidebar-form, -.sidebar-menu > li.header { - overflow: hidden; - text-overflow: clip; -} -.sidebar-menu li > a { - position: relative; -} -.sidebar-menu li > a > .pull-right { - position: absolute; - top: 50%; - right: 10px; - margin-top: -7px; -} -/* - * Component: Control sidebar. By default, this is the right sidebar. - */ -.control-sidebar-bg { - position: fixed; - z-index: 1000; - bottom: 0; -} -.control-sidebar-bg, -.control-sidebar { - top: 0; - right: -230px; - width: 230px; - transition: right 0.3s ease-in-out; -} -.control-sidebar { - position: absolute; - padding-top: 50px; - z-index: 1010; -} -@media (max-width: 768px) { - .control-sidebar { - padding-top: 100px; - } -} -.control-sidebar > .tab-content { - padding: 10px 15px; -} -.control-sidebar.control-sidebar-open, -.control-sidebar.control-sidebar-open + .control-sidebar-bg { - right: 0; -} -.control-sidebar-open .control-sidebar-bg, -.control-sidebar-open .control-sidebar { - right: 0; -} -@media (min-width: 768px) { - .control-sidebar-open .content-wrapper, - .control-sidebar-open .right-side, - .control-sidebar-open .main-footer { - margin-right: 230px; - } -} -.nav-tabs.control-sidebar-tabs > li:first-of-type > a, -.nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover, -.nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus { - border-left-width: 0; -} -.nav-tabs.control-sidebar-tabs > li > a { - border-radius: 0; -} -.nav-tabs.control-sidebar-tabs > li > a, -.nav-tabs.control-sidebar-tabs > li > a:hover { - border-top: none; - border-right: none; - border-left: 1px solid transparent; - border-bottom: 1px solid transparent; -} -.nav-tabs.control-sidebar-tabs > li > a .icon { - font-size: 16px; -} -.nav-tabs.control-sidebar-tabs > li.active > a, -.nav-tabs.control-sidebar-tabs > li.active > a:hover, -.nav-tabs.control-sidebar-tabs > li.active > a:focus, -.nav-tabs.control-sidebar-tabs > li.active > a:active { - border-top: none; - border-right: none; - border-bottom: none; -} -@media (max-width: 768px) { - .nav-tabs.control-sidebar-tabs { - display: table; - } - .nav-tabs.control-sidebar-tabs > li { - display: table-cell; - } -} -.control-sidebar-heading { - font-weight: 400; - font-size: 16px; - padding: 10px 0; - margin-bottom: 10px; -} -.control-sidebar-subheading { - display: block; - font-weight: 400; - font-size: 14px; -} -.control-sidebar-menu { - list-style: none; - padding: 0; - margin: 0 -15px; -} -.control-sidebar-menu > li > a { - display: block; - padding: 10px 15px; -} -.control-sidebar-menu > li > a:before, -.control-sidebar-menu > li > a:after { - content: " "; - display: table; -} -.control-sidebar-menu > li > a:after { - clear: both; -} -.control-sidebar-menu > li > a > .control-sidebar-subheading { - margin-top: 0; -} -.control-sidebar-menu .menu-icon { - float: left; - width: 35px; - height: 35px; - border-radius: 50%; - text-align: center; - line-height: 35px; -} -.control-sidebar-menu .menu-info { - margin-left: 45px; - margin-top: 3px; -} -.control-sidebar-menu .menu-info > .control-sidebar-subheading { - margin: 0; -} -.control-sidebar-menu .menu-info > p { - margin: 0; - font-size: 11px; -} -.control-sidebar-menu .progress { - margin: 0; -} -.control-sidebar-dark { - color: #b8c7ce; -} -.control-sidebar-dark, -.control-sidebar-dark + .control-sidebar-bg { - background: #222d32; -} -.control-sidebar-dark .nav-tabs.control-sidebar-tabs { - border-bottom: #1c2529; -} -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a { - background: #181f23; - color: #b8c7ce; -} -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a, -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus { - border-left-color: #141a1d; - border-bottom-color: #141a1d; -} -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus, -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active { - background: #1c2529; -} -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover { - color: #fff; -} -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a, -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover, -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus, -.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active { - background: #222d32; - color: #fff; -} -.control-sidebar-dark .control-sidebar-heading, -.control-sidebar-dark .control-sidebar-subheading { - color: #fff; -} -.control-sidebar-dark .control-sidebar-menu > li > a:hover { - background: #1e282c; -} -.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p { - color: #b8c7ce; -} -.control-sidebar-light { - color: #5e5e5e; -} -.control-sidebar-light, -.control-sidebar-light + .control-sidebar-bg { - background: #f9fafc; - border-left: 1px solid #d2d6de; -} -.control-sidebar-light .nav-tabs.control-sidebar-tabs { - border-bottom: #d2d6de; -} -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a { - background: #e8ecf4; - color: #444; -} -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a, -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus { - border-left-color: #d2d6de; - border-bottom-color: #d2d6de; -} -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus, -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active { - background: #eff1f7; -} -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a, -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover, -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus, -.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active { - background: #f9fafc; - color: #111; -} -.control-sidebar-light .control-sidebar-heading, -.control-sidebar-light .control-sidebar-subheading { - color: #111; -} -.control-sidebar-light .control-sidebar-menu { - margin-left: -14px; -} -.control-sidebar-light .control-sidebar-menu > li > a:hover { - background: #f4f4f5; -} -.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p { - color: #5e5e5e; -} -/* - * Component: Dropdown menus - * ------------------------- - */ -/*Dropdowns in general*/ -.dropdown-menu { - box-shadow: none; - border-color: #eee; -} -.dropdown-menu > li > a { - color: #777; -} -.dropdown-menu > li > a > .glyphicon, -.dropdown-menu > li > a > .fa, -.dropdown-menu > li > a > .ion { - margin-right: 10px; -} -.dropdown-menu > li > a:hover { - background-color: #e1e3e9; - color: #333; -} -.dropdown-menu > .divider { - background-color: #eee; -} -.navbar-nav > .notifications-menu > .dropdown-menu, -.navbar-nav > .messages-menu > .dropdown-menu, -.navbar-nav > .tasks-menu > .dropdown-menu { - width: 280px; - padding: 0 0 0 0; - margin: 0; - top: 100%; -} -.navbar-nav > .notifications-menu > .dropdown-menu > li, -.navbar-nav > .messages-menu > .dropdown-menu > li, -.navbar-nav > .tasks-menu > .dropdown-menu > li { - position: relative; -} -.navbar-nav > .notifications-menu > .dropdown-menu > li.header, -.navbar-nav > .messages-menu > .dropdown-menu > li.header, -.navbar-nav > .tasks-menu > .dropdown-menu > li.header { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; - background-color: #ffffff; - padding: 7px 10px; - border-bottom: 1px solid #f4f4f4; - color: #444444; - font-size: 14px; -} -.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, -.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, -.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; - font-size: 12px; - background-color: #fff; - padding: 7px 10px; - border-bottom: 1px solid #eeeeee; - color: #444!important; - text-align: center; -} -@media (max-width: 991px) { - .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, - .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, - .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { - background: #fff!important; - color: #444!important; - } -} -.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover, -.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover, -.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover { - text-decoration: none; - font-weight: normal; -} -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu, -.navbar-nav > .messages-menu > .dropdown-menu > li .menu, -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu { - max-height: 200px; - margin: 0; - padding: 0; - list-style: none; - overflow-x: hidden; -} -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a, -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a, -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { - display: block; - white-space: nowrap; - /* Prevent text from breaking */ - border-bottom: 1px solid #f4f4f4; -} -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover, -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover, -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover { - background: #f4f4f4; - text-decoration: none; -} -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a { - color: #444444; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - padding: 10px; -} -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon, -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa, -.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion { - width: 20px; -} -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a { - margin: 0; - padding: 10px 10px; -} -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img { - margin: auto 10px auto auto; - width: 40px; - height: 40px; -} -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 { - padding: 0; - margin: 0 0 0 45px; - color: #444444; - font-size: 15px; - position: relative; -} -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small { - color: #999999; - font-size: 10px; - position: absolute; - top: 0; - right: 0; -} -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p { - margin: 0 0 0 45px; - font-size: 12px; - color: #888888; -} -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before, -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { - content: " "; - display: table; -} -.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { - clear: both; -} -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { - padding: 10px; -} -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 { - font-size: 14px; - padding: 0; - margin: 0 0 10px 0; - color: #666666; -} -.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress { - padding: 0; - margin: 0; -} -.navbar-nav > .user-menu > .dropdown-menu { - border-top-right-radius: 0; - border-top-left-radius: 0; - padding: 1px 0 0 0; - border-top-width: 0; - width: 280px; -} -.navbar-nav > .user-menu > .dropdown-menu, -.navbar-nav > .user-menu > .dropdown-menu > .user-body { - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.navbar-nav > .user-menu > .dropdown-menu > li.user-header { - height: 175px; - padding: 10px; - text-align: center; -} -.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img { - z-index: 5; - height: 90px; - width: 90px; - border: 3px solid; - border-color: transparent; - border-color: rgba(255, 255, 255, 0.2); -} -.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p { - z-index: 5; - color: #fff; - color: rgba(255, 255, 255, 0.8); - font-size: 17px; - margin-top: 10px; -} -.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small { - display: block; - font-size: 12px; -} -.navbar-nav > .user-menu > .dropdown-menu > .user-body { - padding: 15px; - border-bottom: 1px solid #f4f4f4; - border-top: 1px solid #dddddd; -} -.navbar-nav > .user-menu > .dropdown-menu > .user-body:before, -.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { - content: " "; - display: table; -} -.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { - clear: both; -} -.navbar-nav > .user-menu > .dropdown-menu > .user-body a { - color: #444 !important; -} -@media (max-width: 991px) { - .navbar-nav > .user-menu > .dropdown-menu > .user-body a { - background: #fff !important; - color: #444 !important; - } -} -.navbar-nav > .user-menu > .dropdown-menu > .user-footer { - background-color: #f9f9f9; - padding: 10px; -} -.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before, -.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { - content: " "; - display: table; -} -.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { - clear: both; -} -.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default { - color: #666666; -} -@media (max-width: 991px) { - .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover { - background-color: #f9f9f9; - } -} -.navbar-nav > .user-menu .user-image { - float: left; - width: 25px; - height: 25px; - border-radius: 50%; - margin-right: 10px; - margin-top: -2px; -} -@media (max-width: 767px) { - .navbar-nav > .user-menu .user-image { - float: none; - margin-right: 0; - margin-top: -8px; - line-height: 10px; - } -} -/* Add fade animation to dropdown menus by appending - the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ -.open:not(.dropup) > .animated-dropdown-menu { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation: flipInX 0.7s both; - animation: flipInX 0.7s both; -} -@keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transition-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transition-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - } - 100% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -@-webkit-keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - -webkit-transition-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - -webkit-transition-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - } - 100% { - -webkit-transform: perspective(400px); - } -} -/* Fix dropdown menu in navbars */ -.navbar-custom-menu > .navbar-nav > li { - position: relative; -} -.navbar-custom-menu > .navbar-nav > li > .dropdown-menu { - position: absolute; - right: 0; - left: auto; -} -@media (max-width: 991px) { - .navbar-custom-menu > .navbar-nav { - float: right; - } - .navbar-custom-menu > .navbar-nav > li { - position: static; - } - .navbar-custom-menu > .navbar-nav > li > .dropdown-menu { - position: absolute; - right: 5%; - left: auto; - border: 1px solid #ddd; - background: #fff; - } -} -/* - * Component: Form - * --------------- - */ -.form-control { - border-radius: 0; - box-shadow: none; - border-color: #d2d6de; -} -.form-control:focus { - border-color: #3c8dbc; - box-shadow: none; -} -.form-control::-moz-placeholder, -.form-control:-ms-input-placeholder, -.form-control::-webkit-input-placeholder { - color: #bbb; - opacity: 1; -} -.form-control:not(select) { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} -.form-group.has-success label { - color: #00a65a; -} -.form-group.has-success .form-control { - border-color: #00a65a; - box-shadow: none; -} -.form-group.has-warning label { - color: #f39c12; -} -.form-group.has-warning .form-control { - border-color: #f39c12; - box-shadow: none; -} -.form-group.has-error label { - color: #dd4b39; -} -.form-group.has-error .form-control { - border-color: #dd4b39; - box-shadow: none; -} -/* Input group */ -.input-group .input-group-addon { - border-radius: 0; - border-color: #d2d6de; - background-color: #fff; -} -/* button groups */ -.btn-group-vertical .btn.btn-flat:first-of-type, -.btn-group-vertical .btn.btn-flat:last-of-type { - border-radius: 0; -} -.icheck > label { - padding-left: 0; -} -/* support Font Awesome icons in form-control */ -.form-control-feedback.fa { - line-height: 34px; -} -.input-lg + .form-control-feedback.fa, -.input-group-lg + .form-control-feedback.fa, -.form-group-lg .form-control + .form-control-feedback.fa { - line-height: 46px; -} -.input-sm + .form-control-feedback.fa, -.input-group-sm + .form-control-feedback.fa, -.form-group-sm .form-control + .form-control-feedback.fa { - line-height: 30px; -} -/* - * Component: Progress Bar - * ----------------------- - */ -.progress, -.progress > .progress-bar { - box-shadow: none; -} -.progress, -.progress > .progress-bar, -.progress .progress-bar, -.progress > .progress-bar .progress-bar { - border-radius: 1px; -} -/* size variation */ -.progress.sm, -.progress-sm { - height: 10px; -} -.progress.sm, -.progress-sm, -.progress.sm .progress-bar, -.progress-sm .progress-bar { - border-radius: 1px; -} -.progress.xs, -.progress-xs { - height: 7px; -} -.progress.xs, -.progress-xs, -.progress.xs .progress-bar, -.progress-xs .progress-bar { - border-radius: 1px; -} -.progress.xxs, -.progress-xxs { - height: 3px; -} -.progress.xxs, -.progress-xxs, -.progress.xxs .progress-bar, -.progress-xxs .progress-bar { - border-radius: 1px; -} -/* Vertical bars */ -.progress.vertical { - position: relative; - width: 30px; - height: 200px; - display: inline-block; - margin-right: 10px; -} -.progress.vertical > .progress-bar { - width: 100%; - position: absolute; - bottom: 0; -} -.progress.vertical.sm, -.progress.vertical.progress-sm { - width: 20px; -} -.progress.vertical.xs, -.progress.vertical.progress-xs { - width: 10px; -} -.progress.vertical.xxs, -.progress.vertical.progress-xxs { - width: 3px; -} -.progress-group .progress-text { - font-weight: 600; -} -.progress-group .progress-number { - float: right; -} -/* Remove margins from progress bars when put in a table */ -.table tr > td .progress { - margin: 0; -} -.progress-bar-light-blue, -.progress-bar-primary { - background-color: #3c8dbc; -} -.progress-striped .progress-bar-light-blue, -.progress-striped .progress-bar-primary { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-bar-green, -.progress-bar-success { - background-color: #00a65a; -} -.progress-striped .progress-bar-green, -.progress-striped .progress-bar-success { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-bar-aqua, -.progress-bar-info { - background-color: #00c0ef; -} -.progress-striped .progress-bar-aqua, -.progress-striped .progress-bar-info { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-bar-yellow, -.progress-bar-warning { - background-color: #f39c12; -} -.progress-striped .progress-bar-yellow, -.progress-striped .progress-bar-warning { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-bar-red, -.progress-bar-danger { - background-color: #dd4b39; -} -.progress-striped .progress-bar-red, -.progress-striped .progress-bar-danger { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -/* - * Component: Small Box - * -------------------- - */ -.small-box { - border-radius: 2px; - position: relative; - display: block; - margin-bottom: 20px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); -} -.small-box > .inner { - padding: 10px; -} -.small-box > .small-box-footer { - position: relative; - text-align: center; - padding: 3px 0; - color: #fff; - color: rgba(255, 255, 255, 0.8); - display: block; - z-index: 10; - background: rgba(0, 0, 0, 0.1); - text-decoration: none; -} -.small-box > .small-box-footer:hover { - color: #fff; - background: rgba(0, 0, 0, 0.15); -} -.small-box h3 { - font-size: 38px; - font-weight: bold; - margin: 0 0 10px 0; - white-space: nowrap; - padding: 0; -} -.small-box p { - font-size: 15px; -} -.small-box p > small { - display: block; - color: #f9f9f9; - font-size: 13px; - margin-top: 5px; -} -.small-box h3, -.small-box p { - z-index: 5px; -} -.small-box .icon { - transition: all 0.3s linear; - position: absolute; - top: -10px; - right: 10px; - z-index: 0; - font-size: 90px; - color: rgba(0, 0, 0, 0.15); -} -.small-box:hover { - text-decoration: none; - color: #f9f9f9; -} -.small-box:hover .icon { - font-size: 95px; -} -@media (max-width: 767px) { - .small-box { - text-align: center; - } - .small-box .icon { - display: none; - } - .small-box p { - font-size: 12px; - } -} -/* - * Component: Box - * -------------- - */ -.box { - position: relative; - border-radius: 3px; - background: #ffffff; - border-top: 3px solid #d2d6de; - margin-bottom: 20px; - width: 100%; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); -} -.box.box-primary { - border-top-color: #3c8dbc; -} -.box.box-info { - border-top-color: #00c0ef; -} -.box.box-danger { - border-top-color: #dd4b39; -} -.box.box-warning { - border-top-color: #f39c12; -} -.box.box-success { - border-top-color: #00a65a; -} -.box.box-default { - border-top-color: #d2d6de; -} -.box.collapsed-box .box-body, -.box.collapsed-box .box-footer { - display: none; -} -.box .nav-stacked > li { - border-bottom: 1px solid #f4f4f4; - margin: 0; -} -.box .nav-stacked > li:last-of-type { - border-bottom: none; -} -.box.height-control .box-body { - max-height: 300px; - overflow: auto; -} -.box .border-right { - border-right: 1px solid #f4f4f4; -} -.box .border-left { - border-left: 1px solid #f4f4f4; -} -.box.box-solid { - border-top: 0; -} -.box.box-solid > .box-header .btn.btn-default { - background: transparent; -} -.box.box-solid > .box-header .btn:hover, -.box.box-solid > .box-header a:hover { - background: rgba(0, 0, 0, 0.1); -} -.box.box-solid.box-default { - border: 1px solid #d2d6de; -} -.box.box-solid.box-default > .box-header { - color: #444; - background: #d2d6de; - background-color: #d2d6de; -} -.box.box-solid.box-default > .box-header a, -.box.box-solid.box-default > .box-header .btn { - color: #444; -} -.box.box-solid.box-primary { - border: 1px solid #3c8dbc; -} -.box.box-solid.box-primary > .box-header { - color: #fff; - background: #3c8dbc; - background-color: #3c8dbc; -} -.box.box-solid.box-primary > .box-header a, -.box.box-solid.box-primary > .box-header .btn { - color: #fff; -} -.box.box-solid.box-info { - border: 1px solid #00c0ef; -} -.box.box-solid.box-info > .box-header { - color: #fff; - background: #00c0ef; - background-color: #00c0ef; -} -.box.box-solid.box-info > .box-header a, -.box.box-solid.box-info > .box-header .btn { - color: #fff; -} -.box.box-solid.box-danger { - border: 1px solid #dd4b39; -} -.box.box-solid.box-danger > .box-header { - color: #fff; - background: #dd4b39; - background-color: #dd4b39; -} -.box.box-solid.box-danger > .box-header a, -.box.box-solid.box-danger > .box-header .btn { - color: #fff; -} -.box.box-solid.box-warning { - border: 1px solid #f39c12; -} -.box.box-solid.box-warning > .box-header { - color: #fff; - background: #f39c12; - background-color: #f39c12; -} -.box.box-solid.box-warning > .box-header a, -.box.box-solid.box-warning > .box-header .btn { - color: #fff; -} -.box.box-solid.box-success { - border: 1px solid #00a65a; -} -.box.box-solid.box-success > .box-header { - color: #fff; - background: #00a65a; - background-color: #00a65a; -} -.box.box-solid.box-success > .box-header a, -.box.box-solid.box-success > .box-header .btn { - color: #fff; -} -.box.box-solid > .box-header > .box-tools .btn { - border: 0; - box-shadow: none; -} -.box.box-solid[class*='bg'] > .box-header { - color: #fff; -} -.box .box-group > .box { - margin-bottom: 5px; -} -.box .knob-label { - text-align: center; - color: #333; - font-weight: 100; - font-size: 12px; - margin-bottom: 0.3em; -} -.box > .overlay, -.overlay-wrapper > .overlay, -.box > .loading-img, -.overlay-wrapper > .loading-img { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} -.box .overlay, -.overlay-wrapper .overlay { - z-index: 50; - background: rgba(255, 255, 255, 0.7); - border-radius: 3px; -} -.box .overlay > .fa, -.overlay-wrapper .overlay > .fa { - position: absolute; - top: 50%; - left: 50%; - margin-left: -15px; - margin-top: -15px; - color: #000; - font-size: 30px; -} -.box .overlay.dark, -.overlay-wrapper .overlay.dark { - background: rgba(0, 0, 0, 0.5); -} -.box-header:before, -.box-body:before, -.box-footer:before, -.box-header:after, -.box-body:after, -.box-footer:after { - content: " "; - display: table; -} -.box-header:after, -.box-body:after, -.box-footer:after { - clear: both; -} -.box-header { - color: #444; - display: block; - padding: 10px; - position: relative; -} -.box-header.with-border { - border-bottom: 1px solid #f4f4f4; -} -.collapsed-box .box-header.with-border { - border-bottom: none; -} -.box-header > .fa, -.box-header > .glyphicon, -.box-header > .ion, -.box-header .box-title { - display: inline-block; - font-size: 18px; - margin: 0; - line-height: 1; -} -.box-header > .fa, -.box-header > .glyphicon, -.box-header > .ion { - margin-right: 5px; -} -.box-header > .box-tools { - position: absolute; - right: 10px; - top: 5px; -} -.box-header > .box-tools [data-toggle="tooltip"] { - position: relative; -} -.box-header > .box-tools.pull-right .dropdown-menu { - right: 0; - left: auto; -} -.btn-box-tool { - padding: 5px; - font-size: 12px; - background: transparent; - color: #97a0b3; -} -.open .btn-box-tool, -.btn-box-tool:hover { - color: #606c84; -} -.btn-box-tool.btn:active { - box-shadow: none; -} -.box-body { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; - padding: 10px; -} -.no-header .box-body { - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} -.box-body > .table { - margin-bottom: 0; -} -.box-body .fc { - margin-top: 5px; -} -.box-body .full-width-chart { - margin: -19px; -} -.box-body.no-padding .full-width-chart { - margin: -9px; -} -.box-body .box-pane { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 3px; -} -.box-body .box-pane-right { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 0; -} -.box-footer { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; - border-top: 1px solid #f4f4f4; - padding: 10px; - background-color: #fff; -} -.chart-legend { - margin: 10px 0; -} -@media (max-width: 991px) { - .chart-legend > li { - float: left; - margin-right: 10px; - } -} -.box-comments { - background: #f7f7f7; -} -.box-comments .box-comment { - padding: 8px 0; - border-bottom: 1px solid #eee; -} -.box-comments .box-comment:before, -.box-comments .box-comment:after { - content: " "; - display: table; -} -.box-comments .box-comment:after { - clear: both; -} -.box-comments .box-comment:last-of-type { - border-bottom: 0; -} -.box-comments .box-comment:first-of-type { - padding-top: 0; -} -.box-comments .box-comment img { - float: left; -} -.box-comments .comment-text { - margin-left: 40px; - color: #555; -} -.box-comments .username { - color: #444; - display: block; - font-weight: 600; -} -.box-comments .text-muted { - font-weight: 400; - font-size: 12px; -} -/* Widget: TODO LIST */ -.todo-list { - margin: 0; - padding: 0; - list-style: none; - overflow: auto; -} -.todo-list > li { - border-radius: 2px; - padding: 10px; - background: #f4f4f4; - margin-bottom: 2px; - border-left: 2px solid #e6e7e8; - color: #444; -} -.todo-list > li:last-of-type { - margin-bottom: 0; -} -.todo-list > li > input[type='checkbox'] { - margin: 0 10px 0 5px; -} -.todo-list > li .text { - display: inline-block; - margin-left: 5px; - font-weight: 600; -} -.todo-list > li .label { - margin-left: 10px; - font-size: 9px; -} -.todo-list > li .tools { - display: none; - float: right; - color: #dd4b39; -} -.todo-list > li .tools > .fa, -.todo-list > li .tools > .glyphicon, -.todo-list > li .tools > .ion { - margin-right: 5px; - cursor: pointer; -} -.todo-list > li:hover .tools { - display: inline-block; -} -.todo-list > li.done { - color: #999; -} -.todo-list > li.done .text { - text-decoration: line-through; - font-weight: 500; -} -.todo-list > li.done .label { - background: #d2d6de !important; -} -.todo-list .danger { - border-left-color: #dd4b39; -} -.todo-list .warning { - border-left-color: #f39c12; -} -.todo-list .info { - border-left-color: #00c0ef; -} -.todo-list .success { - border-left-color: #00a65a; -} -.todo-list .primary { - border-left-color: #3c8dbc; -} -.todo-list .handle { - display: inline-block; - cursor: move; - margin: 0 5px; -} -/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ -.chat { - padding: 5px 20px 5px 10px; -} -.chat .item { - margin-bottom: 10px; -} -.chat .item:before, -.chat .item:after { - content: " "; - display: table; -} -.chat .item:after { - clear: both; -} -.chat .item > img { - width: 40px; - height: 40px; - border: 2px solid transparent; - border-radius: 50%; -} -.chat .item > .online { - border: 2px solid #00a65a; -} -.chat .item > .offline { - border: 2px solid #dd4b39; -} -.chat .item > .message { - margin-left: 55px; - margin-top: -40px; -} -.chat .item > .message > .name { - display: block; - font-weight: 600; -} -.chat .item > .attachment { - border-radius: 3px; - background: #f4f4f4; - margin-left: 65px; - margin-right: 15px; - padding: 10px; -} -.chat .item > .attachment > h4 { - margin: 0 0 5px 0; - font-weight: 600; - font-size: 14px; -} -.chat .item > .attachment > p, -.chat .item > .attachment > .filename { - font-weight: 600; - font-size: 13px; - font-style: italic; - margin: 0; -} -.chat .item > .attachment:before, -.chat .item > .attachment:after { - content: " "; - display: table; -} -.chat .item > .attachment:after { - clear: both; -} -.box-input { - max-width: 200px; -} -.modal .panel-body { - color: #444; -} -/* - * Component: Info Box - * ------------------- - */ -.info-box { - display: block; - min-height: 90px; - background: #fff; - width: 100%; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); - border-radius: 2px; - margin-bottom: 15px; -} -.info-box small { - font-size: 14px; -} -.info-box .progress { - background: rgba(0, 0, 0, 0.2); - margin: 5px -10px 5px -10px; - height: 2px; -} -.info-box .progress, -.info-box .progress .progress-bar { - border-radius: 0; -} -.info-box .progress .progress-bar { - background: #fff; -} -.info-box-icon { - border-top-left-radius: 2px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 2px; - display: block; - float: left; - height: 90px; - width: 90px; - text-align: center; - font-size: 45px; - line-height: 90px; - background: rgba(0, 0, 0, 0.2); -} -.info-box-icon > img { - max-width: 100%; -} -.info-box-content { - padding: 5px 10px; - margin-left: 90px; -} -.info-box-number { - display: block; - font-weight: bold; - font-size: 18px; -} -.progress-description, -.info-box-text { - display: block; - font-size: 14px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.info-box-text { - text-transform: uppercase; -} -.info-box-more { - display: block; -} -.progress-description { - margin: 0; -} -/* - * Component: Button - * ----------------- - */ -.btn { - border-radius: 3px; - box-shadow: none; - border: 1px solid transparent; -} -.btn.uppercase { - text-transform: uppercase; -} -.btn.btn-flat { - border-radius: 0; - box-shadow: none; - border-width: 1px; -} -.btn:active { - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.btn:focus { - outline: none; -} -.btn.btn-file { - position: relative; - overflow: hidden; -} -.btn.btn-file > input[type='file'] { - position: absolute; - top: 0; - right: 0; - min-width: 100%; - min-height: 100%; - font-size: 100px; - text-align: right; - opacity: 0; - filter: alpha(opacity=0); - outline: none; - background: white; - cursor: inherit; - display: block; -} -.btn-default { - background-color: #f4f4f4; - color: #444; - border-color: #ddd; -} -.btn-default:hover, -.btn-default:active, -.btn-default.hover { - background-color: #e7e7e7; -} -.btn-primary { - background-color: #3c8dbc; - border-color: #367fa9; -} -.btn-primary:hover, -.btn-primary:active, -.btn-primary.hover { - background-color: #367fa9; -} -.btn-success { - background-color: #00a65a; - border-color: #008d4c; -} -.btn-success:hover, -.btn-success:active, -.btn-success.hover { - background-color: #008d4c; -} -.btn-info { - background-color: #00c0ef; - border-color: #00acd6; -} -.btn-info:hover, -.btn-info:active, -.btn-info.hover { - background-color: #00acd6; -} -.btn-danger { - background-color: #dd4b39; - border-color: #d73925; -} -.btn-danger:hover, -.btn-danger:active, -.btn-danger.hover { - background-color: #d73925; -} -.btn-warning { - background-color: #f39c12; - border-color: #e08e0b; -} -.btn-warning:hover, -.btn-warning:active, -.btn-warning.hover { - background-color: #e08e0b; -} -.btn-outline { - border: 1px solid #fff; - background: transparent; - color: #fff; -} -.btn-outline:hover, -.btn-outline:focus, -.btn-outline:active { - color: rgba(255, 255, 255, 0.7); - border-color: rgba(255, 255, 255, 0.7); -} -.btn-link { - box-shadow: none; -} -.btn[class*='bg-']:hover { - box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); -} -.btn-app { - border-radius: 3px; - position: relative; - padding: 15px 5px; - margin: 0 0 10px 10px; - min-width: 80px; - height: 60px; - text-align: center; - color: #666; - border: 1px solid #ddd; - background-color: #f4f4f4; - font-size: 12px; -} -.btn-app > .fa, -.btn-app > .glyphicon, -.btn-app > .ion { - font-size: 20px; - display: block; -} -.btn-app:hover { - background: #f4f4f4; - color: #444; - border-color: #aaa; -} -.btn-app:active, -.btn-app:focus { - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.btn-app > .badge { - position: absolute; - top: -3px; - right: -10px; - font-size: 10px; - font-weight: 400; -} -/* - * Component: Callout - * ------------------ - */ -.callout { - border-radius: 3px; - margin: 0 0 20px 0; - padding: 15px 30px 15px 15px; - border-left: 5px solid #eee; -} -.callout a { - color: #fff; - text-decoration: underline; -} -.callout a:hover { - color: #eee; -} -.callout h4 { - margin-top: 0; - font-weight: 600; -} -.callout p:last-child { - margin-bottom: 0; -} -.callout code, -.callout .highlight { - background-color: #fff; -} -.callout.callout-danger { - border-color: #c23321; -} -.callout.callout-warning { - border-color: #c87f0a; -} -.callout.callout-info { - border-color: #0097bc; -} -.callout.callout-success { - border-color: #00733e; -} -/* - * Component: alert - * ---------------- - */ -.alert { - border-radius: 3px; -} -.alert h4 { - font-weight: 600; -} -.alert .icon { - margin-right: 10px; -} -.alert .close { - color: #000; - opacity: 0.2; - filter: alpha(opacity=20); -} -.alert .close:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} -.alert a { - color: #fff; - text-decoration: underline; -} -.alert-success { - border-color: #008d4c; -} -.alert-danger, -.alert-error { - border-color: #d73925; -} -.alert-warning { - border-color: #e08e0b; -} -.alert-info { - border-color: #00acd6; -} -/* - * Component: Nav - * -------------- - */ -.nav > li > a:hover, -.nav > li > a:active, -.nav > li > a:focus { - color: #444; - background: #f7f7f7; -} -/* NAV PILLS */ -.nav-pills > li > a { - border-radius: 0; - border-top: 3px solid transparent; - color: #444; -} -.nav-pills > li > a > .fa, -.nav-pills > li > a > .glyphicon, -.nav-pills > li > a > .ion { - margin-right: 5px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - border-top-color: #3c8dbc; -} -.nav-pills > li.active > a { - font-weight: 600; -} -/* NAV STACKED */ -.nav-stacked > li > a { - border-radius: 0; - border-top: 0; - border-left: 3px solid transparent; - color: #444; -} -.nav-stacked > li.active > a, -.nav-stacked > li.active > a:hover { - background: transparent; - color: #444; - border-top: 0; - border-left-color: #3c8dbc; -} -.nav-stacked > li.header { - border-bottom: 1px solid #ddd; - color: #777; - margin-bottom: 10px; - padding: 5px 10px; - text-transform: uppercase; -} -/* NAV TABS */ -.nav-tabs-custom { - margin-bottom: 20px; - background: #fff; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); - border-radius: 3px; -} -.nav-tabs-custom > .nav-tabs { - margin: 0; - border-bottom-color: #f4f4f4; - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} -.nav-tabs-custom > .nav-tabs > li { - border-top: 3px solid transparent; - margin-bottom: -2px; - margin-right: 5px; -} -.nav-tabs-custom > .nav-tabs > li > a { - color: #444; - border-radius: 0; -} -.nav-tabs-custom > .nav-tabs > li > a.text-muted { - color: #999; -} -.nav-tabs-custom > .nav-tabs > li > a, -.nav-tabs-custom > .nav-tabs > li > a:hover { - background: transparent; - margin: 0; -} -.nav-tabs-custom > .nav-tabs > li > a:hover { - color: #999; -} -.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover, -.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus, -.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active { - border-color: transparent; -} -.nav-tabs-custom > .nav-tabs > li.active { - border-top-color: #3c8dbc; -} -.nav-tabs-custom > .nav-tabs > li.active > a, -.nav-tabs-custom > .nav-tabs > li.active:hover > a { - background-color: #fff; - color: #444; -} -.nav-tabs-custom > .nav-tabs > li.active > a { - border-top-color: transparent; - border-left-color: #f4f4f4; - border-right-color: #f4f4f4; -} -.nav-tabs-custom > .nav-tabs > li:first-of-type { - margin-left: 0; -} -.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a { - border-left-color: transparent; -} -.nav-tabs-custom > .nav-tabs.pull-right { - float: none!important; -} -.nav-tabs-custom > .nav-tabs.pull-right > li { - float: right; -} -.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type { - margin-right: 0; -} -.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a { - border-left-width: 1px; -} -.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a { - border-left-color: #f4f4f4; - border-right-color: transparent; -} -.nav-tabs-custom > .nav-tabs > li.header { - line-height: 35px; - padding: 0 10px; - font-size: 20px; - color: #444; -} -.nav-tabs-custom > .nav-tabs > li.header > .fa, -.nav-tabs-custom > .nav-tabs > li.header > .glyphicon, -.nav-tabs-custom > .nav-tabs > li.header > .ion { - margin-right: 5px; -} -.nav-tabs-custom > .tab-content { - background: #fff; - padding: 10px; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.nav-tabs-custom .dropdown.open > a:active, -.nav-tabs-custom .dropdown.open > a:focus { - background: transparent; - color: #999; -} -/* PAGINATION */ -.pagination > li > a { - background: #fafafa; - color: #666; -} -.pagination.pagination-flat > li > a { - border-radius: 0 !important; -} -/* - * Component: Table - * ---------------- - */ -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - border-top: 1px solid #f4f4f4; -} -.table > thead > tr > th { - border-bottom: 2px solid #f4f4f4; -} -.table tr td .progress { - margin-top: 5px; -} -.table-bordered { - border: 1px solid #f4f4f4; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #f4f4f4; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table.no-border, -.table.no-border td, -.table.no-border th { - border: 0; -} -/* .text-center in tables */ -table.text-center, -table.text-center td, -table.text-center th { - text-align: center; -} -.table.align th { - text-align: left; -} -.table.align td { - text-align: right; -} -/* - * Component: Label - * ---------------- - */ -.label-default { - background-color: #d2d6de; - color: #444; -} -/* - * Component: Direct Chat - * ---------------------- - */ -.direct-chat .box-body { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; - position: relative; - overflow-x: hidden; - padding: 0; -} -.direct-chat.chat-pane-open .direct-chat-contacts { - -webkit-transform: translate(0, 0); - transform: translate(0, 0); -} -.direct-chat-messages { - -webkit-transform: translate(0, 0); - transform: translate(0, 0); - padding: 10px; - height: 250px; - overflow: auto; -} -.direct-chat-msg, -.direct-chat-text { - display: block; -} -.direct-chat-msg { - margin-bottom: 10px; -} -.direct-chat-msg:before, -.direct-chat-msg:after { - content: " "; - display: table; -} -.direct-chat-msg:after { - clear: both; -} -.direct-chat-messages, -.direct-chat-contacts { - transition: -webkit-transform 0.5s ease-in-out; - transition: transform 0.5s ease-in-out; - transition: transform 0.5s ease-in-out, -webkit-transform 0.5s ease-in-out; -} -.direct-chat-text { - border-radius: 5px; - position: relative; - padding: 5px 10px; - background: #d2d6de; - border: 1px solid #d2d6de; - margin: 5px 0 0 50px; - color: #444; -} -.direct-chat-text:after, -.direct-chat-text:before { - position: absolute; - right: 100%; - top: 15px; - border: solid transparent; - border-right-color: #d2d6de; - content: ' '; - height: 0; - width: 0; - pointer-events: none; -} -.direct-chat-text:after { - border-width: 5px; - margin-top: -5px; -} -.direct-chat-text:before { - border-width: 6px; - margin-top: -6px; -} -.right .direct-chat-text { - margin-right: 50px; - margin-left: 0; -} -.right .direct-chat-text:after, -.right .direct-chat-text:before { - right: auto; - left: 100%; - border-right-color: transparent; - border-left-color: #d2d6de; -} -.direct-chat-img { - border-radius: 50%; - float: left; - width: 40px; - height: 40px; -} -.right .direct-chat-img { - float: right; -} -.direct-chat-info { - display: block; - margin-bottom: 2px; - font-size: 12px; -} -.direct-chat-name { - font-weight: 600; -} -.direct-chat-timestamp { - color: #999; -} -.direct-chat-contacts-open .direct-chat-contacts { - -webkit-transform: translate(0, 0); - transform: translate(0, 0); -} -.direct-chat-contacts { - -webkit-transform: translate(101%, 0); - transform: translate(101%, 0); - position: absolute; - top: 0; - bottom: 0; - height: 250px; - width: 100%; - background: #222d32; - color: #fff; - overflow: auto; -} -.contacts-list > li { - border-bottom: 1px solid rgba(0, 0, 0, 0.2); - padding: 10px; - margin: 0; -} -.contacts-list > li:before, -.contacts-list > li:after { - content: " "; - display: table; -} -.contacts-list > li:after { - clear: both; -} -.contacts-list > li:last-of-type { - border-bottom: none; -} -.contacts-list-img { - border-radius: 50%; - width: 40px; - float: left; -} -.contacts-list-info { - margin-left: 45px; - color: #fff; -} -.contacts-list-name, -.contacts-list-status { - display: block; -} -.contacts-list-name { - font-weight: 600; -} -.contacts-list-status { - font-size: 12px; -} -.contacts-list-date { - color: #aaa; - font-weight: normal; -} -.contacts-list-msg { - color: #999; -} -.direct-chat-danger .right > .direct-chat-text { - background: #dd4b39; - border-color: #dd4b39; - color: #fff; -} -.direct-chat-danger .right > .direct-chat-text:after, -.direct-chat-danger .right > .direct-chat-text:before { - border-left-color: #dd4b39; -} -.direct-chat-primary .right > .direct-chat-text { - background: #3c8dbc; - border-color: #3c8dbc; - color: #fff; -} -.direct-chat-primary .right > .direct-chat-text:after, -.direct-chat-primary .right > .direct-chat-text:before { - border-left-color: #3c8dbc; -} -.direct-chat-warning .right > .direct-chat-text { - background: #f39c12; - border-color: #f39c12; - color: #fff; -} -.direct-chat-warning .right > .direct-chat-text:after, -.direct-chat-warning .right > .direct-chat-text:before { - border-left-color: #f39c12; -} -.direct-chat-info .right > .direct-chat-text { - background: #00c0ef; - border-color: #00c0ef; - color: #fff; -} -.direct-chat-info .right > .direct-chat-text:after, -.direct-chat-info .right > .direct-chat-text:before { - border-left-color: #00c0ef; -} -.direct-chat-success .right > .direct-chat-text { - background: #00a65a; - border-color: #00a65a; - color: #fff; -} -.direct-chat-success .right > .direct-chat-text:after, -.direct-chat-success .right > .direct-chat-text:before { - border-left-color: #00a65a; -} -/* - * Component: Users List - * --------------------- - */ -.users-list > li { - width: 25%; - float: left; - padding: 10px; - text-align: center; -} -.users-list > li img { - border-radius: 50%; - max-width: 100%; - height: auto; -} -.users-list > li > a:hover, -.users-list > li > a:hover .users-list-name { - color: #999; -} -.users-list-name, -.users-list-date { - display: block; -} -.users-list-name { - font-weight: 600; - color: #444; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.users-list-date { - color: #999; - font-size: 12px; -} -/* - * Component: modal - * ---------------- - */ -.modal { - background: rgba(0, 0, 0, 0.3); -} -.modal-content { - border-radius: 0; - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); - border: 0; -} -@media (min-width: 768px) { - .modal-content { - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); - } -} -.modal-header { - border-bottom-color: #f4f4f4; -} -.modal-footer { - border-top-color: #f4f4f4; -} -.modal-primary .modal-header, -.modal-primary .modal-footer { - border-color: #307095; -} -.modal-warning .modal-header, -.modal-warning .modal-footer { - border-color: #c87f0a; -} -.modal-info .modal-header, -.modal-info .modal-footer { - border-color: #0097bc; -} -.modal-success .modal-header, -.modal-success .modal-footer { - border-color: #00733e; -} -.modal-danger .modal-header, -.modal-danger .modal-footer { - border-color: #c23321; -} -/* - * Page: Login & Register - * ---------------------- - */ -.login-logo, -.register-logo { - font-size: 35px; - text-align: center; - margin-bottom: 25px; - font-weight: 300; -} -.login-logo a, -.register-logo a { - color: #444; -} -.login-page, -.register-page { - background: #d2d6de; -} -.login-box, -.register-box { - width: 360px; - margin: 7% auto; -} -@media (max-width: 768px) { - .login-box, - .register-box { - width: 90%; - margin-top: 20px; - } -} -.login-box-body, -.register-box-body { - background: #fff; - padding: 20px; - border-top: 0; - color: #666; -} -.login-box-body .form-control-feedback, -.register-box-body .form-control-feedback { - color: #777; -} -.login-box-msg, -.register-box-msg { - margin: 0; - text-align: center; - padding: 0 20px 20px 20px; -} -.social-auth-links { - margin: 10px 0; -} -/* - * Page: 400 and 500 error pages - * ------------------------------ - */ -.error-page { - width: 600px; - margin: 20px auto 0 auto; -} -@media (max-width: 991px) { - .error-page { - width: 100%; - } -} -.error-page > .headline { - float: left; - font-size: 100px; - font-weight: 300; -} -@media (max-width: 991px) { - .error-page > .headline { - float: none; - text-align: center; - } -} -.error-page > .error-content { - margin-left: 190px; - display: block; -} -@media (max-width: 991px) { - .error-page > .error-content { - margin-left: 0; - } -} -.error-page > .error-content > h3 { - font-weight: 300; - font-size: 25px; -} -@media (max-width: 991px) { - .error-page > .error-content > h3 { - text-align: center; - } -} -/* - * Social Buttons for Bootstrap - * - * Copyright 2013-2015 Panayiotis Lipiridis - * Licensed under the MIT License - * - * https://github.com/lipis/bootstrap-social - */ -.btn-social { - position: relative; - padding-left: 44px; - text-align: left; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.btn-social > :first-child { - position: absolute; - left: 0; - top: 0; - bottom: 0; - width: 32px; - line-height: 34px; - font-size: 1.6em; - text-align: center; - border-right: 1px solid rgba(0, 0, 0, 0.2); -} -.btn-social.btn-lg { - padding-left: 61px; -} -.btn-social.btn-lg > :first-child { - line-height: 45px; - width: 45px; - font-size: 1.8em; -} -.btn-social.btn-sm { - padding-left: 38px; -} -.btn-social.btn-sm > :first-child { - line-height: 28px; - width: 28px; - font-size: 1.4em; -} -.btn-social.btn-xs { - padding-left: 30px; -} -.btn-social.btn-xs > :first-child { - line-height: 20px; - width: 20px; - font-size: 1.2em; -} -.btn-social-icon { - position: relative; - padding-left: 44px; - text-align: left; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - height: 34px; - width: 34px; - padding: 0; -} -.btn-social-icon > :first-child { - position: absolute; - left: 0; - top: 0; - bottom: 0; - width: 32px; - line-height: 34px; - font-size: 1.6em; - text-align: center; - border-right: 1px solid rgba(0, 0, 0, 0.2); -} -.btn-social-icon.btn-lg { - padding-left: 61px; -} -.btn-social-icon.btn-lg > :first-child { - line-height: 45px; - width: 45px; - font-size: 1.8em; -} -.btn-social-icon.btn-sm { - padding-left: 38px; -} -.btn-social-icon.btn-sm > :first-child { - line-height: 28px; - width: 28px; - font-size: 1.4em; -} -.btn-social-icon.btn-xs { - padding-left: 30px; -} -.btn-social-icon.btn-xs > :first-child { - line-height: 20px; - width: 20px; - font-size: 1.2em; -} -.btn-social-icon > :first-child { - border: none; - text-align: center; - width: 100%; -} -.btn-social-icon.btn-lg { - height: 45px; - width: 45px; - padding-left: 0; - padding-right: 0; -} -.btn-social-icon.btn-sm { - height: 30px; - width: 30px; - padding-left: 0; - padding-right: 0; -} -.btn-social-icon.btn-xs { - height: 22px; - width: 22px; - padding-left: 0; - padding-right: 0; -} -.btn-adn { - color: #fff; - background-color: #d87a68; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-adn:hover, -.btn-adn:focus, -.btn-adn.focus, -.btn-adn:active, -.btn-adn.active, -.open > .dropdown-toggle.btn-adn { - color: #fff; - background-color: #ce563f; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-adn:active, -.btn-adn.active, -.open > .dropdown-toggle.btn-adn { - background-image: none; -} -.btn-adn.disabled, -.btn-adn[disabled], -fieldset[disabled] .btn-adn, -.btn-adn.disabled:hover, -.btn-adn[disabled]:hover, -fieldset[disabled] .btn-adn:hover, -.btn-adn.disabled:focus, -.btn-adn[disabled]:focus, -fieldset[disabled] .btn-adn:focus, -.btn-adn.disabled.focus, -.btn-adn[disabled].focus, -fieldset[disabled] .btn-adn.focus, -.btn-adn.disabled:active, -.btn-adn[disabled]:active, -fieldset[disabled] .btn-adn:active, -.btn-adn.disabled.active, -.btn-adn[disabled].active, -fieldset[disabled] .btn-adn.active { - background-color: #d87a68; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-adn .badge { - color: #d87a68; - background-color: #fff; -} -.btn-bitbucket { - color: #fff; - background-color: #205081; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-bitbucket:hover, -.btn-bitbucket:focus, -.btn-bitbucket.focus, -.btn-bitbucket:active, -.btn-bitbucket.active, -.open > .dropdown-toggle.btn-bitbucket { - color: #fff; - background-color: #163758; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-bitbucket:active, -.btn-bitbucket.active, -.open > .dropdown-toggle.btn-bitbucket { - background-image: none; -} -.btn-bitbucket.disabled, -.btn-bitbucket[disabled], -fieldset[disabled] .btn-bitbucket, -.btn-bitbucket.disabled:hover, -.btn-bitbucket[disabled]:hover, -fieldset[disabled] .btn-bitbucket:hover, -.btn-bitbucket.disabled:focus, -.btn-bitbucket[disabled]:focus, -fieldset[disabled] .btn-bitbucket:focus, -.btn-bitbucket.disabled.focus, -.btn-bitbucket[disabled].focus, -fieldset[disabled] .btn-bitbucket.focus, -.btn-bitbucket.disabled:active, -.btn-bitbucket[disabled]:active, -fieldset[disabled] .btn-bitbucket:active, -.btn-bitbucket.disabled.active, -.btn-bitbucket[disabled].active, -fieldset[disabled] .btn-bitbucket.active { - background-color: #205081; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-bitbucket .badge { - color: #205081; - background-color: #fff; -} -.btn-dropbox { - color: #fff; - background-color: #1087dd; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-dropbox:hover, -.btn-dropbox:focus, -.btn-dropbox.focus, -.btn-dropbox:active, -.btn-dropbox.active, -.open > .dropdown-toggle.btn-dropbox { - color: #fff; - background-color: #0d6aad; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-dropbox:active, -.btn-dropbox.active, -.open > .dropdown-toggle.btn-dropbox { - background-image: none; -} -.btn-dropbox.disabled, -.btn-dropbox[disabled], -fieldset[disabled] .btn-dropbox, -.btn-dropbox.disabled:hover, -.btn-dropbox[disabled]:hover, -fieldset[disabled] .btn-dropbox:hover, -.btn-dropbox.disabled:focus, -.btn-dropbox[disabled]:focus, -fieldset[disabled] .btn-dropbox:focus, -.btn-dropbox.disabled.focus, -.btn-dropbox[disabled].focus, -fieldset[disabled] .btn-dropbox.focus, -.btn-dropbox.disabled:active, -.btn-dropbox[disabled]:active, -fieldset[disabled] .btn-dropbox:active, -.btn-dropbox.disabled.active, -.btn-dropbox[disabled].active, -fieldset[disabled] .btn-dropbox.active { - background-color: #1087dd; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-dropbox .badge { - color: #1087dd; - background-color: #fff; -} -.btn-facebook { - color: #fff; - background-color: #3b5998; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-facebook:hover, -.btn-facebook:focus, -.btn-facebook.focus, -.btn-facebook:active, -.btn-facebook.active, -.open > .dropdown-toggle.btn-facebook { - color: #fff; - background-color: #2d4373; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-facebook:active, -.btn-facebook.active, -.open > .dropdown-toggle.btn-facebook { - background-image: none; -} -.btn-facebook.disabled, -.btn-facebook[disabled], -fieldset[disabled] .btn-facebook, -.btn-facebook.disabled:hover, -.btn-facebook[disabled]:hover, -fieldset[disabled] .btn-facebook:hover, -.btn-facebook.disabled:focus, -.btn-facebook[disabled]:focus, -fieldset[disabled] .btn-facebook:focus, -.btn-facebook.disabled.focus, -.btn-facebook[disabled].focus, -fieldset[disabled] .btn-facebook.focus, -.btn-facebook.disabled:active, -.btn-facebook[disabled]:active, -fieldset[disabled] .btn-facebook:active, -.btn-facebook.disabled.active, -.btn-facebook[disabled].active, -fieldset[disabled] .btn-facebook.active { - background-color: #3b5998; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-facebook .badge { - color: #3b5998; - background-color: #fff; -} -.btn-flickr { - color: #fff; - background-color: #ff0084; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-flickr:hover, -.btn-flickr:focus, -.btn-flickr.focus, -.btn-flickr:active, -.btn-flickr.active, -.open > .dropdown-toggle.btn-flickr { - color: #fff; - background-color: #cc006a; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-flickr:active, -.btn-flickr.active, -.open > .dropdown-toggle.btn-flickr { - background-image: none; -} -.btn-flickr.disabled, -.btn-flickr[disabled], -fieldset[disabled] .btn-flickr, -.btn-flickr.disabled:hover, -.btn-flickr[disabled]:hover, -fieldset[disabled] .btn-flickr:hover, -.btn-flickr.disabled:focus, -.btn-flickr[disabled]:focus, -fieldset[disabled] .btn-flickr:focus, -.btn-flickr.disabled.focus, -.btn-flickr[disabled].focus, -fieldset[disabled] .btn-flickr.focus, -.btn-flickr.disabled:active, -.btn-flickr[disabled]:active, -fieldset[disabled] .btn-flickr:active, -.btn-flickr.disabled.active, -.btn-flickr[disabled].active, -fieldset[disabled] .btn-flickr.active { - background-color: #ff0084; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-flickr .badge { - color: #ff0084; - background-color: #fff; -} -.btn-foursquare { - color: #fff; - background-color: #f94877; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-foursquare:hover, -.btn-foursquare:focus, -.btn-foursquare.focus, -.btn-foursquare:active, -.btn-foursquare.active, -.open > .dropdown-toggle.btn-foursquare { - color: #fff; - background-color: #f71752; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-foursquare:active, -.btn-foursquare.active, -.open > .dropdown-toggle.btn-foursquare { - background-image: none; -} -.btn-foursquare.disabled, -.btn-foursquare[disabled], -fieldset[disabled] .btn-foursquare, -.btn-foursquare.disabled:hover, -.btn-foursquare[disabled]:hover, -fieldset[disabled] .btn-foursquare:hover, -.btn-foursquare.disabled:focus, -.btn-foursquare[disabled]:focus, -fieldset[disabled] .btn-foursquare:focus, -.btn-foursquare.disabled.focus, -.btn-foursquare[disabled].focus, -fieldset[disabled] .btn-foursquare.focus, -.btn-foursquare.disabled:active, -.btn-foursquare[disabled]:active, -fieldset[disabled] .btn-foursquare:active, -.btn-foursquare.disabled.active, -.btn-foursquare[disabled].active, -fieldset[disabled] .btn-foursquare.active { - background-color: #f94877; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-foursquare .badge { - color: #f94877; - background-color: #fff; -} -.btn-github { - color: #fff; - background-color: #444444; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-github:hover, -.btn-github:focus, -.btn-github.focus, -.btn-github:active, -.btn-github.active, -.open > .dropdown-toggle.btn-github { - color: #fff; - background-color: #2b2b2b; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-github:active, -.btn-github.active, -.open > .dropdown-toggle.btn-github { - background-image: none; -} -.btn-github.disabled, -.btn-github[disabled], -fieldset[disabled] .btn-github, -.btn-github.disabled:hover, -.btn-github[disabled]:hover, -fieldset[disabled] .btn-github:hover, -.btn-github.disabled:focus, -.btn-github[disabled]:focus, -fieldset[disabled] .btn-github:focus, -.btn-github.disabled.focus, -.btn-github[disabled].focus, -fieldset[disabled] .btn-github.focus, -.btn-github.disabled:active, -.btn-github[disabled]:active, -fieldset[disabled] .btn-github:active, -.btn-github.disabled.active, -.btn-github[disabled].active, -fieldset[disabled] .btn-github.active { - background-color: #444444; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-github .badge { - color: #444444; - background-color: #fff; -} -.btn-google { - color: #fff; - background-color: #dd4b39; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-google:hover, -.btn-google:focus, -.btn-google.focus, -.btn-google:active, -.btn-google.active, -.open > .dropdown-toggle.btn-google { - color: #fff; - background-color: #c23321; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-google:active, -.btn-google.active, -.open > .dropdown-toggle.btn-google { - background-image: none; -} -.btn-google.disabled, -.btn-google[disabled], -fieldset[disabled] .btn-google, -.btn-google.disabled:hover, -.btn-google[disabled]:hover, -fieldset[disabled] .btn-google:hover, -.btn-google.disabled:focus, -.btn-google[disabled]:focus, -fieldset[disabled] .btn-google:focus, -.btn-google.disabled.focus, -.btn-google[disabled].focus, -fieldset[disabled] .btn-google.focus, -.btn-google.disabled:active, -.btn-google[disabled]:active, -fieldset[disabled] .btn-google:active, -.btn-google.disabled.active, -.btn-google[disabled].active, -fieldset[disabled] .btn-google.active { - background-color: #dd4b39; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-google .badge { - color: #dd4b39; - background-color: #fff; -} -.btn-instagram { - color: #fff; - background-color: #3f729b; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-instagram:hover, -.btn-instagram:focus, -.btn-instagram.focus, -.btn-instagram:active, -.btn-instagram.active, -.open > .dropdown-toggle.btn-instagram { - color: #fff; - background-color: #305777; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-instagram:active, -.btn-instagram.active, -.open > .dropdown-toggle.btn-instagram { - background-image: none; -} -.btn-instagram.disabled, -.btn-instagram[disabled], -fieldset[disabled] .btn-instagram, -.btn-instagram.disabled:hover, -.btn-instagram[disabled]:hover, -fieldset[disabled] .btn-instagram:hover, -.btn-instagram.disabled:focus, -.btn-instagram[disabled]:focus, -fieldset[disabled] .btn-instagram:focus, -.btn-instagram.disabled.focus, -.btn-instagram[disabled].focus, -fieldset[disabled] .btn-instagram.focus, -.btn-instagram.disabled:active, -.btn-instagram[disabled]:active, -fieldset[disabled] .btn-instagram:active, -.btn-instagram.disabled.active, -.btn-instagram[disabled].active, -fieldset[disabled] .btn-instagram.active { - background-color: #3f729b; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-instagram .badge { - color: #3f729b; - background-color: #fff; -} -.btn-linkedin { - color: #fff; - background-color: #007bb6; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-linkedin:hover, -.btn-linkedin:focus, -.btn-linkedin.focus, -.btn-linkedin:active, -.btn-linkedin.active, -.open > .dropdown-toggle.btn-linkedin { - color: #fff; - background-color: #005983; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-linkedin:active, -.btn-linkedin.active, -.open > .dropdown-toggle.btn-linkedin { - background-image: none; -} -.btn-linkedin.disabled, -.btn-linkedin[disabled], -fieldset[disabled] .btn-linkedin, -.btn-linkedin.disabled:hover, -.btn-linkedin[disabled]:hover, -fieldset[disabled] .btn-linkedin:hover, -.btn-linkedin.disabled:focus, -.btn-linkedin[disabled]:focus, -fieldset[disabled] .btn-linkedin:focus, -.btn-linkedin.disabled.focus, -.btn-linkedin[disabled].focus, -fieldset[disabled] .btn-linkedin.focus, -.btn-linkedin.disabled:active, -.btn-linkedin[disabled]:active, -fieldset[disabled] .btn-linkedin:active, -.btn-linkedin.disabled.active, -.btn-linkedin[disabled].active, -fieldset[disabled] .btn-linkedin.active { - background-color: #007bb6; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-linkedin .badge { - color: #007bb6; - background-color: #fff; -} -.btn-microsoft { - color: #fff; - background-color: #2672ec; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-microsoft:hover, -.btn-microsoft:focus, -.btn-microsoft.focus, -.btn-microsoft:active, -.btn-microsoft.active, -.open > .dropdown-toggle.btn-microsoft { - color: #fff; - background-color: #125acd; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-microsoft:active, -.btn-microsoft.active, -.open > .dropdown-toggle.btn-microsoft { - background-image: none; -} -.btn-microsoft.disabled, -.btn-microsoft[disabled], -fieldset[disabled] .btn-microsoft, -.btn-microsoft.disabled:hover, -.btn-microsoft[disabled]:hover, -fieldset[disabled] .btn-microsoft:hover, -.btn-microsoft.disabled:focus, -.btn-microsoft[disabled]:focus, -fieldset[disabled] .btn-microsoft:focus, -.btn-microsoft.disabled.focus, -.btn-microsoft[disabled].focus, -fieldset[disabled] .btn-microsoft.focus, -.btn-microsoft.disabled:active, -.btn-microsoft[disabled]:active, -fieldset[disabled] .btn-microsoft:active, -.btn-microsoft.disabled.active, -.btn-microsoft[disabled].active, -fieldset[disabled] .btn-microsoft.active { - background-color: #2672ec; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-microsoft .badge { - color: #2672ec; - background-color: #fff; -} -.btn-openid { - color: #fff; - background-color: #f7931e; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-openid:hover, -.btn-openid:focus, -.btn-openid.focus, -.btn-openid:active, -.btn-openid.active, -.open > .dropdown-toggle.btn-openid { - color: #fff; - background-color: #da7908; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-openid:active, -.btn-openid.active, -.open > .dropdown-toggle.btn-openid { - background-image: none; -} -.btn-openid.disabled, -.btn-openid[disabled], -fieldset[disabled] .btn-openid, -.btn-openid.disabled:hover, -.btn-openid[disabled]:hover, -fieldset[disabled] .btn-openid:hover, -.btn-openid.disabled:focus, -.btn-openid[disabled]:focus, -fieldset[disabled] .btn-openid:focus, -.btn-openid.disabled.focus, -.btn-openid[disabled].focus, -fieldset[disabled] .btn-openid.focus, -.btn-openid.disabled:active, -.btn-openid[disabled]:active, -fieldset[disabled] .btn-openid:active, -.btn-openid.disabled.active, -.btn-openid[disabled].active, -fieldset[disabled] .btn-openid.active { - background-color: #f7931e; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-openid .badge { - color: #f7931e; - background-color: #fff; -} -.btn-pinterest { - color: #fff; - background-color: #cb2027; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-pinterest:hover, -.btn-pinterest:focus, -.btn-pinterest.focus, -.btn-pinterest:active, -.btn-pinterest.active, -.open > .dropdown-toggle.btn-pinterest { - color: #fff; - background-color: #9f191f; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-pinterest:active, -.btn-pinterest.active, -.open > .dropdown-toggle.btn-pinterest { - background-image: none; -} -.btn-pinterest.disabled, -.btn-pinterest[disabled], -fieldset[disabled] .btn-pinterest, -.btn-pinterest.disabled:hover, -.btn-pinterest[disabled]:hover, -fieldset[disabled] .btn-pinterest:hover, -.btn-pinterest.disabled:focus, -.btn-pinterest[disabled]:focus, -fieldset[disabled] .btn-pinterest:focus, -.btn-pinterest.disabled.focus, -.btn-pinterest[disabled].focus, -fieldset[disabled] .btn-pinterest.focus, -.btn-pinterest.disabled:active, -.btn-pinterest[disabled]:active, -fieldset[disabled] .btn-pinterest:active, -.btn-pinterest.disabled.active, -.btn-pinterest[disabled].active, -fieldset[disabled] .btn-pinterest.active { - background-color: #cb2027; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-pinterest .badge { - color: #cb2027; - background-color: #fff; -} -.btn-reddit { - color: #000; - background-color: #eff7ff; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-reddit:hover, -.btn-reddit:focus, -.btn-reddit.focus, -.btn-reddit:active, -.btn-reddit.active, -.open > .dropdown-toggle.btn-reddit { - color: #000; - background-color: #bcddff; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-reddit:active, -.btn-reddit.active, -.open > .dropdown-toggle.btn-reddit { - background-image: none; -} -.btn-reddit.disabled, -.btn-reddit[disabled], -fieldset[disabled] .btn-reddit, -.btn-reddit.disabled:hover, -.btn-reddit[disabled]:hover, -fieldset[disabled] .btn-reddit:hover, -.btn-reddit.disabled:focus, -.btn-reddit[disabled]:focus, -fieldset[disabled] .btn-reddit:focus, -.btn-reddit.disabled.focus, -.btn-reddit[disabled].focus, -fieldset[disabled] .btn-reddit.focus, -.btn-reddit.disabled:active, -.btn-reddit[disabled]:active, -fieldset[disabled] .btn-reddit:active, -.btn-reddit.disabled.active, -.btn-reddit[disabled].active, -fieldset[disabled] .btn-reddit.active { - background-color: #eff7ff; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-reddit .badge { - color: #eff7ff; - background-color: #000; -} -.btn-soundcloud { - color: #fff; - background-color: #ff5500; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-soundcloud:hover, -.btn-soundcloud:focus, -.btn-soundcloud.focus, -.btn-soundcloud:active, -.btn-soundcloud.active, -.open > .dropdown-toggle.btn-soundcloud { - color: #fff; - background-color: #cc4400; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-soundcloud:active, -.btn-soundcloud.active, -.open > .dropdown-toggle.btn-soundcloud { - background-image: none; -} -.btn-soundcloud.disabled, -.btn-soundcloud[disabled], -fieldset[disabled] .btn-soundcloud, -.btn-soundcloud.disabled:hover, -.btn-soundcloud[disabled]:hover, -fieldset[disabled] .btn-soundcloud:hover, -.btn-soundcloud.disabled:focus, -.btn-soundcloud[disabled]:focus, -fieldset[disabled] .btn-soundcloud:focus, -.btn-soundcloud.disabled.focus, -.btn-soundcloud[disabled].focus, -fieldset[disabled] .btn-soundcloud.focus, -.btn-soundcloud.disabled:active, -.btn-soundcloud[disabled]:active, -fieldset[disabled] .btn-soundcloud:active, -.btn-soundcloud.disabled.active, -.btn-soundcloud[disabled].active, -fieldset[disabled] .btn-soundcloud.active { - background-color: #ff5500; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-soundcloud .badge { - color: #ff5500; - background-color: #fff; -} -.btn-tumblr { - color: #fff; - background-color: #2c4762; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-tumblr:hover, -.btn-tumblr:focus, -.btn-tumblr.focus, -.btn-tumblr:active, -.btn-tumblr.active, -.open > .dropdown-toggle.btn-tumblr { - color: #fff; - background-color: #1c2d3f; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-tumblr:active, -.btn-tumblr.active, -.open > .dropdown-toggle.btn-tumblr { - background-image: none; -} -.btn-tumblr.disabled, -.btn-tumblr[disabled], -fieldset[disabled] .btn-tumblr, -.btn-tumblr.disabled:hover, -.btn-tumblr[disabled]:hover, -fieldset[disabled] .btn-tumblr:hover, -.btn-tumblr.disabled:focus, -.btn-tumblr[disabled]:focus, -fieldset[disabled] .btn-tumblr:focus, -.btn-tumblr.disabled.focus, -.btn-tumblr[disabled].focus, -fieldset[disabled] .btn-tumblr.focus, -.btn-tumblr.disabled:active, -.btn-tumblr[disabled]:active, -fieldset[disabled] .btn-tumblr:active, -.btn-tumblr.disabled.active, -.btn-tumblr[disabled].active, -fieldset[disabled] .btn-tumblr.active { - background-color: #2c4762; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-tumblr .badge { - color: #2c4762; - background-color: #fff; -} -.btn-twitter { - color: #fff; - background-color: #55acee; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-twitter:hover, -.btn-twitter:focus, -.btn-twitter.focus, -.btn-twitter:active, -.btn-twitter.active, -.open > .dropdown-toggle.btn-twitter { - color: #fff; - background-color: #2795e9; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-twitter:active, -.btn-twitter.active, -.open > .dropdown-toggle.btn-twitter { - background-image: none; -} -.btn-twitter.disabled, -.btn-twitter[disabled], -fieldset[disabled] .btn-twitter, -.btn-twitter.disabled:hover, -.btn-twitter[disabled]:hover, -fieldset[disabled] .btn-twitter:hover, -.btn-twitter.disabled:focus, -.btn-twitter[disabled]:focus, -fieldset[disabled] .btn-twitter:focus, -.btn-twitter.disabled.focus, -.btn-twitter[disabled].focus, -fieldset[disabled] .btn-twitter.focus, -.btn-twitter.disabled:active, -.btn-twitter[disabled]:active, -fieldset[disabled] .btn-twitter:active, -.btn-twitter.disabled.active, -.btn-twitter[disabled].active, -fieldset[disabled] .btn-twitter.active { - background-color: #55acee; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-twitter .badge { - color: #55acee; - background-color: #fff; -} -.btn-vimeo { - color: #fff; - background-color: #1ab7ea; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-vimeo:hover, -.btn-vimeo:focus, -.btn-vimeo.focus, -.btn-vimeo:active, -.btn-vimeo.active, -.open > .dropdown-toggle.btn-vimeo { - color: #fff; - background-color: #1295bf; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-vimeo:active, -.btn-vimeo.active, -.open > .dropdown-toggle.btn-vimeo { - background-image: none; -} -.btn-vimeo.disabled, -.btn-vimeo[disabled], -fieldset[disabled] .btn-vimeo, -.btn-vimeo.disabled:hover, -.btn-vimeo[disabled]:hover, -fieldset[disabled] .btn-vimeo:hover, -.btn-vimeo.disabled:focus, -.btn-vimeo[disabled]:focus, -fieldset[disabled] .btn-vimeo:focus, -.btn-vimeo.disabled.focus, -.btn-vimeo[disabled].focus, -fieldset[disabled] .btn-vimeo.focus, -.btn-vimeo.disabled:active, -.btn-vimeo[disabled]:active, -fieldset[disabled] .btn-vimeo:active, -.btn-vimeo.disabled.active, -.btn-vimeo[disabled].active, -fieldset[disabled] .btn-vimeo.active { - background-color: #1ab7ea; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-vimeo .badge { - color: #1ab7ea; - background-color: #fff; -} -.btn-vk { - color: #fff; - background-color: #587ea3; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-vk:hover, -.btn-vk:focus, -.btn-vk.focus, -.btn-vk:active, -.btn-vk.active, -.open > .dropdown-toggle.btn-vk { - color: #fff; - background-color: #466482; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-vk:active, -.btn-vk.active, -.open > .dropdown-toggle.btn-vk { - background-image: none; -} -.btn-vk.disabled, -.btn-vk[disabled], -fieldset[disabled] .btn-vk, -.btn-vk.disabled:hover, -.btn-vk[disabled]:hover, -fieldset[disabled] .btn-vk:hover, -.btn-vk.disabled:focus, -.btn-vk[disabled]:focus, -fieldset[disabled] .btn-vk:focus, -.btn-vk.disabled.focus, -.btn-vk[disabled].focus, -fieldset[disabled] .btn-vk.focus, -.btn-vk.disabled:active, -.btn-vk[disabled]:active, -fieldset[disabled] .btn-vk:active, -.btn-vk.disabled.active, -.btn-vk[disabled].active, -fieldset[disabled] .btn-vk.active { - background-color: #587ea3; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-vk .badge { - color: #587ea3; - background-color: #fff; -} -.btn-yahoo { - color: #fff; - background-color: #720e9e; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-yahoo:hover, -.btn-yahoo:focus, -.btn-yahoo.focus, -.btn-yahoo:active, -.btn-yahoo.active, -.open > .dropdown-toggle.btn-yahoo { - color: #fff; - background-color: #500a6f; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-yahoo:active, -.btn-yahoo.active, -.open > .dropdown-toggle.btn-yahoo { - background-image: none; -} -.btn-yahoo.disabled, -.btn-yahoo[disabled], -fieldset[disabled] .btn-yahoo, -.btn-yahoo.disabled:hover, -.btn-yahoo[disabled]:hover, -fieldset[disabled] .btn-yahoo:hover, -.btn-yahoo.disabled:focus, -.btn-yahoo[disabled]:focus, -fieldset[disabled] .btn-yahoo:focus, -.btn-yahoo.disabled.focus, -.btn-yahoo[disabled].focus, -fieldset[disabled] .btn-yahoo.focus, -.btn-yahoo.disabled:active, -.btn-yahoo[disabled]:active, -fieldset[disabled] .btn-yahoo:active, -.btn-yahoo.disabled.active, -.btn-yahoo[disabled].active, -fieldset[disabled] .btn-yahoo.active { - background-color: #720e9e; - border-color: rgba(0, 0, 0, 0.2); -} -.btn-yahoo .badge { - color: #720e9e; - background-color: #fff; -} -/* - * Plugin: Full Calendar - * --------------------- - */ -.fc-button { - background: #f4f4f4; - background-image: none; - color: #444; - border-color: #ddd; - border-bottom-color: #ddd; -} -.fc-button:hover, -.fc-button:active, -.fc-button.hover { - background-color: #e9e9e9; -} -.fc-header-title h2 { - font-size: 15px; - line-height: 1.6em; - color: #666; - margin-left: 10px; -} -.fc-header-right { - padding-right: 10px; -} -.fc-header-left { - padding-left: 10px; -} -.fc-widget-header { - background: #fafafa; -} -.fc-grid { - width: 100%; - border: 0; -} -.fc-widget-header:first-of-type, -.fc-widget-content:first-of-type { - border-left: 0; - border-right: 0; -} -.fc-widget-header:last-of-type, -.fc-widget-content:last-of-type { - border-right: 0; -} -.fc-toolbar { - padding: 10px; - margin: 0; -} -.fc-day-number { - font-size: 20px; - font-weight: 300; - padding-right: 10px; -} -.fc-color-picker { - list-style: none; - margin: 0; - padding: 0; -} -.fc-color-picker > li { - float: left; - font-size: 30px; - margin-right: 5px; - line-height: 30px; -} -.fc-color-picker > li .fa { - transition: -webkit-transform linear 0.3s; - transition: transform linear 0.3s; - transition: transform linear 0.3s, -webkit-transform linear 0.3s; -} -.fc-color-picker > li .fa:hover { - -webkit-transform: rotate(30deg); - transform: rotate(30deg); -} -#add-new-event { - transition: all linear 0.3s; -} -.external-event { - padding: 5px 10px; - font-weight: bold; - margin-bottom: 4px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); - border-radius: 3px; - cursor: move; -} -.external-event:hover { - box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2); -} -/* - * Plugin: Select2 - * --------------- - */ -.select2-container--default.select2-container--focus, -.select2-selection.select2-container--focus, -.select2-container--default:focus, -.select2-selection:focus, -.select2-container--default:active, -.select2-selection:active { - outline: none; -} -.select2-container--default .select2-selection--single, -.select2-selection .select2-selection--single { - border: 1px solid #d2d6de; - border-radius: 0; - padding: 6px 12px; - height: 34px; -} -.select2-container--default.select2-container--open { - border-color: #3c8dbc; -} -.select2-dropdown { - border: 1px solid #d2d6de; - border-radius: 0; -} -.select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: #3c8dbc; - color: white; -} -.select2-results__option { - padding: 6px 12px; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-user-select: none; -} -.select2-container .select2-selection--single .select2-selection__rendered { - padding-left: 0; - padding-right: 0; - height: auto; - margin-top: -4px; -} -.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { - padding-right: 6px; - padding-left: 20px; -} -.select2-container--default .select2-selection--single .select2-selection__arrow { - height: 28px; - right: 3px; -} -.select2-container--default .select2-selection--single .select2-selection__arrow b { - margin-top: 0; -} -.select2-dropdown .select2-search__field, -.select2-search--inline .select2-search__field { - border: 1px solid #d2d6de; -} -.select2-dropdown .select2-search__field:focus, -.select2-search--inline .select2-search__field:focus { - outline: none; - border: 1px solid #3c8dbc; -} -.select2-container--default .select2-results__option[aria-disabled=true] { - color: #999; -} -.select2-container--default .select2-results__option[aria-selected=true] { - background-color: #ddd; -} -.select2-container--default .select2-results__option[aria-selected=true], -.select2-container--default .select2-results__option[aria-selected=true]:hover { - color: #444; -} -.select2-container--default .select2-selection--multiple { - border: 1px solid #d2d6de; - border-radius: 0; -} -.select2-container--default .select2-selection--multiple:focus { - border-color: #3c8dbc; -} -.select2-container--default.select2-container--focus .select2-selection--multiple { - border-color: #d2d6de; -} -.select2-container--default .select2-selection--multiple .select2-selection__choice { - background-color: #3c8dbc; - border-color: #367fa9; - padding: 1px 10px; - color: #fff; -} -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - margin-right: 5px; - color: rgba(255, 255, 255, 0.7); -} -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #fff; -} -.select2-container .select2-selection--single .select2-selection__rendered { - padding-right: 10px; -} -/* - * General: Miscellaneous - * ---------------------- - */ -.pad { - padding: 10px; -} -.margin { - margin: 10px; -} -.margin-bottom { - margin-bottom: 20px; -} -.margin-bottom-none { - margin-bottom: 0; -} -.margin-r-5 { - margin-right: 5px; -} -.inline { - display: inline; -} -.description-block { - display: block; - margin: 10px 0; - text-align: center; -} -.description-block.margin-bottom { - margin-bottom: 25px; -} -.description-block > .description-header { - margin: 0; - padding: 0; - font-weight: 600; - font-size: 16px; -} -.description-block > .description-text { - text-transform: uppercase; -} -.bg-red, -.bg-yellow, -.bg-aqua, -.bg-blue, -.bg-light-blue, -.bg-green, -.bg-navy, -.bg-teal, -.bg-olive, -.bg-lime, -.bg-orange, -.bg-fuchsia, -.bg-purple, -.bg-maroon, -.bg-black, -.bg-red-active, -.bg-yellow-active, -.bg-aqua-active, -.bg-blue-active, -.bg-light-blue-active, -.bg-green-active, -.bg-navy-active, -.bg-teal-active, -.bg-olive-active, -.bg-lime-active, -.bg-orange-active, -.bg-fuchsia-active, -.bg-purple-active, -.bg-maroon-active, -.bg-black-active, -.callout.callout-danger, -.callout.callout-warning, -.callout.callout-info, -.callout.callout-success, -.alert-success, -.alert-danger, -.alert-error, -.alert-warning, -.alert-info, -.label-danger, -.label-info, -.label-warning, -.label-primary, -.label-success, -.modal-primary .modal-body, -.modal-primary .modal-header, -.modal-primary .modal-footer, -.modal-warning .modal-body, -.modal-warning .modal-header, -.modal-warning .modal-footer, -.modal-info .modal-body, -.modal-info .modal-header, -.modal-info .modal-footer, -.modal-success .modal-body, -.modal-success .modal-header, -.modal-success .modal-footer, -.modal-danger .modal-body, -.modal-danger .modal-header, -.modal-danger .modal-footer { - color: #fff !important; -} -.bg-gray { - color: #000; - background-color: #d2d6de !important; -} -.bg-gray-light { - background-color: #f7f7f7; -} -.bg-black { - background-color: #111 !important; -} -.bg-red, -.callout.callout-danger, -.alert-danger, -.alert-error, -.label-danger, -.modal-danger .modal-body { - background-color: #dd4b39 !important; -} -.bg-yellow, -.callout.callout-warning, -.alert-warning, -.label-warning, -.modal-warning .modal-body { - background-color: #f39c12 !important; -} -.bg-aqua, -.callout.callout-info, -.alert-info, -.label-info, -.modal-info .modal-body { - background-color: #00c0ef !important; -} -.bg-blue { - background-color: #0073b7 !important; -} -.bg-light-blue, -.label-primary, -.modal-primary .modal-body { - background-color: #3c8dbc !important; -} -.bg-green, -.callout.callout-success, -.alert-success, -.label-success, -.modal-success .modal-body { - background-color: #00a65a !important; -} -.bg-navy { - background-color: #001F3F !important; -} -.bg-teal { - background-color: #39CCCC !important; -} -.bg-olive { - background-color: #3D9970 !important; -} -.bg-lime { - background-color: #01FF70 !important; -} -.bg-orange { - background-color: #FF851B !important; -} -.bg-fuchsia { - background-color: #F012BE !important; -} -.bg-purple { - background-color: #605ca8 !important; -} -.bg-maroon { - background-color: #D81B60 !important; -} -.bg-gray-active { - color: #000; - background-color: #b5bbc8 !important; -} -.bg-black-active { - background-color: #000000 !important; -} -.bg-red-active, -.modal-danger .modal-header, -.modal-danger .modal-footer { - background-color: #d33724 !important; -} -.bg-yellow-active, -.modal-warning .modal-header, -.modal-warning .modal-footer { - background-color: #db8b0b !important; -} -.bg-aqua-active, -.modal-info .modal-header, -.modal-info .modal-footer { - background-color: #00a7d0 !important; -} -.bg-blue-active { - background-color: #005384 !important; -} -.bg-light-blue-active, -.modal-primary .modal-header, -.modal-primary .modal-footer { - background-color: #357ca5 !important; -} -.bg-green-active, -.modal-success .modal-header, -.modal-success .modal-footer { - background-color: #008d4c !important; -} -.bg-navy-active { - background-color: #001a35 !important; -} -.bg-teal-active { - background-color: #30bbbb !important; -} -.bg-olive-active { - background-color: #368763 !important; -} -.bg-lime-active { - background-color: #00e765 !important; -} -.bg-orange-active { - background-color: #ff7701 !important; -} -.bg-fuchsia-active { - background-color: #db0ead !important; -} -.bg-purple-active { - background-color: #555299 !important; -} -.bg-maroon-active { - background-color: #ca195a !important; -} -[class^="bg-"].disabled { - opacity: 0.65; - filter: alpha(opacity=65); -} -.text-red { - color: #dd4b39 !important; -} -.text-yellow { - color: #f39c12 !important; -} -.text-aqua { - color: #00c0ef !important; -} -.text-blue { - color: #0073b7 !important; -} -.text-black { - color: #111 !important; -} -.text-light-blue { - color: #3c8dbc !important; -} -.text-green { - color: #00a65a !important; -} -.text-gray { - color: #d2d6de !important; -} -.text-navy { - color: #001F3F !important; -} -.text-teal { - color: #39CCCC !important; -} -.text-olive { - color: #3D9970 !important; -} -.text-lime { - color: #01FF70 !important; -} -.text-orange { - color: #FF851B !important; -} -.text-fuchsia { - color: #F012BE !important; -} -.text-purple { - color: #605ca8 !important; -} -.text-maroon { - color: #D81B60 !important; -} -.link-muted { - color: #7a869d; -} -.link-muted:hover, -.link-muted:focus { - color: #606c84; -} -.link-black { - color: #666; -} -.link-black:hover, -.link-black:focus { - color: #999; -} -.hide { - display: none !important; -} -.no-border { - border: 0 !important; -} -.no-padding { - padding: 0 !important; -} -.no-margin { - margin: 0 !important; -} -.no-shadow { - box-shadow: none!important; -} -.list-unstyled, -.chart-legend, -.contacts-list, -.users-list { - list-style: none; - margin: 0; - padding: 0; -} -.list-group-unbordered > .list-group-item { - border-left: 0; - border-right: 0; - border-radius: 0; - padding-left: 0; - padding-right: 0; -} -.flat { - border-radius: 0 !important; -} -.text-bold, -.text-bold.table td, -.text-bold.table th { - font-weight: 700; -} -.text-sm { - font-size: 12px; -} -.jqstooltip { - padding: 5px!important; - width: auto!important; - height: auto!important; -} -.bg-teal-gradient { - background: #39CCCC !important; - background: -o-linear-gradient(#7adddd, #39CCCC) !important; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39CCCC', GradientType=0) !important; - color: #fff; -} -.bg-light-blue-gradient { - background: #3c8dbc !important; - background: -o-linear-gradient(#67a8ce, #3c8dbc) !important; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important; - color: #fff; -} -.bg-blue-gradient { - background: #0073b7 !important; - background: -o-linear-gradient(#0089db, #0073b7) !important; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important; - color: #fff; -} -.bg-aqua-gradient { - background: #00c0ef !important; - background: -o-linear-gradient(#14d1ff, #00c0ef) !important; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important; - color: #fff; -} -.bg-yellow-gradient { - background: #f39c12 !important; - background: -o-linear-gradient(#f7bc60, #f39c12) !important; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important; - color: #fff; -} -.bg-purple-gradient { - background: #605ca8 !important; - background: -o-linear-gradient(#9491c4, #605ca8) !important; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important; - color: #fff; -} -.bg-green-gradient { - background: #00a65a !important; - background: -o-linear-gradient(#00ca6d, #00a65a) !important; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important; - color: #fff; -} -.bg-red-gradient { - background: #dd4b39 !important; - background: -o-linear-gradient(#e47365, #dd4b39) !important; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important; - color: #fff; -} -.bg-black-gradient { - background: #111 !important; - background: -o-linear-gradient(#2b2b2b, #111) !important; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111', GradientType=0) !important; - color: #fff; -} -.bg-maroon-gradient { - background: #D81B60 !important; - background: -o-linear-gradient(#e73f7c, #D81B60) !important; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#D81B60', GradientType=0) !important; - color: #fff; -} -.description-block .description-icon { - font-size: 16px; -} -.no-pad-top { - padding-top: 0; -} -.position-static { - position: static!important; -} -.list-header { - font-size: 15px; - padding: 10px 4px; - font-weight: bold; - color: #666; -} -.list-seperator { - height: 1px; - background: #f4f4f4; - margin: 15px 0 9px 0; -} -.list-link > a { - padding: 4px; - color: #777; -} -.list-link > a:hover { - color: #222; -} -.font-light { - font-weight: 300; -} -.user-block:before, -.user-block:after { - content: " "; - display: table; -} -.user-block:after { - clear: both; -} -.user-block img { - width: 40px; - height: 40px; - float: left; -} -.user-block .username, -.user-block .description, -.user-block .comment { - display: block; - margin-left: 50px; -} -.user-block .username { - font-size: 16px; - font-weight: 600; -} -.user-block .description { - color: #999; - font-size: 13px; -} -.user-block.user-block-sm .username, -.user-block.user-block-sm .description, -.user-block.user-block-sm .comment { - margin-left: 40px; -} -.user-block.user-block-sm .username { - font-size: 14px; -} -.img-sm, -.img-md, -.img-lg, -.box-comments .box-comment img, -.user-block.user-block-sm img { - float: left; -} -.img-sm, -.box-comments .box-comment img, -.user-block.user-block-sm img { - width: 30px!important; - height: 30px!important; -} -.img-sm + .img-push { - margin-left: 40px; -} -.img-md { - width: 60px; - height: 60px; -} -.img-md + .img-push { - margin-left: 70px; -} -.img-lg { - width: 100px; - height: 100px; -} -.img-lg + .img-push { - margin-left: 110px; -} -.img-bordered { - border: 3px solid #d2d6de; - padding: 3px; -} -.img-bordered-sm { - border: 2px solid #d2d6de; - padding: 2px; -} -.attachment-block { - border: 1px solid #f4f4f4; - padding: 5px; - margin-bottom: 10px; - background: #f7f7f7; -} -.attachment-block .attachment-img { - max-width: 100px; - max-height: 100px; - height: auto; - float: left; -} -.attachment-block .attachment-pushed { - margin-left: 110px; -} -.attachment-block .attachment-heading { - margin: 0; -} -.attachment-block .attachment-text { - color: #555; -} -.connectedSortable { - min-height: 100px; -} -.ui-helper-hidden-accessible { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} -.sort-highlight { - background: #f4f4f4; - border: 1px dashed #ddd; - margin-bottom: 10px; -} -.full-opacity-hover { - opacity: 0.65; - filter: alpha(opacity=65); -} -.full-opacity-hover:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.chart { - position: relative; - overflow: hidden; - width: 100%; -} -.chart svg, -.chart canvas { - width: 100%!important; -} -/* - * Misc: print - * ----------- - */ -@media print { - .no-print, - .main-sidebar, - .left-side, - .main-header, - .content-header { - display: none!important; - } - .content-wrapper, - .right-side, - .main-footer { - margin-left: 0!important; - min-height: 0!important; - -webkit-transform: translate(0, 0) !important; - transform: translate(0, 0) !important; - } - .fixed .content-wrapper, - .fixed .right-side { - padding-top: 0!important; - } - .invoice { - width: 100%; - border: 0; - margin: 0; - padding: 0; - } - .invoice-col { - float: left; - width: 33.3333333%; - } - .table-responsive { - overflow: auto; - } - .table-responsive > .table tr th, - .table-responsive > .table tr td { - white-space: normal!important; - } -} - -/* - * Skin: Blue - * ---------- - */ -.skin-blue .main-header .navbar { - background-color: #3c8dbc; -} -.skin-blue .main-header .navbar .nav > li > a { - color: #fff; -} -.skin-blue .main-header .navbar .nav > li > a:hover, -.skin-blue .main-header .navbar .nav > li > a:active, -.skin-blue .main-header .navbar .nav > li > a:focus, -.skin-blue .main-header .navbar .nav .open > a, -.skin-blue .main-header .navbar .nav .open > a:hover, -.skin-blue .main-header .navbar .nav .open > a:focus, -.skin-blue .main-header .navbar .nav > .active > a { - background: rgba(0, 0, 0, 0.1); - color: #f6f6f6; -} -.skin-blue .main-header .navbar .sidebar-toggle { - color: #fff; -} -.skin-blue .main-header .navbar .sidebar-toggle:hover { - color: #f6f6f6; - background: rgba(0, 0, 0, 0.1); -} -.skin-blue .main-header .navbar .sidebar-toggle { - color: #fff; -} -.skin-blue .main-header .navbar .sidebar-toggle:hover { - background-color: #367fa9; -} -@media (max-width: 767px) { - .skin-blue .main-header .navbar .dropdown-menu li.divider { - background-color: rgba(255, 255, 255, 0.1); - } - .skin-blue .main-header .navbar .dropdown-menu li a { - color: #fff; - } - .skin-blue .main-header .navbar .dropdown-menu li a:hover { - background: #367fa9; - } -} -.skin-blue .main-header li.user-header { - background-color: #3c8dbc; -} -.skin-blue .content-header { - background: transparent; -} -.skin-blue .wrapper, -.skin-blue .main-sidebar, -.skin-blue .left-side { - background-color: #222d32; -} -.skin-blue .user-panel > .info, -.skin-blue .user-panel > .info > a { - color: #fff; -} -.skin-blue .sidebar-menu > li.header { - color: #4b646f; - background: #1a2226; -} -.skin-blue .sidebar-menu > li > a { - border-left: 3px solid transparent; -} -.skin-blue .sidebar-menu > li:hover > a, -.skin-blue .sidebar-menu > li.active > a { - color: #fff; - background: #1e282c; - border-left-color: #3c8dbc; -} -.skin-blue .sidebar-menu > li > .treeview-menu { - margin: 0 1px; - background: #2c3b41; -} -.skin-blue .sidebar a { - color: #b8c7ce; -} -.skin-blue .sidebar a:hover { - text-decoration: none; -} -.skin-blue .treeview-menu > li > a { - color: #8aa4af; -} -.skin-blue .treeview-menu > li.active > a, -.skin-blue .treeview-menu > li > a:hover { - color: #fff; -} -.skin-blue .sidebar-form { - border-radius: 3px; - border: 1px solid #374850; - margin: 10px 10px; -} -.skin-blue .sidebar-form input[type="text"], -.skin-blue .sidebar-form .btn { - box-shadow: none; - background-color: #374850; - border: 1px solid transparent; - height: 35px; - transition: all 0.3s ease-in-out; -} -.skin-blue .sidebar-form input[type="text"] { - color: #666; - border-top-left-radius: 2px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 2px; -} -.skin-blue .sidebar-form input[type="text"]:focus, -.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { - background-color: #fff; - color: #666; -} -.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { - border-left-color: #fff; -} -.skin-blue .sidebar-form .btn { - color: #999; - border-top-left-radius: 0; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; - border-bottom-left-radius: 0; -} -.skin-blue.layout-top-nav .main-header > .logo .logo-variant { - background-color: none; -} - -.skin-blue .main-header .logo { - background-color: inherit; -} -.main-header .logo { - width: 100% !important; - white-space: nowrap; - text-align: left; - display: block; - clear: both; -} -.huge { - font-size: 40px; -} -.btn-file { - position: relative; - overflow: hidden; -} -.dropdown-menu > li > a { - color: #354044; -} -#sort tr.cansort { - border-radius: 2px; - padding: 10px; - background: #f4f4f4; - margin-bottom: 3px; - border-left: 2px solid #e6e7e8; - color: #444; - cursor: move; -} -.user-image-inline { - float: left; - width: 25px; - height: 25px; - border-radius: 50%; - margin-right: 10px; -} -.input-group .input-group-addon { - background-color: #f4f4f4; -} -a.accordion-header { - color: #333; -} -.dynamic-form-row { - padding: 10px; - margin: 20px; -} -.handle { - padding-left: 10px; -} -.btn-file input[type=file] { - position: absolute; - top: 0; - right: 0; - min-width: 100%; - min-height: 100%; - font-size: 100px; - text-align: right; - filter: alpha(opacity=0); - opacity: 0; - outline: none; - background: white; - cursor: inherit; - display: block; -} -.main-footer { - font-size: 13px; -} -.main-header { - max-height: 150px; -} -.navbar-brand-img { - float: left; - padding: 5px 5px 5px 0; -} -.navbar-nav > .user-menu > .dropdown-menu { - width: inherit; -} -.main-header .logo { - padding: 0px 5px 0px 15px; -} -.sidebar-toggle { - margin-left: -48px; - z-index: 100; - background-color: inherit; -} -.sidebar-toggle-mobile { - z-index: 100; - width: 50px; - padding-top: 10px; -} -.main-header .sidebar-toggle:before { - content: "\f0c9"; -} -.direct-chat-contacts { - padding: 10px; - height: 150px; -} -.select2-container { - width: 100%; -} -.error input { - color: #dd4b39; - border: 2px solid #dd4b39 !important; -} -.error label, -.alert-msg { - color: #dd4b39; - display: block; -} -.input-group[class*="col-"] { - padding-right: 15px; - padding-left: 15px; -} -.control-label.multiline { - padding-top: 10px; -} -.btn-outline { - color: inherit; - background-color: transparent; - transition: all .5s; -} -.btn-primary.btn-outline { - color: #428bca; -} -.btn-success.btn-outline { - color: #5cb85c; -} -.btn-info.btn-outline { - color: #5bc0de; -} -.btn-warning.btn-outline { - color: #f0ad4e; -} -.btn-danger.btn-outline { - color: #d9534f; -} -.btn-primary.btn-outline:hover, -.btn-success.btn-outline:hover, -.btn-info.btn-outline:hover, -.btn-warning.btn-outline:hover, -.btn-danger.btn-outline:hover { - color: #fff; -} -.slideout-menu { - position: fixed; - top: 0; - right: -250px; - width: 250px; - height: 100%; - background: #333; - z-index: 100; - margin-top: 100px; - color: white; - padding: 10px; -} -.slideout-menu h3 { - position: relative; - padding: 5px 5px; - color: #fff; - font-size: 1.2em; - font-weight: 400; - border-bottom: 4px solid #222; -} -.slideout-menu .slideout-menu-toggle { - position: absolute; - top: 12px; - right: 10px; - display: inline-block; - padding: 6px 9px 5px; - font-family: Arial, sans-serif; - font-weight: bold; - line-height: 1; - background: #222; - color: #999; - text-decoration: none; - vertical-align: top; -} -.slideout-menu .slideout-menu-toggle:hover { - color: #fff; -} -.slideout-menu ul { - list-style: none; - font-weight: 300; - border-top: 1px solid #151515; - border-bottom: 1px solid #454545; -} -.slideout-menu ul li { - border-top: 1px solid #454545; - border-bottom: 1px solid #151515; -} -.slideout-menu ul li a { - position: relative; - display: block; - padding: 10px; - color: #999; - text-decoration: none; -} -.slideout-menu ul li a:hover { - background: #000; - color: #fff; -} -.slideout-menu ul li a i { - position: absolute; - top: 15px; - right: 10px; - opacity: .5; -} -.btn-box-tool-lg { - font-size: 16px; - color: orange; -} -.bs-wizard { - margin-top: 20px; -} -/*Form Wizard*/ -.bs-wizard { - border-bottom: solid 1px #e0e0e0; - padding: 0 0 10px 0; -} -.bs-wizard > .bs-wizard-step { - padding: 0; - position: relative; -} -.bs-wizard > .bs-wizard-step .bs-wizard-stepnum { - color: #595959; - font-size: 16px; - margin-bottom: 5px; -} -.bs-wizard > .bs-wizard-step .bs-wizard-info { - color: #999; - font-size: 14px; -} -.bs-wizard > .bs-wizard-step > .bs-wizard-dot { - position: absolute; - width: 30px; - height: 30px; - display: block; - background: #fbe8aa; - top: 45px; - left: 50%; - margin-top: -15px; - margin-left: -15px; - border-radius: 50%; -} -.bs-wizard > .bs-wizard-step > .bs-wizard-dot:after { - content: ' '; - width: 14px; - height: 14px; - background: #fbbd19; - border-radius: 50px; - position: absolute; - top: 8px; - left: 8px; -} -.bs-wizard > .bs-wizard-step > .progress { - position: relative; - border-radius: 0px; - height: 8px; - box-shadow: none; - margin: 20px 0; -} -.bs-wizard > .bs-wizard-step > .progress > .progress-bar { - width: 0px; - box-shadow: none; - background: #fbe8aa; -} -.bs-wizard > .bs-wizard-step.complete > .progress > .progress-bar { - width: 100%; -} -.bs-wizard > .bs-wizard-step.active > .progress > .progress-bar { - width: 50%; -} -.bs-wizard > .bs-wizard-step:first-child.active > .progress > .progress-bar { - width: 0%; -} -.bs-wizard > .bs-wizard-step:last-child.active > .progress > .progress-bar { - width: 100%; -} -.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot { - background-color: #f5f5f5; -} -.bs-wizard > .bs-wizard-step.disabled > .bs-wizard-dot:after { - opacity: 0; -} -.bs-wizard > .bs-wizard-step:first-child > .progress { - left: 50%; - width: 50%; -} -.bs-wizard > .bs-wizard-step:last-child > .progress { - width: 50%; -} -.bs-wizard > .bs-wizard-step.disabled a.bs-wizard-dot { - pointer-events: none; -} -/*END Form Wizard*/ -.left-navblock { - display: inline-block; - float: left; - text-align: left; - color: white; - padding: 0px; - /* adjust based on your layout */ -} -.skin-blue .main-header .navbar .dropdown-menu li a { - color: #333; -} -a.logo.no-hover a:hover { - background-color: transparent; -} -.required { - border-right: 6px solid orange; -} -body { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; - font-size: 13px; -} -.sidebar-menu { - font-size: 14px; - white-space: normal; -} -@media print { - a[href]:after { - content: none; - } - .tab-content > .tab-pane { - display: block !important; - opacity: 1 !important; - visibility: visible !important; - } -} - -/*# sourceMappingURL=app.css.map */ +!*/.layout-boxed body,.layout-boxed html{height:100%}body{-webkit-font-smoothing:antialiased;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{position:static;overflow:hidden}.wrapper:after,.wrapper:before{content:" ";display:table}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;box-shadow:0 0 8px rgba(0,0,0,.5);position:relative}.layout-boxed{background:url(../img/boxed-bg.jpg) fixed}.content-wrapper,.main-footer,.right-side{transition:margin .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out,-webkit-transform .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .main-footer,.layout-top-nav .right-side{margin-left:0}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .main-footer,.sidebar-collapse .right-side{margin-left:0}}.content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .left-side,.fixed .main-header,.fixed .main-sidebar{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.content-wrapper,.main-footer,.right-side{margin-left:0}.sidebar-open .content-wrapper,.sidebar-open .main-footer,.sidebar-open .right-side{-webkit-transform:translate(230px,0);transform:translate(230px,0)}.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}body.hold-transition .content-wrapper,body.hold-transition .left-side,body.hold-transition .main-footer,body.hold-transition .main-header .logo,body.hold-transition .main-header>.navbar,body.hold-transition .main-sidebar,body.hold-transition .right-side{transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:active,a:focus,a:hover{outline:0;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;z-index:1030}.main-header>.navbar{transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header>.navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,.2);border-color:transparent}.main-header #navbar-search-input.form-control:active,.main-header #navbar-search-input.form-control:focus{border-color:rgba(0,0,0,.1);background:rgba(255,255,255,.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:0 0}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .navbar-brand,.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px;font-family:fontAwesome}.main-header .sidebar-toggle:active,.main-header .sidebar-toggle:focus{background:0 0}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{transition:width .3s ease-in-out;float:left;height:50px;font-size:20px;line-height:50px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.content-header{position:relative;padding:15px 15px 0}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:0 0;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}.content-header{padding-top:110px}ul.sidebar-menu{padding-top:120px}.sidebar-toggle-mobile a{color:#fff}}.left-side,.main-sidebar{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;transition:width .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out,-webkit-transform .3s ease-in-out}@media (max-width:767px){.left-side,.main-sidebar{padding-top:100px;-webkit-transform:translate(-230px,0);transform:translate(-230px,0)}}@media (min-width:768px){.sidebar-collapse .left-side,.sidebar-collapse .main-sidebar{-webkit-transform:translate(-230px,0);transform:translate(-230px,0)}}@media (max-width:767px){.sidebar-open .left-side,.sidebar-open .main-sidebar{-webkit-transform:translate(0,0);transform:translate(0,0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:after,.user-panel:before{content:" ";display:table}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.glyphicon,.user-panel>.info>a>.ion{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .badge,.sidebar-menu>li .label{margin-top:3px;margin-right:5px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;margin-top:3px}.sidebar-menu li.active>a>.fa-angle-left{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu li.active>.treeview-menu{display:block}.sidebar-menu .treeview-menu{display:none;list-style:none;padding:0 0 0 5px;margin:0}.sidebar-menu .treeview-menu .treeview-menu{padding-left:20px}.sidebar-menu .treeview-menu>li{margin:0}.sidebar-menu .treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.sidebar-menu .treeview-menu>li>a>.fa,.sidebar-menu .treeview-menu>li>a>.glyphicon,.sidebar-menu .treeview-menu>li>a>.ion{width:20px}.sidebar-menu .treeview-menu>li>a>.fa-angle-down,.sidebar-menu .treeview-menu>li>a>.fa-angle-left{width:auto}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .main-footer,.sidebar-mini.sidebar-collapse .right-side{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0,0);transform:translate(0,0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right){display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu li.header,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}.control-sidebar-open .content-wrapper,.control-sidebar-open .main-footer,.control-sidebar-open .right-side{margin-right:230px}}.main-sidebar .user-panel,.sidebar-menu,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.btn-social,.btn-social-icon,.info-box-text,.progress-description,.users-list-name{white-space:nowrap;text-overflow:ellipsis}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right{position:absolute;top:50%;right:10px;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar,.control-sidebar-bg{top:0;right:-230px;width:230px;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar-open .control-sidebar,.control-sidebar-open .control-sidebar-bg,.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:active,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:hover{border-top:none;border-right:none;border-bottom:none}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:after,.control-sidebar-menu>li>a:before{content:" ";display:table}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading,.control-sidebar-menu .progress{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0;margin:0;top:100%}.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{background-color:#fff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444;font-size:14px;border-radius:4px 4px 0 0}.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eee;color:#444!important;text-align:center;border-radius:0 0 4px 4px}@media (max-width:991px){.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:400}.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before{content:" ";display:table}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px;color:#666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0;border-top-width:0}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid transparent;border-color:rgba(255,255,255,.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after,.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before{display:table;content:" "}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #ddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444!important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff!important;color:#444!important}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type,.form-control{border-radius:0}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-danger,.progress-striped .progress-bar-green,.progress-striped .progress-bar-info,.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary,.progress-striped .progress-bar-red,.progress-striped .progress-bar-success,.progress-striped .progress-bar-warning,.progress-striped .progress-bar-yellow{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.form-control{box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control:-ms-input-placeholder,.form-control::-moz-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control{border-color:#00a65a;box-shadow:none}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control{border-color:#f39c12;box-shadow:none}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control{border-color:#dd4b39;box-shadow:none}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de}.progress,.progress .progress-bar,.progress-sm,.progress-sm .progress-bar,.progress-xs,.progress-xs .progress-bar,.progress-xxs,.progress-xxs .progress-bar,.progress.sm,.progress.sm .progress-bar,.progress.xs,.progress.xs .progress-bar,.progress.xxs,.progress.xxs .progress-bar,.progress>.progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.form-group-lg .form-control+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.input-lg+.form-control-feedback.fa{line-height:46px}.form-group-sm .form-control+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.input-sm+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{box-shadow:none}.box,.small-box{box-shadow:0 1px 1px rgba(0,0,0,.1)}.progress-sm,.progress.sm{height:10px}.progress-xs,.progress.xs{height:7px}.progress-xxs,.progress.xxs{height:3px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.progress-sm,.progress.vertical.sm{width:20px}.progress.vertical.progress-xs,.progress.vertical.xs{width:10px}.progress.vertical.progress-xxs,.progress.vertical.xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-bar-warning,.progress-bar-yellow{background-color:#f39c12}.progress-bar-danger,.progress-bar-red{background-color:#dd4b39}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,.8);display:block;z-index:10;background:rgba(0,0,0,.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,.15)}.small-box h3{font-size:38px;font-weight:700;margin:0 0 10px;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5px}.small-box .icon{transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#fff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:0 0}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de}.box.box-solid.box-default>.box-header .btn,.box.box-solid.box-default>.box-header a{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc}.box.box-solid.box-primary>.box-header .btn,.box.box-solid.box-primary>.box-header a{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef}.box.box-solid.box-info>.box-header .btn,.box.box-solid.box-info>.box-header a{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39}.box.box-solid.box-danger>.box-header .btn,.box.box-solid.box-danger>.box-header a{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12}.box.box-solid.box-warning>.box-header .btn,.box.box-solid.box-warning>.box-header a{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a}.box.box-solid.box-success>.box-header .btn,.box.box-solid.box-success>.box-header a{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*=bg]>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:.3em}.box>.loading-img,.box>.overlay,.overlay-wrapper>.loading-img,.overlay-wrapper>.overlay{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,.5)}.box-body:after,.box-body:before,.box-footer:after,.box-footer:before,.box-header:after,.box-header:before{content:" ";display:table}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header .box-title,.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle=tooltip],.btn.btn-file{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.btn-box-tool{padding:5px;font-size:12px;background:0 0;color:#97a0b3}.btn-box-tool:hover,.open .btn-box-tool{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{padding:10px;border-radius:0 0 3px 3px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-radius:0 0 0 3px}.box-body .box-pane-right{border-radius:0 0 3px}.box-footer{border-top:1px solid #f4f4f4;padding:10px;background-color:#fff;border-radius:0 0 3px 3px}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:after,.box-comments .box-comment:before{content:" ";display:table}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type=checkbox]{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list .handle,.todo-list>li:hover .tools{display:inline-block}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de!important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:after,.chat .item:before{content:" ";display:table}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px;font-weight:600;font-size:14px}.chat .item>.attachment>.filename,.chat .item>.attachment>p{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:after,.chat .item>.attachment:before{content:" ";display:table}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,.2);margin:5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,.2);border-radius:2px 0 0 2px}.btn,.btn-app{border-radius:3px}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:700;font-size:18px}.info-box-text,.progress-description{display:block;font-size:14px;overflow:hidden}.info-box-more{display:block}.progress-description{margin:0}.btn{box-shadow:none;border:1px solid transparent}.btn.btn-flat{border-radius:0;box-shadow:none;border-width:1px}.btn:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:focus{outline:0}.btn.btn-file{overflow:hidden}.btn.btn-file>input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:0;background:#fff;cursor:inherit;display:block}.btn-app,table.text-center,table.text-center td,table.text-center th{text-align:center}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default.hover,.btn-default:active,.btn-default:hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary.hover,.btn-primary:active,.btn-primary:hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success.hover,.btn-success:active,.btn-success:hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info.hover,.btn-info:active,.btn-info:hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger.hover,.btn-danger:active,.btn-danger:hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning.hover,.btn-warning:active,.btn-warning:hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:0 0}.btn-outline:active,.btn-outline:focus,.btn-outline:hover{color:rgba(255,255,255,.7);border-color:rgba(255,255,255,.7)}.btn-link{box-shadow:none}.btn[class*=bg-]:hover{box-shadow:inset 0 0 100px rgba(0,0,0,.2)}.btn-app{position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.alert,.callout{border-radius:3px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.alert h4,.callout h4,.contacts-list-name,.direct-chat-name,.nav-pills>li.active>a{font-weight:600}.callout{margin:0 0 20px;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff}.callout a:hover{color:#eee}.callout h4{margin-top:0}.callout p:last-child{margin-bottom:0}.callout .highlight,.callout code{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:active,.nav>li>a:focus,.nav>li>a:hover{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{border-top-color:#3c8dbc}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:0 0;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted,.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:0 0;margin:0}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active:hover>a,.nav-tabs-custom>.nav-tabs>li.active>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:0 0;color:#999}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0!important}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #f4f4f4}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0,0);transform:translate(0,0)}.direct-chat-messages{-webkit-transform:translate(0,0);transform:translate(0,0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:after,.direct-chat-msg:before{content:" ";display:table}.direct-chat-contacts,.direct-chat-messages{transition:-webkit-transform .5s ease-in-out;transition:transform .5s ease-in-out;transition:transform .5s ease-in-out,-webkit-transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0,0);transform:translate(0,0)}.direct-chat-contacts{-webkit-transform:translate(101%,0);transform:translate(101%,0);position:absolute;top:0;bottom:0;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,.2);padding:10px;margin:0}.contacts-list>li:after,.contacts-list>li:before{content:" ";display:table}.contacts-list-name,.contacts-list-status,.users-list-date,.users-list-name{display:block}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:400}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name{font-weight:600;color:#444;overflow:hidden}.users-list-date{color:#999;font-size:12px}.modal{background:rgba(0,0,0,.3)}.modal-content{border-radius:0;box-shadow:0 2px 3px rgba(0,0,0,.125);border:0}@media (min-width:768px){.modal-content{box-shadow:0 2px 3px rgba(0,0,0,.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-footer,.modal-primary .modal-header{border-color:#307095}.modal-warning .modal-footer,.modal-warning .modal-header{border-color:#c87f0a}.modal-info .modal-footer,.modal-info .modal-header{border-color:#0097bc}.modal-success .modal-footer,.modal-success .modal-header{border-color:#00733e}.modal-danger .modal-footer,.modal-danger .modal-header{border-color:#c23321}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.btn-adn.active,.btn-adn:active,.btn-bitbucket.active,.btn-bitbucket:active,.btn-dropbox.active,.btn-dropbox:active,.btn-facebook.active,.btn-facebook:active,.btn-flickr.active,.btn-flickr:active,.btn-foursquare.active,.btn-foursquare:active,.btn-github.active,.btn-github:active,.btn-google.active,.btn-google:active,.btn-instagram.active,.btn-instagram:active,.btn-microsoft.active,.btn-microsoft:active,.btn-openid.active,.btn-openid:active,.btn-pinterest.active,.btn-pinterest:active,.btn-reddit.active,.btn-reddit:active,.btn-soundcloud.active,.btn-soundcloud:active,.btn-tumblr.active,.btn-tumblr:active,.btn-twitter.active,.btn-twitter:active,.btn-vimeo.active,.btn-vimeo:active,.btn-vk.active,.btn-vk:active,.btn-yahoo.active,.btn-yahoo:active,.open>.dropdown-toggle.btn-adn,.open>.dropdown-toggle.btn-bitbucket,.open>.dropdown-toggle.btn-dropbox,.open>.dropdown-toggle.btn-facebook,.open>.dropdown-toggle.btn-flickr,.open>.dropdown-toggle.btn-foursquare,.open>.dropdown-toggle.btn-github,.open>.dropdown-toggle.btn-google,.open>.dropdown-toggle.btn-instagram,.open>.dropdown-toggle.btn-microsoft,.open>.dropdown-toggle.btn-openid,.open>.dropdown-toggle.btn-pinterest,.open>.dropdown-toggle.btn-reddit,.open>.dropdown-toggle.btn-soundcloud,.open>.dropdown-toggle.btn-tumblr,.open>.dropdown-toggle.btn-twitter,.open>.dropdown-toggle.btn-vimeo,.open>.dropdown-toggle.btn-vk,.open>.dropdown-toggle.btn-yahoo{background-image:none}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0}.error-page>.headline{float:left;font-size:100px;font-weight:300}.error-page>.error-content{margin-left:190px;display:block}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page{width:100%}.error-page>.headline{float:none;text-align:center}.error-page>.error-content{margin-left:0}.error-page>.error-content>h3{text-align:center}}.btn-social{position:relative;padding-left:44px;text-align:left;overflow:hidden}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;text-align:left;overflow:hidden;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;line-height:34px;font-size:1.6em}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.fc-day-number,.fc-header-right{padding-right:10px}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,.2)}.btn-adn.active,.btn-adn.focus,.btn-adn:active,.btn-adn:focus,.btn-adn:hover,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,.2)}.btn-adn.disabled,.btn-adn.disabled.active,.btn-adn.disabled.focus,.btn-adn.disabled:active,.btn-adn.disabled:focus,.btn-adn.disabled:hover,.btn-adn[disabled],.btn-adn[disabled].active,.btn-adn[disabled].focus,.btn-adn[disabled]:active,.btn-adn[disabled]:focus,.btn-adn[disabled]:hover,fieldset[disabled] .btn-adn,fieldset[disabled] .btn-adn.active,fieldset[disabled] .btn-adn.focus,fieldset[disabled] .btn-adn:active,fieldset[disabled] .btn-adn:focus,fieldset[disabled] .btn-adn:hover{background-color:#d87a68;border-color:rgba(0,0,0,.2)}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,.2)}.btn-bitbucket.active,.btn-bitbucket.focus,.btn-bitbucket:active,.btn-bitbucket:focus,.btn-bitbucket:hover,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,.2)}.btn-bitbucket.disabled,.btn-bitbucket.disabled.active,.btn-bitbucket.disabled.focus,.btn-bitbucket.disabled:active,.btn-bitbucket.disabled:focus,.btn-bitbucket.disabled:hover,.btn-bitbucket[disabled],.btn-bitbucket[disabled].active,.btn-bitbucket[disabled].focus,.btn-bitbucket[disabled]:active,.btn-bitbucket[disabled]:focus,.btn-bitbucket[disabled]:hover,fieldset[disabled] .btn-bitbucket,fieldset[disabled] .btn-bitbucket.active,fieldset[disabled] .btn-bitbucket.focus,fieldset[disabled] .btn-bitbucket:active,fieldset[disabled] .btn-bitbucket:focus,fieldset[disabled] .btn-bitbucket:hover{background-color:#205081;border-color:rgba(0,0,0,.2)}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,.2)}.btn-dropbox.active,.btn-dropbox.focus,.btn-dropbox:active,.btn-dropbox:focus,.btn-dropbox:hover,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,.2)}.btn-dropbox.disabled,.btn-dropbox.disabled.active,.btn-dropbox.disabled.focus,.btn-dropbox.disabled:active,.btn-dropbox.disabled:focus,.btn-dropbox.disabled:hover,.btn-dropbox[disabled],.btn-dropbox[disabled].active,.btn-dropbox[disabled].focus,.btn-dropbox[disabled]:active,.btn-dropbox[disabled]:focus,.btn-dropbox[disabled]:hover,fieldset[disabled] .btn-dropbox,fieldset[disabled] .btn-dropbox.active,fieldset[disabled] .btn-dropbox.focus,fieldset[disabled] .btn-dropbox:active,fieldset[disabled] .btn-dropbox:focus,fieldset[disabled] .btn-dropbox:hover{background-color:#1087dd;border-color:rgba(0,0,0,.2)}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,.2)}.btn-facebook.active,.btn-facebook.focus,.btn-facebook:active,.btn-facebook:focus,.btn-facebook:hover,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,.2)}.btn-facebook.disabled,.btn-facebook.disabled.active,.btn-facebook.disabled.focus,.btn-facebook.disabled:active,.btn-facebook.disabled:focus,.btn-facebook.disabled:hover,.btn-facebook[disabled],.btn-facebook[disabled].active,.btn-facebook[disabled].focus,.btn-facebook[disabled]:active,.btn-facebook[disabled]:focus,.btn-facebook[disabled]:hover,fieldset[disabled] .btn-facebook,fieldset[disabled] .btn-facebook.active,fieldset[disabled] .btn-facebook.focus,fieldset[disabled] .btn-facebook:active,fieldset[disabled] .btn-facebook:focus,fieldset[disabled] .btn-facebook:hover{background-color:#3b5998;border-color:rgba(0,0,0,.2)}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,.2)}.btn-flickr.active,.btn-flickr.focus,.btn-flickr:active,.btn-flickr:focus,.btn-flickr:hover,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,.2)}.btn-flickr.disabled,.btn-flickr.disabled.active,.btn-flickr.disabled.focus,.btn-flickr.disabled:active,.btn-flickr.disabled:focus,.btn-flickr.disabled:hover,.btn-flickr[disabled],.btn-flickr[disabled].active,.btn-flickr[disabled].focus,.btn-flickr[disabled]:active,.btn-flickr[disabled]:focus,.btn-flickr[disabled]:hover,fieldset[disabled] .btn-flickr,fieldset[disabled] .btn-flickr.active,fieldset[disabled] .btn-flickr.focus,fieldset[disabled] .btn-flickr:active,fieldset[disabled] .btn-flickr:focus,fieldset[disabled] .btn-flickr:hover{background-color:#ff0084;border-color:rgba(0,0,0,.2)}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,.2)}.btn-foursquare.active,.btn-foursquare.focus,.btn-foursquare:active,.btn-foursquare:focus,.btn-foursquare:hover,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,.2)}.btn-foursquare.disabled,.btn-foursquare.disabled.active,.btn-foursquare.disabled.focus,.btn-foursquare.disabled:active,.btn-foursquare.disabled:focus,.btn-foursquare.disabled:hover,.btn-foursquare[disabled],.btn-foursquare[disabled].active,.btn-foursquare[disabled].focus,.btn-foursquare[disabled]:active,.btn-foursquare[disabled]:focus,.btn-foursquare[disabled]:hover,fieldset[disabled] .btn-foursquare,fieldset[disabled] .btn-foursquare.active,fieldset[disabled] .btn-foursquare.focus,fieldset[disabled] .btn-foursquare:active,fieldset[disabled] .btn-foursquare:focus,fieldset[disabled] .btn-foursquare:hover{background-color:#f94877;border-color:rgba(0,0,0,.2)}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,.2)}.btn-github.active,.btn-github.focus,.btn-github:active,.btn-github:focus,.btn-github:hover,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,.2)}.btn-github.disabled,.btn-github.disabled.active,.btn-github.disabled.focus,.btn-github.disabled:active,.btn-github.disabled:focus,.btn-github.disabled:hover,.btn-github[disabled],.btn-github[disabled].active,.btn-github[disabled].focus,.btn-github[disabled]:active,.btn-github[disabled]:focus,.btn-github[disabled]:hover,fieldset[disabled] .btn-github,fieldset[disabled] .btn-github.active,fieldset[disabled] .btn-github.focus,fieldset[disabled] .btn-github:active,fieldset[disabled] .btn-github:focus,fieldset[disabled] .btn-github:hover{background-color:#444;border-color:rgba(0,0,0,.2)}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,.2)}.btn-google.active,.btn-google.focus,.btn-google:active,.btn-google:focus,.btn-google:hover,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,.2)}.btn-google.disabled,.btn-google.disabled.active,.btn-google.disabled.focus,.btn-google.disabled:active,.btn-google.disabled:focus,.btn-google.disabled:hover,.btn-google[disabled],.btn-google[disabled].active,.btn-google[disabled].focus,.btn-google[disabled]:active,.btn-google[disabled]:focus,.btn-google[disabled]:hover,fieldset[disabled] .btn-google,fieldset[disabled] .btn-google.active,fieldset[disabled] .btn-google.focus,fieldset[disabled] .btn-google:active,fieldset[disabled] .btn-google:focus,fieldset[disabled] .btn-google:hover{background-color:#dd4b39;border-color:rgba(0,0,0,.2)}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,.2)}.btn-instagram.active,.btn-instagram.focus,.btn-instagram:active,.btn-instagram:focus,.btn-instagram:hover,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,.2)}.btn-instagram.disabled,.btn-instagram.disabled.active,.btn-instagram.disabled.focus,.btn-instagram.disabled:active,.btn-instagram.disabled:focus,.btn-instagram.disabled:hover,.btn-instagram[disabled],.btn-instagram[disabled].active,.btn-instagram[disabled].focus,.btn-instagram[disabled]:active,.btn-instagram[disabled]:focus,.btn-instagram[disabled]:hover,fieldset[disabled] .btn-instagram,fieldset[disabled] .btn-instagram.active,fieldset[disabled] .btn-instagram.focus,fieldset[disabled] .btn-instagram:active,fieldset[disabled] .btn-instagram:focus,fieldset[disabled] .btn-instagram:hover{background-color:#3f729b;border-color:rgba(0,0,0,.2)}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,.2)}.btn-linkedin.active,.btn-linkedin.focus,.btn-linkedin:active,.btn-linkedin:focus,.btn-linkedin:hover,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,.2)}.btn-linkedin.active,.btn-linkedin:active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin.disabled,.btn-linkedin.disabled.active,.btn-linkedin.disabled.focus,.btn-linkedin.disabled:active,.btn-linkedin.disabled:focus,.btn-linkedin.disabled:hover,.btn-linkedin[disabled],.btn-linkedin[disabled].active,.btn-linkedin[disabled].focus,.btn-linkedin[disabled]:active,.btn-linkedin[disabled]:focus,.btn-linkedin[disabled]:hover,fieldset[disabled] .btn-linkedin,fieldset[disabled] .btn-linkedin.active,fieldset[disabled] .btn-linkedin.focus,fieldset[disabled] .btn-linkedin:active,fieldset[disabled] .btn-linkedin:focus,fieldset[disabled] .btn-linkedin:hover{background-color:#007bb6;border-color:rgba(0,0,0,.2)}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,.2)}.btn-microsoft.active,.btn-microsoft.focus,.btn-microsoft:active,.btn-microsoft:focus,.btn-microsoft:hover,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,.2)}.btn-microsoft.disabled,.btn-microsoft.disabled.active,.btn-microsoft.disabled.focus,.btn-microsoft.disabled:active,.btn-microsoft.disabled:focus,.btn-microsoft.disabled:hover,.btn-microsoft[disabled],.btn-microsoft[disabled].active,.btn-microsoft[disabled].focus,.btn-microsoft[disabled]:active,.btn-microsoft[disabled]:focus,.btn-microsoft[disabled]:hover,fieldset[disabled] .btn-microsoft,fieldset[disabled] .btn-microsoft.active,fieldset[disabled] .btn-microsoft.focus,fieldset[disabled] .btn-microsoft:active,fieldset[disabled] .btn-microsoft:focus,fieldset[disabled] .btn-microsoft:hover{background-color:#2672ec;border-color:rgba(0,0,0,.2)}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,.2)}.btn-openid.active,.btn-openid.focus,.btn-openid:active,.btn-openid:focus,.btn-openid:hover,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,.2)}.btn-openid.disabled,.btn-openid.disabled.active,.btn-openid.disabled.focus,.btn-openid.disabled:active,.btn-openid.disabled:focus,.btn-openid.disabled:hover,.btn-openid[disabled],.btn-openid[disabled].active,.btn-openid[disabled].focus,.btn-openid[disabled]:active,.btn-openid[disabled]:focus,.btn-openid[disabled]:hover,fieldset[disabled] .btn-openid,fieldset[disabled] .btn-openid.active,fieldset[disabled] .btn-openid.focus,fieldset[disabled] .btn-openid:active,fieldset[disabled] .btn-openid:focus,fieldset[disabled] .btn-openid:hover{background-color:#f7931e;border-color:rgba(0,0,0,.2)}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,.2)}.btn-pinterest.active,.btn-pinterest.focus,.btn-pinterest:active,.btn-pinterest:focus,.btn-pinterest:hover,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,.2)}.btn-pinterest.disabled,.btn-pinterest.disabled.active,.btn-pinterest.disabled.focus,.btn-pinterest.disabled:active,.btn-pinterest.disabled:focus,.btn-pinterest.disabled:hover,.btn-pinterest[disabled],.btn-pinterest[disabled].active,.btn-pinterest[disabled].focus,.btn-pinterest[disabled]:active,.btn-pinterest[disabled]:focus,.btn-pinterest[disabled]:hover,fieldset[disabled] .btn-pinterest,fieldset[disabled] .btn-pinterest.active,fieldset[disabled] .btn-pinterest.focus,fieldset[disabled] .btn-pinterest:active,fieldset[disabled] .btn-pinterest:focus,fieldset[disabled] .btn-pinterest:hover{background-color:#cb2027;border-color:rgba(0,0,0,.2)}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,.2)}.btn-reddit.active,.btn-reddit.focus,.btn-reddit:active,.btn-reddit:focus,.btn-reddit:hover,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,.2)}.btn-reddit.disabled,.btn-reddit.disabled.active,.btn-reddit.disabled.focus,.btn-reddit.disabled:active,.btn-reddit.disabled:focus,.btn-reddit.disabled:hover,.btn-reddit[disabled],.btn-reddit[disabled].active,.btn-reddit[disabled].focus,.btn-reddit[disabled]:active,.btn-reddit[disabled]:focus,.btn-reddit[disabled]:hover,fieldset[disabled] .btn-reddit,fieldset[disabled] .btn-reddit.active,fieldset[disabled] .btn-reddit.focus,fieldset[disabled] .btn-reddit:active,fieldset[disabled] .btn-reddit:focus,fieldset[disabled] .btn-reddit:hover{background-color:#eff7ff;border-color:rgba(0,0,0,.2)}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,.2)}.btn-soundcloud.active,.btn-soundcloud.focus,.btn-soundcloud:active,.btn-soundcloud:focus,.btn-soundcloud:hover,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,.2)}.btn-soundcloud.disabled,.btn-soundcloud.disabled.active,.btn-soundcloud.disabled.focus,.btn-soundcloud.disabled:active,.btn-soundcloud.disabled:focus,.btn-soundcloud.disabled:hover,.btn-soundcloud[disabled],.btn-soundcloud[disabled].active,.btn-soundcloud[disabled].focus,.btn-soundcloud[disabled]:active,.btn-soundcloud[disabled]:focus,.btn-soundcloud[disabled]:hover,fieldset[disabled] .btn-soundcloud,fieldset[disabled] .btn-soundcloud.active,fieldset[disabled] .btn-soundcloud.focus,fieldset[disabled] .btn-soundcloud:active,fieldset[disabled] .btn-soundcloud:focus,fieldset[disabled] .btn-soundcloud:hover{background-color:#f50;border-color:rgba(0,0,0,.2)}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,.2)}.btn-tumblr.active,.btn-tumblr.focus,.btn-tumblr:active,.btn-tumblr:focus,.btn-tumblr:hover,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,.2)}.btn-tumblr.disabled,.btn-tumblr.disabled.active,.btn-tumblr.disabled.focus,.btn-tumblr.disabled:active,.btn-tumblr.disabled:focus,.btn-tumblr.disabled:hover,.btn-tumblr[disabled],.btn-tumblr[disabled].active,.btn-tumblr[disabled].focus,.btn-tumblr[disabled]:active,.btn-tumblr[disabled]:focus,.btn-tumblr[disabled]:hover,fieldset[disabled] .btn-tumblr,fieldset[disabled] .btn-tumblr.active,fieldset[disabled] .btn-tumblr.focus,fieldset[disabled] .btn-tumblr:active,fieldset[disabled] .btn-tumblr:focus,fieldset[disabled] .btn-tumblr:hover{background-color:#2c4762;border-color:rgba(0,0,0,.2)}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,.2)}.btn-twitter.active,.btn-twitter.focus,.btn-twitter:active,.btn-twitter:focus,.btn-twitter:hover,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,.2)}.btn-twitter.disabled,.btn-twitter.disabled.active,.btn-twitter.disabled.focus,.btn-twitter.disabled:active,.btn-twitter.disabled:focus,.btn-twitter.disabled:hover,.btn-twitter[disabled],.btn-twitter[disabled].active,.btn-twitter[disabled].focus,.btn-twitter[disabled]:active,.btn-twitter[disabled]:focus,.btn-twitter[disabled]:hover,fieldset[disabled] .btn-twitter,fieldset[disabled] .btn-twitter.active,fieldset[disabled] .btn-twitter.focus,fieldset[disabled] .btn-twitter:active,fieldset[disabled] .btn-twitter:focus,fieldset[disabled] .btn-twitter:hover{background-color:#55acee;border-color:rgba(0,0,0,.2)}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,.2)}.btn-vimeo.active,.btn-vimeo.focus,.btn-vimeo:active,.btn-vimeo:focus,.btn-vimeo:hover,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,.2)}.btn-vimeo.disabled,.btn-vimeo.disabled.active,.btn-vimeo.disabled.focus,.btn-vimeo.disabled:active,.btn-vimeo.disabled:focus,.btn-vimeo.disabled:hover,.btn-vimeo[disabled],.btn-vimeo[disabled].active,.btn-vimeo[disabled].focus,.btn-vimeo[disabled]:active,.btn-vimeo[disabled]:focus,.btn-vimeo[disabled]:hover,fieldset[disabled] .btn-vimeo,fieldset[disabled] .btn-vimeo.active,fieldset[disabled] .btn-vimeo.focus,fieldset[disabled] .btn-vimeo:active,fieldset[disabled] .btn-vimeo:focus,fieldset[disabled] .btn-vimeo:hover{background-color:#1ab7ea;border-color:rgba(0,0,0,.2)}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,.2)}.btn-vk.active,.btn-vk.focus,.btn-vk:active,.btn-vk:focus,.btn-vk:hover,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,.2)}.btn-vk.disabled,.btn-vk.disabled.active,.btn-vk.disabled.focus,.btn-vk.disabled:active,.btn-vk.disabled:focus,.btn-vk.disabled:hover,.btn-vk[disabled],.btn-vk[disabled].active,.btn-vk[disabled].focus,.btn-vk[disabled]:active,.btn-vk[disabled]:focus,.btn-vk[disabled]:hover,fieldset[disabled] .btn-vk,fieldset[disabled] .btn-vk.active,fieldset[disabled] .btn-vk.focus,fieldset[disabled] .btn-vk:active,fieldset[disabled] .btn-vk:focus,fieldset[disabled] .btn-vk:hover{background-color:#587ea3;border-color:rgba(0,0,0,.2)}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,.2)}.btn-yahoo.active,.btn-yahoo.focus,.btn-yahoo:active,.btn-yahoo:focus,.btn-yahoo:hover,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,.2)}.btn-yahoo.disabled,.btn-yahoo.disabled.active,.btn-yahoo.disabled.focus,.btn-yahoo.disabled:active,.btn-yahoo.disabled:focus,.btn-yahoo.disabled:hover,.btn-yahoo[disabled],.btn-yahoo[disabled].active,.btn-yahoo[disabled].focus,.btn-yahoo[disabled]:active,.btn-yahoo[disabled]:focus,.btn-yahoo[disabled]:hover,fieldset[disabled] .btn-yahoo,fieldset[disabled] .btn-yahoo.active,fieldset[disabled] .btn-yahoo.focus,fieldset[disabled] .btn-yahoo:active,fieldset[disabled] .btn-yahoo:focus,fieldset[disabled] .btn-yahoo:hover{background-color:#720e9e;border-color:rgba(0,0,0,.2)}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;color:#444;border-color:#ddd}.fc-button.hover,.fc-button:active,.fc-button:hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-content:first-of-type,.fc-widget-header:first-of-type{border-left:0;border-right:0}.fc-widget-content:last-of-type,.fc-widget-header:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{transition:-webkit-transform linear .3s;transition:transform linear .3s;transition:transform linear .3s,-webkit-transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{transition:all linear .3s}.external-event{padding:5px 10px;font-weight:700;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);text-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,.2)}.select2-container--default.select2-container--focus,.select2-container--default:active,.select2-container--default:focus,.select2-selection.select2-container--focus,.select2-selection:active,.select2-selection:focus{outline:0}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:#fff}.select2-results__option{padding:6px 12px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;height:auto;margin-top:-4px}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:0;border:1px solid #3c8dbc}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.list-header,.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.alert-danger,.alert-error,.alert-info,.alert-success,.alert-warning,.bg-aqua,.bg-aqua-active,.bg-black,.bg-black-active,.bg-blue,.bg-blue-active,.bg-fuchsia,.bg-fuchsia-active,.bg-green,.bg-green-active,.bg-light-blue,.bg-light-blue-active,.bg-lime,.bg-lime-active,.bg-maroon,.bg-maroon-active,.bg-navy,.bg-navy-active,.bg-olive,.bg-olive-active,.bg-orange,.bg-orange-active,.bg-purple,.bg-purple-active,.bg-red,.bg-red-active,.bg-teal,.bg-teal-active,.bg-yellow,.bg-yellow-active,.callout.callout-danger,.callout.callout-info,.callout.callout-success,.callout.callout-warning,.label-danger,.label-info,.label-primary,.label-success,.label-warning,.modal-danger .modal-body,.modal-danger .modal-footer,.modal-danger .modal-header,.modal-info .modal-body,.modal-info .modal-footer,.modal-info .modal-header,.modal-primary .modal-body,.modal-primary .modal-footer,.modal-primary .modal-header,.modal-success .modal-body,.modal-success .modal-footer,.modal-success .modal-header,.modal-warning .modal-body,.modal-warning .modal-footer,.modal-warning .modal-header{color:#fff!important}.bg-gray{color:#000;background-color:#d2d6de!important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111!important}.alert-danger,.alert-error,.bg-red,.callout.callout-danger,.label-danger,.modal-danger .modal-body{background-color:#dd4b39!important}.alert-warning,.bg-yellow,.callout.callout-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12!important}.alert-info,.bg-aqua,.callout.callout-info,.label-info,.modal-info .modal-body{background-color:#00c0ef!important}.bg-blue{background-color:#0073b7!important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc!important}.alert-success,.bg-green,.callout.callout-success,.label-success,.modal-success .modal-body{background-color:#00a65a!important}.bg-navy{background-color:#001F3F!important}.bg-teal{background-color:#39CCCC!important}.bg-olive{background-color:#3D9970!important}.bg-lime{background-color:#01FF70!important}.bg-orange{background-color:#FF851B!important}.bg-fuchsia{background-color:#F012BE!important}.bg-purple{background-color:#605ca8!important}.bg-maroon{background-color:#D81B60!important}.bg-gray-active{color:#000;background-color:#b5bbc8!important}.bg-black-active{background-color:#000!important}.bg-red-active,.modal-danger .modal-footer,.modal-danger .modal-header{background-color:#d33724!important}.bg-yellow-active,.modal-warning .modal-footer,.modal-warning .modal-header{background-color:#db8b0b!important}.bg-aqua-active,.modal-info .modal-footer,.modal-info .modal-header{background-color:#00a7d0!important}.bg-blue-active{background-color:#005384!important}.bg-light-blue-active,.modal-primary .modal-footer,.modal-primary .modal-header{background-color:#357ca5!important}.bg-green-active,.modal-success .modal-footer,.modal-success .modal-header{background-color:#008d4c!important}.bg-navy-active{background-color:#001a35!important}.bg-teal-active{background-color:#30bbbb!important}.bg-olive-active{background-color:#368763!important}.bg-lime-active{background-color:#00e765!important}.bg-orange-active{background-color:#ff7701!important}.bg-fuchsia-active{background-color:#db0ead!important}.bg-purple-active{background-color:#555299!important}.bg-maroon-active{background-color:#ca195a!important}[class^=bg-].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39!important}.text-yellow{color:#f39c12!important}.text-aqua{color:#00c0ef!important}.text-blue{color:#0073b7!important}.text-black{color:#111!important}.text-light-blue{color:#3c8dbc!important}.text-green{color:#00a65a!important}.text-gray{color:#d2d6de!important}.text-navy{color:#001F3F!important}.text-teal{color:#39CCCC!important}.text-olive{color:#3D9970!important}.text-lime{color:#01FF70!important}.text-orange{color:#FF851B!important}.text-fuchsia{color:#F012BE!important}.text-purple{color:#605ca8!important}.text-maroon{color:#D81B60!important}.link-muted{color:#7a869d}.link-muted:focus,.link-muted:hover{color:#606c84}.link-black{color:#666}.link-black:focus,.link-black:hover{color:#999}.hide{display:none!important}.no-border{border:0!important}.no-padding{padding:0!important}.no-margin{margin:0!important}.no-shadow{box-shadow:none!important}.chart-legend,.contacts-list,.list-unstyled,.users-list{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0!important}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39CCCC!important;background:-o-linear-gradient(#7adddd,#39CCCC)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39CCCC', GradientType=0)!important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc!important;background:-o-linear-gradient(#67a8ce,#3c8dbc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0)!important;color:#fff}.bg-blue-gradient{background:#0073b7!important;background:-o-linear-gradient(#0089db,#0073b7)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0)!important;color:#fff}.bg-aqua-gradient{background:#00c0ef!important;background:-o-linear-gradient(#14d1ff,#00c0ef)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0)!important;color:#fff}.bg-yellow-gradient{background:#f39c12!important;background:-o-linear-gradient(#f7bc60,#f39c12)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0)!important;color:#fff}.bg-purple-gradient{background:#605ca8!important;background:-o-linear-gradient(#9491c4,#605ca8)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0)!important;color:#fff}.bg-green-gradient{background:#00a65a!important;background:-o-linear-gradient(#00ca6d,#00a65a)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0)!important;color:#fff}.bg-red-gradient{background:#dd4b39!important;background:-o-linear-gradient(#e47365,#dd4b39)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0)!important;color:#fff}.bg-black-gradient{background:#111!important;background:-o-linear-gradient(#2b2b2b,#111)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111', GradientType=0)!important;color:#fff}.bg-maroon-gradient{background:#D81B60!important;background:-o-linear-gradient(#e73f7c,#D81B60)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#D81B60', GradientType=0)!important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:after,.user-block:before{content:" ";display:table}.user-block img{width:40px;height:40px;float:left}.user-block .comment,.user-block .description,.user-block .username{display:block;margin-left:50px}.img-sm+.img-push,.user-block.user-block-sm .comment,.user-block.user-block-sm .description,.user-block.user-block-sm .username{margin-left:40px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username{font-size:14px}.box-comments .box-comment img,.img-lg,.img-md,.img-sm,.user-block.user-block-sm img{float:left}.box-comments .box-comment img,.img-sm,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.attachment-block .attachment-pushed,.img-lg+.img-push{margin-left:110px}.img-lg{width:100px;height:100px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.btn-file,.chart{position:relative}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{overflow:hidden;width:100%}.chart canvas,.chart svg{width:100%!important}@media print{.content-header,.left-side,.main-header,.main-sidebar,.no-print{display:none!important}.content-wrapper,.main-footer,.right-side{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0,0)!important;transform:translate(0,0)!important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr td,.table-responsive>.table tr th{white-space:normal!important}}.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav>.active>a,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav>li>a:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,.1);background-color:#367fa9}.skin-blue .main-header .navbar .sidebar-toggle,.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:0 0}.skin-blue .left-side,.skin-blue .main-sidebar,.skin-blue .wrapper{background-color:#222d32}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li:hover>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-blue .sidebar-form .btn,.skin-blue .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;transition:all .3s ease-in-out}.skin-blue .sidebar-form input[type=text]{color:#666;border-radius:2px 0 0 2px}.skin-blue .sidebar-form input[type=text]:focus,.skin-blue .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-radius:0 2px 2px 0}.skin-blue.layout-top-nav .main-header>.logo .logo-variant{background-color:none}.skin-blue .main-header .logo{background-color:inherit}.main-header .logo{width:100%!important;white-space:nowrap;text-align:left;display:block}.huge{font-size:40px}.btn-file{overflow:hidden}.dropdown-menu>li>a{color:#354044}#sort tr.cansort{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:3px;border-left:2px solid #e6e7e8;color:#444;cursor:move}.user-image-inline{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px}.input-group .input-group-addon{background-color:#f4f4f4}a.accordion-header{color:#333}.dynamic-form-row{padding:10px;margin:20px}.handle{padding-left:10px}.btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;filter:alpha(opacity=0);opacity:0;outline:0;background:#fff;cursor:inherit;display:block}.main-footer{font-size:13px}.main-header{max-height:150px}.navbar-brand-img{float:left;padding:5px 5px 5px 0}.navbar-nav>.user-menu>.dropdown-menu{width:inherit}.main-header .logo{padding:0 5px 0 15px}.sidebar-toggle{margin-left:-48px;z-index:100;background-color:inherit}.sidebar-toggle-mobile{z-index:100;width:50px;padding-top:10px}.main-header .sidebar-toggle:before{content:"\f0c9"}.direct-chat-contacts{padding:10px;height:150px}.select2-container{width:100%}.error input{color:#dd4b39;border:2px solid #dd4b39!important}.alert-msg,.error label{color:#dd4b39;display:block}.input-group[class*=col-]{padding-right:15px;padding-left:15px}.control-label.multiline{padding-top:10px}.btn-outline{color:inherit;background-color:transparent;transition:all .5s}.btn-primary.btn-outline{color:#428bca}.btn-success.btn-outline{color:#5cb85c}.btn-info.btn-outline{color:#5bc0de}.btn-warning.btn-outline{color:#f0ad4e}.btn-danger.btn-outline{color:#d9534f}.btn-danger.btn-outline:hover,.btn-info.btn-outline:hover,.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-warning.btn-outline:hover{color:#fff}.slideout-menu{position:fixed;top:0;right:-250px;width:250px;height:100%;background:#333;z-index:100;margin-top:100px;color:#fff;padding:10px}.slideout-menu h3{position:relative;padding:5px;color:#fff;font-size:1.2em;font-weight:400;border-bottom:4px solid #222}.slideout-menu .slideout-menu-toggle{position:absolute;top:12px;right:10px;display:inline-block;padding:6px 9px 5px;font-family:Arial,sans-serif;font-weight:700;line-height:1;background:#222;color:#999;text-decoration:none;vertical-align:top}.slideout-menu .slideout-menu-toggle:hover{color:#fff}.slideout-menu ul{list-style:none;font-weight:300;border-top:1px solid #151515;border-bottom:1px solid #454545}.slideout-menu ul li{border-top:1px solid #454545;border-bottom:1px solid #151515}.slideout-menu ul li a{position:relative;display:block;padding:10px;color:#999;text-decoration:none}.slideout-menu ul li a:hover{background:#000;color:#fff}.slideout-menu ul li a i{position:absolute;top:15px;right:10px;opacity:.5}.btn-box-tool-lg{font-size:16px;color:orange}.bs-wizard{margin-top:20px;border-bottom:solid 1px #e0e0e0;padding:0 0 10px}.bs-wizard>.bs-wizard-step{padding:0;position:relative}.bs-wizard>.bs-wizard-step .bs-wizard-stepnum{color:#595959;font-size:16px;margin-bottom:5px}.bs-wizard>.bs-wizard-step .bs-wizard-info{color:#999;font-size:14px}.bs-wizard>.bs-wizard-step>.bs-wizard-dot{position:absolute;width:30px;height:30px;display:block;background:#fbe8aa;top:45px;left:50%;margin-top:-15px;margin-left:-15px;border-radius:50%}.bs-wizard>.bs-wizard-step>.bs-wizard-dot:after{content:' ';width:14px;height:14px;background:#fbbd19;border-radius:50px;position:absolute;top:8px;left:8px}.bs-wizard>.bs-wizard-step>.progress{position:relative;border-radius:0;height:8px;box-shadow:none;margin:20px 0}.bs-wizard>.bs-wizard-step>.progress>.progress-bar{width:0;box-shadow:none;background:#fbe8aa}.bs-wizard>.bs-wizard-step.complete>.progress>.progress-bar{width:100%}.bs-wizard>.bs-wizard-step.active>.progress>.progress-bar{width:50%}.bs-wizard>.bs-wizard-step:first-child.active>.progress>.progress-bar{width:0}.bs-wizard>.bs-wizard-step:last-child.active>.progress>.progress-bar{width:100%}.bs-wizard>.bs-wizard-step.disabled>.bs-wizard-dot{background-color:#f5f5f5}.bs-wizard>.bs-wizard-step.disabled>.bs-wizard-dot:after{opacity:0}.bs-wizard>.bs-wizard-step:first-child>.progress{left:50%;width:50%}.bs-wizard>.bs-wizard-step:last-child>.progress{width:50%}.bs-wizard>.bs-wizard-step.disabled a.bs-wizard-dot{pointer-events:none}.left-navblock{display:inline-block;float:left;text-align:left;color:#fff;padding:0}.skin-blue .main-header .navbar .dropdown-menu li a{color:#333}a.logo.no-hover a:hover{background-color:transparent}.required{border-right:6px solid orange}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:13px}.sidebar-menu{font-size:14px;white-space:normal}@media print{a[href]:after{content:none}.tab-content>.tab-pane{display:block!important;opacity:1!important;visibility:visible!important}} \ No newline at end of file diff --git a/public/assets/js/all.js b/public/assets/js/all.js index ffa3886b50..bb303575c9 100644 --- a/public/assets/js/all.js +++ b/public/assets/js/all.js @@ -34924,6 +34924,38 @@ var Lightbox = (function ($) { * @return {IIFE} Immediately invoked. Returns self. */ +var lineOptions = { + + legend: { + position: "bottom" + }, + scales: { + yAxes: [{ + ticks: { + fontColor: "rgba(0,0,0,0.5)", + fontStyle: "bold", + beginAtZero: true, + maxTicksLimit: 5, + padding: 20 + }, + gridLines: { + drawTicks: false, + display: false + } + }], + xAxes: [{ + gridLines: { + zeroLineColor: "transparent" + }, + ticks: { + padding: 20, + fontColor: "rgba(0,0,0,0.5)", + fontStyle: "bold" + } + }] + } + +}; var pieOptions = { //Boolean - Whether we should show a stroke on each segment diff --git a/public/assets/js/all.js.map b/public/assets/js/all.js.map index 96af650822..acef0e96ac 100644 --- a/public/assets/js/all.js.map +++ b/public/assets/js/all.js.map @@ -1 +1 @@ -{"version":3,"sources":["tether.js","vue-dist.js","jquery-ui.js","jquery.slimscroll.js","jquery.iframe-transport.js","jquery.fileupload.js","fastclick.js","bootstrap-colorpicker.js","bootstrap-datepicker.js","icheck.js","select2.full.js","ekko-lightbox.js","snipeit.js","app.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjxkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC18CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACz0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpyMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"all.js","sourcesContent":["/*! tether 1.4.0 */\n\n(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if (typeof exports === 'object') {\n module.exports = factory(require, exports, module);\n } else {\n root.Tether = factory();\n }\n}(this, function(require, exports, module) {\n\n'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar TetherBase = undefined;\nif (typeof TetherBase === 'undefined') {\n TetherBase = { modules: [] };\n}\n\nvar zeroElement = null;\n\n// Same as native getBoundingClientRect, except it takes into account parent offsets\n// if the element lies within a nested document ( or \");\n\n // The first load event gets fired after the iframe has been injected\n // into the DOM, and is used to prepare the actual submission.\n iframe.one(\"load\", function() {\n\n // The second load event gets fired when the response to the form\n // submission is received. The implementation detects whether the\n // actual payload is embedded in a `\\\";\\n\\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\\n} )();\\nvar documentElement = document.documentElement;\\n\\n\\n\\nvar\\n\\trkeyEvent = /^key/,\\n\\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\\n\\trtypenamespace = /^([^.]*)(?:\\\\.(.+)|)/;\\n\\nfunction returnTrue() {\\n\\treturn true;\\n}\\n\\nfunction returnFalse() {\\n\\treturn false;\\n}\\n\\n// Support: IE <=9 only\\n// See #13393 for more info\\nfunction safeActiveElement() {\\n\\ttry {\\n\\t\\treturn document.activeElement;\\n\\t} catch ( err ) { }\\n}\\n\\nfunction on( elem, types, selector, data, fn, one ) {\\n\\tvar origFn, type;\\n\\n\\t// Types can be a map of types/handlers\\n\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t// ( types-Object, selector, data )\\n\\t\\tif ( typeof selector !== \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types-Object, data )\\n\\t\\t\\tdata = data || selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tfor ( type in types ) {\\n\\t\\t\\ton( elem, type, selector, data, types[ type ], one );\\n\\t\\t}\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( data == null && fn == null ) {\\n\\n\\t\\t// ( types, fn )\\n\\t\\tfn = selector;\\n\\t\\tdata = selector = undefined;\\n\\t} else if ( fn == null ) {\\n\\t\\tif ( typeof selector === \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types, selector, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t} else {\\n\\n\\t\\t\\t// ( types, data, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t}\\n\\tif ( fn === false ) {\\n\\t\\tfn = returnFalse;\\n\\t} else if ( !fn ) {\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( one === 1 ) {\\n\\t\\torigFn = fn;\\n\\t\\tfn = function( event ) {\\n\\n\\t\\t\\t// Can use an empty set, since event contains the info\\n\\t\\t\\tjQuery().off( event );\\n\\t\\t\\treturn origFn.apply( this, arguments );\\n\\t\\t};\\n\\n\\t\\t// Use same guid so caller can remove using origFn\\n\\t\\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\\n\\t}\\n\\treturn elem.each( function() {\\n\\t\\tjQuery.event.add( this, types, fn, data, selector );\\n\\t} );\\n}\\n\\n/*\\n * Helper functions for managing events -- not part of the public interface.\\n * Props to Dean Edwards' addEvent library for many of the ideas.\\n */\\njQuery.event = {\\n\\n\\tglobal: {},\\n\\n\\tadd: function( elem, types, handler, data, selector ) {\\n\\n\\t\\tvar handleObjIn, eventHandle, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.get( elem );\\n\\n\\t\\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\\n\\t\\tif ( !elemData ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Caller can pass in an object of custom data in lieu of the handler\\n\\t\\tif ( handler.handler ) {\\n\\t\\t\\thandleObjIn = handler;\\n\\t\\t\\thandler = handleObjIn.handler;\\n\\t\\t\\tselector = handleObjIn.selector;\\n\\t\\t}\\n\\n\\t\\t// Ensure that invalid selectors throw exceptions at attach time\\n\\t\\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\\n\\t\\tif ( selector ) {\\n\\t\\t\\tjQuery.find.matchesSelector( documentElement, selector );\\n\\t\\t}\\n\\n\\t\\t// Make sure that the handler has a unique ID, used to find/remove it later\\n\\t\\tif ( !handler.guid ) {\\n\\t\\t\\thandler.guid = jQuery.guid++;\\n\\t\\t}\\n\\n\\t\\t// Init the element's event structure and main handler, if this is the first\\n\\t\\tif ( !( events = elemData.events ) ) {\\n\\t\\t\\tevents = elemData.events = {};\\n\\t\\t}\\n\\t\\tif ( !( eventHandle = elemData.handle ) ) {\\n\\t\\t\\teventHandle = elemData.handle = function( e ) {\\n\\n\\t\\t\\t\\t// Discard the second event of a jQuery.event.trigger() and\\n\\t\\t\\t\\t// when an event is called after a page has unloaded\\n\\t\\t\\t\\treturn typeof jQuery !== \\\"undefined\\\" && jQuery.event.triggered !== e.type ?\\n\\t\\t\\t\\t\\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\\n\\t\\t\\t};\\n\\t\\t}\\n\\n\\t\\t// Handle multiple events separated by a space\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// There *must* be a type, no attaching namespace-only handlers\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If event changes its type, use the special event handlers for the changed type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// If selector defined, determine special event api type, otherwise given type\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\n\\t\\t\\t// Update special based on newly reset type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// handleObj is passed to all event handlers\\n\\t\\t\\thandleObj = jQuery.extend( {\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\torigType: origType,\\n\\t\\t\\t\\tdata: data,\\n\\t\\t\\t\\thandler: handler,\\n\\t\\t\\t\\tguid: handler.guid,\\n\\t\\t\\t\\tselector: selector,\\n\\t\\t\\t\\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\\n\\t\\t\\t\\tnamespace: namespaces.join( \\\".\\\" )\\n\\t\\t\\t}, handleObjIn );\\n\\n\\t\\t\\t// Init the event handler queue if we're the first\\n\\t\\t\\tif ( !( handlers = events[ type ] ) ) {\\n\\t\\t\\t\\thandlers = events[ type ] = [];\\n\\t\\t\\t\\thandlers.delegateCount = 0;\\n\\n\\t\\t\\t\\t// Only use addEventListener if the special events handler returns false\\n\\t\\t\\t\\tif ( !special.setup ||\\n\\t\\t\\t\\t\\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\\n\\n\\t\\t\\t\\t\\tif ( elem.addEventListener ) {\\n\\t\\t\\t\\t\\t\\telem.addEventListener( type, eventHandle );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( special.add ) {\\n\\t\\t\\t\\tspecial.add.call( elem, handleObj );\\n\\n\\t\\t\\t\\tif ( !handleObj.handler.guid ) {\\n\\t\\t\\t\\t\\thandleObj.handler.guid = handler.guid;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add to the element's handler list, delegates in front\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\thandlers.splice( handlers.delegateCount++, 0, handleObj );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\thandlers.push( handleObj );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Keep track of which events have ever been used, for event optimization\\n\\t\\t\\tjQuery.event.global[ type ] = true;\\n\\t\\t}\\n\\n\\t},\\n\\n\\t// Detach an event or set of events from an element\\n\\tremove: function( elem, types, handler, selector, mappedTypes ) {\\n\\n\\t\\tvar j, origCount, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\\n\\n\\t\\tif ( !elemData || !( events = elemData.events ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Once for each type.namespace in types; type may be omitted\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// Unbind all events (on this namespace, if provided) for the element\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\t\\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\t\\t\\thandlers = events[ type ] || [];\\n\\t\\t\\ttmp = tmp[ 2 ] &&\\n\\t\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" );\\n\\n\\t\\t\\t// Remove matching events\\n\\t\\t\\torigCount = j = handlers.length;\\n\\t\\t\\twhile ( j-- ) {\\n\\t\\t\\t\\thandleObj = handlers[ j ];\\n\\n\\t\\t\\t\\tif ( ( mappedTypes || origType === handleObj.origType ) &&\\n\\t\\t\\t\\t\\t( !handler || handler.guid === handleObj.guid ) &&\\n\\t\\t\\t\\t\\t( !tmp || tmp.test( handleObj.namespace ) ) &&\\n\\t\\t\\t\\t\\t( !selector || selector === handleObj.selector ||\\n\\t\\t\\t\\t\\t\\tselector === \\\"**\\\" && handleObj.selector ) ) {\\n\\t\\t\\t\\t\\thandlers.splice( j, 1 );\\n\\n\\t\\t\\t\\t\\tif ( handleObj.selector ) {\\n\\t\\t\\t\\t\\t\\thandlers.delegateCount--;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( special.remove ) {\\n\\t\\t\\t\\t\\t\\tspecial.remove.call( elem, handleObj );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Remove generic event handler if we removed something and no more handlers exist\\n\\t\\t\\t// (avoids potential for endless recursion during removal of special event handlers)\\n\\t\\t\\tif ( origCount && !handlers.length ) {\\n\\t\\t\\t\\tif ( !special.teardown ||\\n\\t\\t\\t\\t\\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\\n\\n\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, elemData.handle );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tdelete events[ type ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Remove data and the expando if it's no longer used\\n\\t\\tif ( jQuery.isEmptyObject( events ) ) {\\n\\t\\t\\tdataPriv.remove( elem, \\\"handle events\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tdispatch: function( nativeEvent ) {\\n\\n\\t\\t// Make a writable jQuery.Event from the native event object\\n\\t\\tvar event = jQuery.event.fix( nativeEvent );\\n\\n\\t\\tvar i, j, ret, matched, handleObj, handlerQueue,\\n\\t\\t\\targs = new Array( arguments.length ),\\n\\t\\t\\thandlers = ( dataPriv.get( this, \\\"events\\\" ) || {} )[ event.type ] || [],\\n\\t\\t\\tspecial = jQuery.event.special[ event.type ] || {};\\n\\n\\t\\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\\n\\t\\targs[ 0 ] = event;\\n\\n\\t\\tfor ( i = 1; i < arguments.length; i++ ) {\\n\\t\\t\\targs[ i ] = arguments[ i ];\\n\\t\\t}\\n\\n\\t\\tevent.delegateTarget = this;\\n\\n\\t\\t// Call the preDispatch hook for the mapped type, and let it bail if desired\\n\\t\\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine handlers\\n\\t\\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\\n\\n\\t\\t// Run delegates first; they may want to stop propagation beneath us\\n\\t\\ti = 0;\\n\\t\\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\t\\t\\tevent.currentTarget = matched.elem;\\n\\n\\t\\t\\tj = 0;\\n\\t\\t\\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\\n\\t\\t\\t\\t!event.isImmediatePropagationStopped() ) {\\n\\n\\t\\t\\t\\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\\n\\t\\t\\t\\t// a subset or equal to those in the bound event (both can have no namespace).\\n\\t\\t\\t\\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\\n\\n\\t\\t\\t\\t\\tevent.handleObj = handleObj;\\n\\t\\t\\t\\t\\tevent.data = handleObj.data;\\n\\n\\t\\t\\t\\t\\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\\n\\t\\t\\t\\t\\t\\thandleObj.handler ).apply( matched.elem, args );\\n\\n\\t\\t\\t\\t\\tif ( ret !== undefined ) {\\n\\t\\t\\t\\t\\t\\tif ( ( event.result = ret ) === false ) {\\n\\t\\t\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Call the postDispatch hook for the mapped type\\n\\t\\tif ( special.postDispatch ) {\\n\\t\\t\\tspecial.postDispatch.call( this, event );\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\thandlers: function( event, handlers ) {\\n\\t\\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\\n\\t\\t\\thandlerQueue = [],\\n\\t\\t\\tdelegateCount = handlers.delegateCount,\\n\\t\\t\\tcur = event.target;\\n\\n\\t\\t// Find delegate handlers\\n\\t\\tif ( delegateCount &&\\n\\n\\t\\t\\t// Support: IE <=9\\n\\t\\t\\t// Black-hole SVG instance trees (trac-13180)\\n\\t\\t\\tcur.nodeType &&\\n\\n\\t\\t\\t// Support: Firefox <=42\\n\\t\\t\\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\\n\\t\\t\\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\\n\\t\\t\\t// Support: IE 11 only\\n\\t\\t\\t// ...but not arrow key \\\"clicks\\\" of radio inputs, which can have `button` -1 (gh-2343)\\n\\t\\t\\t!( event.type === \\\"click\\\" && event.button >= 1 ) ) {\\n\\n\\t\\t\\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\\n\\n\\t\\t\\t\\t// Don't check non-elements (#13208)\\n\\t\\t\\t\\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\\n\\t\\t\\t\\tif ( cur.nodeType === 1 && !( event.type === \\\"click\\\" && cur.disabled === true ) ) {\\n\\t\\t\\t\\t\\tmatchedHandlers = [];\\n\\t\\t\\t\\t\\tmatchedSelectors = {};\\n\\t\\t\\t\\t\\tfor ( i = 0; i < delegateCount; i++ ) {\\n\\t\\t\\t\\t\\t\\thandleObj = handlers[ i ];\\n\\n\\t\\t\\t\\t\\t\\t// Don't conflict with Object.prototype properties (#13203)\\n\\t\\t\\t\\t\\t\\tsel = handleObj.selector + \\\" \\\";\\n\\n\\t\\t\\t\\t\\t\\tif ( matchedSelectors[ sel ] === undefined ) {\\n\\t\\t\\t\\t\\t\\t\\tmatchedSelectors[ sel ] = handleObj.needsContext ?\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery( sel, this ).index( cur ) > -1 :\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.find( sel, this, null, [ cur ] ).length;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif ( matchedSelectors[ sel ] ) {\\n\\t\\t\\t\\t\\t\\t\\tmatchedHandlers.push( handleObj );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( matchedHandlers.length ) {\\n\\t\\t\\t\\t\\t\\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Add the remaining (directly-bound) handlers\\n\\t\\tcur = this;\\n\\t\\tif ( delegateCount < handlers.length ) {\\n\\t\\t\\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\\n\\t\\t}\\n\\n\\t\\treturn handlerQueue;\\n\\t},\\n\\n\\taddProp: function( name, hook ) {\\n\\t\\tObject.defineProperty( jQuery.Event.prototype, name, {\\n\\t\\t\\tenumerable: true,\\n\\t\\t\\tconfigurable: true,\\n\\n\\t\\t\\tget: jQuery.isFunction( hook ) ?\\n\\t\\t\\t\\tfunction() {\\n\\t\\t\\t\\t\\tif ( this.originalEvent ) {\\n\\t\\t\\t\\t\\t\\t\\treturn hook( this.originalEvent );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} :\\n\\t\\t\\t\\tfunction() {\\n\\t\\t\\t\\t\\tif ( this.originalEvent ) {\\n\\t\\t\\t\\t\\t\\t\\treturn this.originalEvent[ name ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\tset: function( value ) {\\n\\t\\t\\t\\tObject.defineProperty( this, name, {\\n\\t\\t\\t\\t\\tenumerable: true,\\n\\t\\t\\t\\t\\tconfigurable: true,\\n\\t\\t\\t\\t\\twritable: true,\\n\\t\\t\\t\\t\\tvalue: value\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tfix: function( originalEvent ) {\\n\\t\\treturn originalEvent[ jQuery.expando ] ?\\n\\t\\t\\toriginalEvent :\\n\\t\\t\\tnew jQuery.Event( originalEvent );\\n\\t},\\n\\n\\tspecial: {\\n\\t\\tload: {\\n\\n\\t\\t\\t// Prevent triggered image.load events from bubbling to window.load\\n\\t\\t\\tnoBubble: true\\n\\t\\t},\\n\\t\\tfocus: {\\n\\n\\t\\t\\t// Fire native event if possible so blur/focus sequence is correct\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this !== safeActiveElement() && this.focus ) {\\n\\t\\t\\t\\t\\tthis.focus();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusin\\\"\\n\\t\\t},\\n\\t\\tblur: {\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this === safeActiveElement() && this.blur ) {\\n\\t\\t\\t\\t\\tthis.blur();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusout\\\"\\n\\t\\t},\\n\\t\\tclick: {\\n\\n\\t\\t\\t// For checkbox, fire native event so checked state will be right\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this.type === \\\"checkbox\\\" && this.click && nodeName( this, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tthis.click();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\t// For cross-browser consistency, don't fire native .click() on links\\n\\t\\t\\t_default: function( event ) {\\n\\t\\t\\t\\treturn nodeName( event.target, \\\"a\\\" );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tbeforeunload: {\\n\\t\\t\\tpostDispatch: function( event ) {\\n\\n\\t\\t\\t\\t// Support: Firefox 20+\\n\\t\\t\\t\\t// Firefox doesn't alert if the returnValue field is not set.\\n\\t\\t\\t\\tif ( event.result !== undefined && event.originalEvent ) {\\n\\t\\t\\t\\t\\tevent.originalEvent.returnValue = event.result;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.removeEvent = function( elem, type, handle ) {\\n\\n\\t// This \\\"if\\\" is needed for plain objects\\n\\tif ( elem.removeEventListener ) {\\n\\t\\telem.removeEventListener( type, handle );\\n\\t}\\n};\\n\\njQuery.Event = function( src, props ) {\\n\\n\\t// Allow instantiation without the 'new' keyword\\n\\tif ( !( this instanceof jQuery.Event ) ) {\\n\\t\\treturn new jQuery.Event( src, props );\\n\\t}\\n\\n\\t// Event object\\n\\tif ( src && src.type ) {\\n\\t\\tthis.originalEvent = src;\\n\\t\\tthis.type = src.type;\\n\\n\\t\\t// Events bubbling up the document may have been marked as prevented\\n\\t\\t// by a handler lower down the tree; reflect the correct value.\\n\\t\\tthis.isDefaultPrevented = src.defaultPrevented ||\\n\\t\\t\\t\\tsrc.defaultPrevented === undefined &&\\n\\n\\t\\t\\t\\t// Support: Android <=2.3 only\\n\\t\\t\\t\\tsrc.returnValue === false ?\\n\\t\\t\\treturnTrue :\\n\\t\\t\\treturnFalse;\\n\\n\\t\\t// Create target properties\\n\\t\\t// Support: Safari <=6 - 7 only\\n\\t\\t// Target should not be a text node (#504, #13143)\\n\\t\\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\\n\\t\\t\\tsrc.target.parentNode :\\n\\t\\t\\tsrc.target;\\n\\n\\t\\tthis.currentTarget = src.currentTarget;\\n\\t\\tthis.relatedTarget = src.relatedTarget;\\n\\n\\t// Event type\\n\\t} else {\\n\\t\\tthis.type = src;\\n\\t}\\n\\n\\t// Put explicitly provided properties onto the event object\\n\\tif ( props ) {\\n\\t\\tjQuery.extend( this, props );\\n\\t}\\n\\n\\t// Create a timestamp if incoming event doesn't have one\\n\\tthis.timeStamp = src && src.timeStamp || jQuery.now();\\n\\n\\t// Mark it as fixed\\n\\tthis[ jQuery.expando ] = true;\\n};\\n\\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\\njQuery.Event.prototype = {\\n\\tconstructor: jQuery.Event,\\n\\tisDefaultPrevented: returnFalse,\\n\\tisPropagationStopped: returnFalse,\\n\\tisImmediatePropagationStopped: returnFalse,\\n\\tisSimulated: false,\\n\\n\\tpreventDefault: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isDefaultPrevented = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.preventDefault();\\n\\t\\t}\\n\\t},\\n\\tstopPropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isPropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopPropagation();\\n\\t\\t}\\n\\t},\\n\\tstopImmediatePropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isImmediatePropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopImmediatePropagation();\\n\\t\\t}\\n\\n\\t\\tthis.stopPropagation();\\n\\t}\\n};\\n\\n// Includes all common event props including KeyEvent and MouseEvent specific props\\njQuery.each( {\\n\\taltKey: true,\\n\\tbubbles: true,\\n\\tcancelable: true,\\n\\tchangedTouches: true,\\n\\tctrlKey: true,\\n\\tdetail: true,\\n\\teventPhase: true,\\n\\tmetaKey: true,\\n\\tpageX: true,\\n\\tpageY: true,\\n\\tshiftKey: true,\\n\\tview: true,\\n\\t\\\"char\\\": true,\\n\\tcharCode: true,\\n\\tkey: true,\\n\\tkeyCode: true,\\n\\tbutton: true,\\n\\tbuttons: true,\\n\\tclientX: true,\\n\\tclientY: true,\\n\\toffsetX: true,\\n\\toffsetY: true,\\n\\tpointerId: true,\\n\\tpointerType: true,\\n\\tscreenX: true,\\n\\tscreenY: true,\\n\\ttargetTouches: true,\\n\\ttoElement: true,\\n\\ttouches: true,\\n\\n\\twhich: function( event ) {\\n\\t\\tvar button = event.button;\\n\\n\\t\\t// Add which for key events\\n\\t\\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\\n\\t\\t\\treturn event.charCode != null ? event.charCode : event.keyCode;\\n\\t\\t}\\n\\n\\t\\t// Add which for click: 1 === left; 2 === middle; 3 === right\\n\\t\\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\\n\\t\\t\\tif ( button & 1 ) {\\n\\t\\t\\t\\treturn 1;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( button & 2 ) {\\n\\t\\t\\t\\treturn 3;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( button & 4 ) {\\n\\t\\t\\t\\treturn 2;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\n\\t\\treturn event.which;\\n\\t}\\n}, jQuery.event.addProp );\\n\\n// Create mouseenter/leave events using mouseover/out and event-time checks\\n// so that event delegation works in jQuery.\\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\\n//\\n// Support: Safari 7 only\\n// Safari sends mouseenter too often; see:\\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\\n// for the description of the bug (it existed in older Chrome versions as well).\\njQuery.each( {\\n\\tmouseenter: \\\"mouseover\\\",\\n\\tmouseleave: \\\"mouseout\\\",\\n\\tpointerenter: \\\"pointerover\\\",\\n\\tpointerleave: \\\"pointerout\\\"\\n}, function( orig, fix ) {\\n\\tjQuery.event.special[ orig ] = {\\n\\t\\tdelegateType: fix,\\n\\t\\tbindType: fix,\\n\\n\\t\\thandle: function( event ) {\\n\\t\\t\\tvar ret,\\n\\t\\t\\t\\ttarget = this,\\n\\t\\t\\t\\trelated = event.relatedTarget,\\n\\t\\t\\t\\thandleObj = event.handleObj;\\n\\n\\t\\t\\t// For mouseenter/leave call the handler if related is outside the target.\\n\\t\\t\\t// NB: No relatedTarget if the mouse left/entered the browser window\\n\\t\\t\\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\\n\\t\\t\\t\\tevent.type = handleObj.origType;\\n\\t\\t\\t\\tret = handleObj.handler.apply( this, arguments );\\n\\t\\t\\t\\tevent.type = fix;\\n\\t\\t\\t}\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\ton: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn );\\n\\t},\\n\\tone: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn, 1 );\\n\\t},\\n\\toff: function( types, selector, fn ) {\\n\\t\\tvar handleObj, type;\\n\\t\\tif ( types && types.preventDefault && types.handleObj ) {\\n\\n\\t\\t\\t// ( event ) dispatched jQuery.Event\\n\\t\\t\\thandleObj = types.handleObj;\\n\\t\\t\\tjQuery( types.delegateTarget ).off(\\n\\t\\t\\t\\thandleObj.namespace ?\\n\\t\\t\\t\\t\\thandleObj.origType + \\\".\\\" + handleObj.namespace :\\n\\t\\t\\t\\t\\thandleObj.origType,\\n\\t\\t\\t\\thandleObj.selector,\\n\\t\\t\\t\\thandleObj.handler\\n\\t\\t\\t);\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t\\t// ( types-object [, selector] )\\n\\t\\t\\tfor ( type in types ) {\\n\\t\\t\\t\\tthis.off( type, selector, types[ type ] );\\n\\t\\t\\t}\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( selector === false || typeof selector === \\\"function\\\" ) {\\n\\n\\t\\t\\t// ( types [, fn] )\\n\\t\\t\\tfn = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tif ( fn === false ) {\\n\\t\\t\\tfn = returnFalse;\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.remove( this, types, fn, selector );\\n\\t\\t} );\\n\\t}\\n} );\\n\\n\\nvar\\n\\n\\t/* eslint-disable max-len */\\n\\n\\t// See https://github.com/eslint/eslint/issues/3229\\n\\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\\\/\\\\0>\\\\x20\\\\t\\\\r\\\\n\\\\f]*)[^>]*)\\\\/>/gi,\\n\\n\\t/* eslint-enable */\\n\\n\\t// Support: IE <=10 - 11, Edge 12 - 13\\n\\t// In IE/Edge using regex groups here causes severe slowdowns.\\n\\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\\n\\trnoInnerhtml = /\\\\s*$/g;\\n\\n// Prefer a tbody over its parent table for containing new rows\\nfunction manipulationTarget( elem, content ) {\\n\\tif ( nodeName( elem, \\\"table\\\" ) &&\\n\\t\\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \\\"tr\\\" ) ) {\\n\\n\\t\\treturn jQuery( \\\">tbody\\\", elem )[ 0 ] || elem;\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\n// Replace/restore the type attribute of script elements for safe DOM manipulation\\nfunction disableScript( elem ) {\\n\\telem.type = ( elem.getAttribute( \\\"type\\\" ) !== null ) + \\\"/\\\" + elem.type;\\n\\treturn elem;\\n}\\nfunction restoreScript( elem ) {\\n\\tvar match = rscriptTypeMasked.exec( elem.type );\\n\\n\\tif ( match ) {\\n\\t\\telem.type = match[ 1 ];\\n\\t} else {\\n\\t\\telem.removeAttribute( \\\"type\\\" );\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\nfunction cloneCopyEvent( src, dest ) {\\n\\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\\n\\n\\tif ( dest.nodeType !== 1 ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// 1. Copy private data: events, handlers, etc.\\n\\tif ( dataPriv.hasData( src ) ) {\\n\\t\\tpdataOld = dataPriv.access( src );\\n\\t\\tpdataCur = dataPriv.set( dest, pdataOld );\\n\\t\\tevents = pdataOld.events;\\n\\n\\t\\tif ( events ) {\\n\\t\\t\\tdelete pdataCur.handle;\\n\\t\\t\\tpdataCur.events = {};\\n\\n\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tjQuery.event.add( dest, type, events[ type ][ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// 2. Copy user data\\n\\tif ( dataUser.hasData( src ) ) {\\n\\t\\tudataOld = dataUser.access( src );\\n\\t\\tudataCur = jQuery.extend( {}, udataOld );\\n\\n\\t\\tdataUser.set( dest, udataCur );\\n\\t}\\n}\\n\\n// Fix IE bugs, see support tests\\nfunction fixInput( src, dest ) {\\n\\tvar nodeName = dest.nodeName.toLowerCase();\\n\\n\\t// Fails to persist the checked state of a cloned checkbox or radio button.\\n\\tif ( nodeName === \\\"input\\\" && rcheckableType.test( src.type ) ) {\\n\\t\\tdest.checked = src.checked;\\n\\n\\t// Fails to return the selected option to the default selected state when cloning options\\n\\t} else if ( nodeName === \\\"input\\\" || nodeName === \\\"textarea\\\" ) {\\n\\t\\tdest.defaultValue = src.defaultValue;\\n\\t}\\n}\\n\\nfunction domManip( collection, args, callback, ignored ) {\\n\\n\\t// Flatten any nested arrays\\n\\targs = concat.apply( [], args );\\n\\n\\tvar fragment, first, scripts, hasScripts, node, doc,\\n\\t\\ti = 0,\\n\\t\\tl = collection.length,\\n\\t\\tiNoClone = l - 1,\\n\\t\\tvalue = args[ 0 ],\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t// We can't cloneNode fragments that contain checked, in WebKit\\n\\tif ( isFunction ||\\n\\t\\t\\t( l > 1 && typeof value === \\\"string\\\" &&\\n\\t\\t\\t\\t!support.checkClone && rchecked.test( value ) ) ) {\\n\\t\\treturn collection.each( function( index ) {\\n\\t\\t\\tvar self = collection.eq( index );\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\targs[ 0 ] = value.call( this, index, self.html() );\\n\\t\\t\\t}\\n\\t\\t\\tdomManip( self, args, callback, ignored );\\n\\t\\t} );\\n\\t}\\n\\n\\tif ( l ) {\\n\\t\\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\\n\\t\\tfirst = fragment.firstChild;\\n\\n\\t\\tif ( fragment.childNodes.length === 1 ) {\\n\\t\\t\\tfragment = first;\\n\\t\\t}\\n\\n\\t\\t// Require either new content or an interest in ignored elements to invoke the callback\\n\\t\\tif ( first || ignored ) {\\n\\t\\t\\tscripts = jQuery.map( getAll( fragment, \\\"script\\\" ), disableScript );\\n\\t\\t\\thasScripts = scripts.length;\\n\\n\\t\\t\\t// Use the original fragment for the last item\\n\\t\\t\\t// instead of the first because it can end up\\n\\t\\t\\t// being emptied incorrectly in certain situations (#8070).\\n\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\tnode = fragment;\\n\\n\\t\\t\\t\\tif ( i !== iNoClone ) {\\n\\t\\t\\t\\t\\tnode = jQuery.clone( node, true, true );\\n\\n\\t\\t\\t\\t\\t// Keep references to cloned scripts for later restoration\\n\\t\\t\\t\\t\\tif ( hasScripts ) {\\n\\n\\t\\t\\t\\t\\t\\t// Support: Android <=4.0 only, PhantomJS 1 only\\n\\t\\t\\t\\t\\t\\t// push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\t\\t\\t\\tjQuery.merge( scripts, getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tcallback.call( collection[ i ], node, i );\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hasScripts ) {\\n\\t\\t\\t\\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\\n\\n\\t\\t\\t\\t// Reenable scripts\\n\\t\\t\\t\\tjQuery.map( scripts, restoreScript );\\n\\n\\t\\t\\t\\t// Evaluate executable scripts on first document insertion\\n\\t\\t\\t\\tfor ( i = 0; i < hasScripts; i++ ) {\\n\\t\\t\\t\\t\\tnode = scripts[ i ];\\n\\t\\t\\t\\t\\tif ( rscriptType.test( node.type || \\\"\\\" ) &&\\n\\t\\t\\t\\t\\t\\t!dataPriv.access( node, \\\"globalEval\\\" ) &&\\n\\t\\t\\t\\t\\t\\tjQuery.contains( doc, node ) ) {\\n\\n\\t\\t\\t\\t\\t\\tif ( node.src ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Optional AJAX dependency, but won't run scripts if not present\\n\\t\\t\\t\\t\\t\\t\\tif ( jQuery._evalUrl ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery._evalUrl( node.src );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tDOMEval( node.textContent.replace( rcleanScript, \\\"\\\" ), doc );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn collection;\\n}\\n\\nfunction remove( elem, selector, keepData ) {\\n\\tvar node,\\n\\t\\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\\n\\t\\ti = 0;\\n\\n\\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\\n\\t\\tif ( !keepData && node.nodeType === 1 ) {\\n\\t\\t\\tjQuery.cleanData( getAll( node ) );\\n\\t\\t}\\n\\n\\t\\tif ( node.parentNode ) {\\n\\t\\t\\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\\n\\t\\t\\t\\tsetGlobalEval( getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t}\\n\\t\\t\\tnode.parentNode.removeChild( node );\\n\\t\\t}\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\njQuery.extend( {\\n\\thtmlPrefilter: function( html ) {\\n\\t\\treturn html.replace( rxhtmlTag, \\\"<$1>\\\" );\\n\\t},\\n\\n\\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\\n\\t\\tvar i, l, srcElements, destElements,\\n\\t\\t\\tclone = elem.cloneNode( true ),\\n\\t\\t\\tinPage = jQuery.contains( elem.ownerDocument, elem );\\n\\n\\t\\t// Fix IE cloning issues\\n\\t\\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\\n\\t\\t\\t\\t!jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\\n\\t\\t\\tdestElements = getAll( clone );\\n\\t\\t\\tsrcElements = getAll( elem );\\n\\n\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\tfixInput( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Copy the events from the original to the clone\\n\\t\\tif ( dataAndEvents ) {\\n\\t\\t\\tif ( deepDataAndEvents ) {\\n\\t\\t\\t\\tsrcElements = srcElements || getAll( elem );\\n\\t\\t\\t\\tdestElements = destElements || getAll( clone );\\n\\n\\t\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcloneCopyEvent( elem, clone );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Preserve script evaluation history\\n\\t\\tdestElements = getAll( clone, \\\"script\\\" );\\n\\t\\tif ( destElements.length > 0 ) {\\n\\t\\t\\tsetGlobalEval( destElements, !inPage && getAll( elem, \\\"script\\\" ) );\\n\\t\\t}\\n\\n\\t\\t// Return the cloned set\\n\\t\\treturn clone;\\n\\t},\\n\\n\\tcleanData: function( elems ) {\\n\\t\\tvar data, elem, type,\\n\\t\\t\\tspecial = jQuery.event.special,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\\n\\t\\t\\tif ( acceptData( elem ) ) {\\n\\t\\t\\t\\tif ( ( data = elem[ dataPriv.expando ] ) ) {\\n\\t\\t\\t\\t\\tif ( data.events ) {\\n\\t\\t\\t\\t\\t\\tfor ( type in data.events ) {\\n\\t\\t\\t\\t\\t\\t\\tif ( special[ type ] ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.event.remove( elem, type );\\n\\n\\t\\t\\t\\t\\t\\t\\t// This is a shortcut to avoid jQuery.event.remove's overhead\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, data.handle );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <=35 - 45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataPriv.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif ( elem[ dataUser.expando ] ) {\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <=35 - 45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataUser.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tdetach: function( selector ) {\\n\\t\\treturn remove( this, selector, true );\\n\\t},\\n\\n\\tremove: function( selector ) {\\n\\t\\treturn remove( this, selector );\\n\\t},\\n\\n\\ttext: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\treturn value === undefined ?\\n\\t\\t\\t\\tjQuery.text( this ) :\\n\\t\\t\\t\\tthis.empty().each( function() {\\n\\t\\t\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\t\\t\\tthis.textContent = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\tappend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.appendChild( elem );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tprepend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.insertBefore( elem, target.firstChild );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tbefore: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tafter: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this.nextSibling );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tempty: function() {\\n\\t\\tvar elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\\n\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\n\\t\\t\\t\\t// Prevent memory leaks\\n\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\n\\t\\t\\t\\t// Remove any remaining nodes\\n\\t\\t\\t\\telem.textContent = \\\"\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tclone: function( dataAndEvents, deepDataAndEvents ) {\\n\\t\\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\\n\\t\\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\\n\\n\\t\\treturn this.map( function() {\\n\\t\\t\\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\\n\\t\\t} );\\n\\t},\\n\\n\\thtml: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\tvar elem = this[ 0 ] || {},\\n\\t\\t\\t\\ti = 0,\\n\\t\\t\\t\\tl = this.length;\\n\\n\\t\\t\\tif ( value === undefined && elem.nodeType === 1 ) {\\n\\t\\t\\t\\treturn elem.innerHTML;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// See if we can take a shortcut and just use innerHTML\\n\\t\\t\\tif ( typeof value === \\\"string\\\" && !rnoInnerhtml.test( value ) &&\\n\\t\\t\\t\\t!wrapMap[ ( rtagName.exec( value ) || [ \\\"\\\", \\\"\\\" ] )[ 1 ].toLowerCase() ] ) {\\n\\n\\t\\t\\t\\tvalue = jQuery.htmlPrefilter( value );\\n\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\t\\t\\telem = this[ i ] || {};\\n\\n\\t\\t\\t\\t\\t\\t// Remove element nodes and prevent memory leaks\\n\\t\\t\\t\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\t\\t\\t\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\t\\t\\t\\t\\t\\t\\telem.innerHTML = value;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\telem = 0;\\n\\n\\t\\t\\t\\t// If using innerHTML throws an exception, use the fallback method\\n\\t\\t\\t\\t} catch ( e ) {}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\tthis.empty().append( value );\\n\\t\\t\\t}\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\treplaceWith: function() {\\n\\t\\tvar ignored = [];\\n\\n\\t\\t// Make the changes, replacing each non-ignored context element with the new content\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tvar parent = this.parentNode;\\n\\n\\t\\t\\tif ( jQuery.inArray( this, ignored ) < 0 ) {\\n\\t\\t\\t\\tjQuery.cleanData( getAll( this ) );\\n\\t\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\t\\tparent.replaceChild( elem, this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t// Force callback invocation\\n\\t\\t}, ignored );\\n\\t}\\n} );\\n\\njQuery.each( {\\n\\tappendTo: \\\"append\\\",\\n\\tprependTo: \\\"prepend\\\",\\n\\tinsertBefore: \\\"before\\\",\\n\\tinsertAfter: \\\"after\\\",\\n\\treplaceAll: \\\"replaceWith\\\"\\n}, function( name, original ) {\\n\\tjQuery.fn[ name ] = function( selector ) {\\n\\t\\tvar elems,\\n\\t\\t\\tret = [],\\n\\t\\t\\tinsert = jQuery( selector ),\\n\\t\\t\\tlast = insert.length - 1,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; i <= last; i++ ) {\\n\\t\\t\\telems = i === last ? this : this.clone( true );\\n\\t\\t\\tjQuery( insert[ i ] )[ original ]( elems );\\n\\n\\t\\t\\t// Support: Android <=4.0 only, PhantomJS 1 only\\n\\t\\t\\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\tpush.apply( ret, elems.get() );\\n\\t\\t}\\n\\n\\t\\treturn this.pushStack( ret );\\n\\t};\\n} );\\nvar rmargin = ( /^margin/ );\\n\\nvar rnumnonpx = new RegExp( \\\"^(\\\" + pnum + \\\")(?!px)[a-z%]+$\\\", \\\"i\\\" );\\n\\nvar getStyles = function( elem ) {\\n\\n\\t\\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\\n\\t\\t// IE throws on elements created in popups\\n\\t\\t// FF meanwhile throws on frame elements through \\\"defaultView.getComputedStyle\\\"\\n\\t\\tvar view = elem.ownerDocument.defaultView;\\n\\n\\t\\tif ( !view || !view.opener ) {\\n\\t\\t\\tview = window;\\n\\t\\t}\\n\\n\\t\\treturn view.getComputedStyle( elem );\\n\\t};\\n\\n\\n\\n( function() {\\n\\n\\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\\n\\t// so they're executed at the same time to save the second computation.\\n\\tfunction computeStyleTests() {\\n\\n\\t\\t// This is a singleton, we need to execute it only once\\n\\t\\tif ( !div ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tdiv.style.cssText =\\n\\t\\t\\t\\\"box-sizing:border-box;\\\" +\\n\\t\\t\\t\\\"position:relative;display:block;\\\" +\\n\\t\\t\\t\\\"margin:auto;border:1px;padding:1px;\\\" +\\n\\t\\t\\t\\\"top:1%;width:50%\\\";\\n\\t\\tdiv.innerHTML = \\\"\\\";\\n\\t\\tdocumentElement.appendChild( container );\\n\\n\\t\\tvar divStyle = window.getComputedStyle( div );\\n\\t\\tpixelPositionVal = divStyle.top !== \\\"1%\\\";\\n\\n\\t\\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\\n\\t\\treliableMarginLeftVal = divStyle.marginLeft === \\\"2px\\\";\\n\\t\\tboxSizingReliableVal = divStyle.width === \\\"4px\\\";\\n\\n\\t\\t// Support: Android 4.0 - 4.3 only\\n\\t\\t// Some styles come back with percentage values, even though they shouldn't\\n\\t\\tdiv.style.marginRight = \\\"50%\\\";\\n\\t\\tpixelMarginRightVal = divStyle.marginRight === \\\"4px\\\";\\n\\n\\t\\tdocumentElement.removeChild( container );\\n\\n\\t\\t// Nullify the div so it wouldn't be stored in the memory and\\n\\t\\t// it will also be a sign that checks already performed\\n\\t\\tdiv = null;\\n\\t}\\n\\n\\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\\n\\t\\tcontainer = document.createElement( \\\"div\\\" ),\\n\\t\\tdiv = document.createElement( \\\"div\\\" );\\n\\n\\t// Finish early in limited (non-browser) environments\\n\\tif ( !div.style ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// Support: IE <=9 - 11 only\\n\\t// Style of cloned element affects source element cloned (#8908)\\n\\tdiv.style.backgroundClip = \\\"content-box\\\";\\n\\tdiv.cloneNode( true ).style.backgroundClip = \\\"\\\";\\n\\tsupport.clearCloneStyle = div.style.backgroundClip === \\\"content-box\\\";\\n\\n\\tcontainer.style.cssText = \\\"border:0;width:8px;height:0;top:0;left:-9999px;\\\" +\\n\\t\\t\\\"padding:0;margin-top:1px;position:absolute\\\";\\n\\tcontainer.appendChild( div );\\n\\n\\tjQuery.extend( support, {\\n\\t\\tpixelPosition: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn pixelPositionVal;\\n\\t\\t},\\n\\t\\tboxSizingReliable: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn boxSizingReliableVal;\\n\\t\\t},\\n\\t\\tpixelMarginRight: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn pixelMarginRightVal;\\n\\t\\t},\\n\\t\\treliableMarginLeft: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn reliableMarginLeftVal;\\n\\t\\t}\\n\\t} );\\n} )();\\n\\n\\nfunction curCSS( elem, name, computed ) {\\n\\tvar width, minWidth, maxWidth, ret,\\n\\n\\t\\t// Support: Firefox 51+\\n\\t\\t// Retrieving style before computed somehow\\n\\t\\t// fixes an issue with getting wrong values\\n\\t\\t// on detached elements\\n\\t\\tstyle = elem.style;\\n\\n\\tcomputed = computed || getStyles( elem );\\n\\n\\t// getPropertyValue is needed for:\\n\\t// .css('filter') (IE 9 only, #12537)\\n\\t// .css('--customProperty) (#3144)\\n\\tif ( computed ) {\\n\\t\\tret = computed.getPropertyValue( name ) || computed[ name ];\\n\\n\\t\\tif ( ret === \\\"\\\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\\n\\t\\t\\tret = jQuery.style( elem, name );\\n\\t\\t}\\n\\n\\t\\t// A tribute to the \\\"awesome hack by Dean Edwards\\\"\\n\\t\\t// Android Browser returns percentage for some values,\\n\\t\\t// but width seems to be reliably pixels.\\n\\t\\t// This is against the CSSOM draft spec:\\n\\t\\t// https://drafts.csswg.org/cssom/#resolved-values\\n\\t\\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\\n\\n\\t\\t\\t// Remember the original values\\n\\t\\t\\twidth = style.width;\\n\\t\\t\\tminWidth = style.minWidth;\\n\\t\\t\\tmaxWidth = style.maxWidth;\\n\\n\\t\\t\\t// Put in the new values to get a computed value out\\n\\t\\t\\tstyle.minWidth = style.maxWidth = style.width = ret;\\n\\t\\t\\tret = computed.width;\\n\\n\\t\\t\\t// Revert the changed values\\n\\t\\t\\tstyle.width = width;\\n\\t\\t\\tstyle.minWidth = minWidth;\\n\\t\\t\\tstyle.maxWidth = maxWidth;\\n\\t\\t}\\n\\t}\\n\\n\\treturn ret !== undefined ?\\n\\n\\t\\t// Support: IE <=9 - 11 only\\n\\t\\t// IE returns zIndex value as an integer.\\n\\t\\tret + \\\"\\\" :\\n\\t\\tret;\\n}\\n\\n\\nfunction addGetHookIf( conditionFn, hookFn ) {\\n\\n\\t// Define the hook, we'll check on the first run if it's really needed.\\n\\treturn {\\n\\t\\tget: function() {\\n\\t\\t\\tif ( conditionFn() ) {\\n\\n\\t\\t\\t\\t// Hook not needed (or it's not possible to use it due\\n\\t\\t\\t\\t// to missing dependency), remove it.\\n\\t\\t\\t\\tdelete this.get;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Hook needed; redefine it so that the support test is not executed again.\\n\\t\\t\\treturn ( this.get = hookFn ).apply( this, arguments );\\n\\t\\t}\\n\\t};\\n}\\n\\n\\nvar\\n\\n\\t// Swappable if display is none or starts with table\\n\\t// except \\\"table\\\", \\\"table-cell\\\", or \\\"table-caption\\\"\\n\\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\\n\\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\\n\\trcustomProp = /^--/,\\n\\tcssShow = { position: \\\"absolute\\\", visibility: \\\"hidden\\\", display: \\\"block\\\" },\\n\\tcssNormalTransform = {\\n\\t\\tletterSpacing: \\\"0\\\",\\n\\t\\tfontWeight: \\\"400\\\"\\n\\t},\\n\\n\\tcssPrefixes = [ \\\"Webkit\\\", \\\"Moz\\\", \\\"ms\\\" ],\\n\\temptyStyle = document.createElement( \\\"div\\\" ).style;\\n\\n// Return a css property mapped to a potentially vendor prefixed property\\nfunction vendorPropName( name ) {\\n\\n\\t// Shortcut for names that are not vendor prefixed\\n\\tif ( name in emptyStyle ) {\\n\\t\\treturn name;\\n\\t}\\n\\n\\t// Check for vendor prefixed names\\n\\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\\n\\t\\ti = cssPrefixes.length;\\n\\n\\twhile ( i-- ) {\\n\\t\\tname = cssPrefixes[ i ] + capName;\\n\\t\\tif ( name in emptyStyle ) {\\n\\t\\t\\treturn name;\\n\\t\\t}\\n\\t}\\n}\\n\\n// Return a property mapped along what jQuery.cssProps suggests or to\\n// a vendor prefixed property.\\nfunction finalPropName( name ) {\\n\\tvar ret = jQuery.cssProps[ name ];\\n\\tif ( !ret ) {\\n\\t\\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\\n\\t}\\n\\treturn ret;\\n}\\n\\nfunction setPositiveNumber( elem, value, subtract ) {\\n\\n\\t// Any relative (+/-) values have already been\\n\\t// normalized at this point\\n\\tvar matches = rcssNum.exec( value );\\n\\treturn matches ?\\n\\n\\t\\t// Guard against undefined \\\"subtract\\\", e.g., when used as in cssHooks\\n\\t\\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \\\"px\\\" ) :\\n\\t\\tvalue;\\n}\\n\\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\\n\\tvar i,\\n\\t\\tval = 0;\\n\\n\\t// If we already have the right measurement, avoid augmentation\\n\\tif ( extra === ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ) ) {\\n\\t\\ti = 4;\\n\\n\\t// Otherwise initialize for horizontal or vertical properties\\n\\t} else {\\n\\t\\ti = name === \\\"width\\\" ? 1 : 0;\\n\\t}\\n\\n\\tfor ( ; i < 4; i += 2 ) {\\n\\n\\t\\t// Both box models exclude margin, so add it if we want it\\n\\t\\tif ( extra === \\\"margin\\\" ) {\\n\\t\\t\\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\\n\\t\\t}\\n\\n\\t\\tif ( isBorderBox ) {\\n\\n\\t\\t\\t// border-box includes padding, so remove it if we want content\\n\\t\\t\\tif ( extra === \\\"content\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// At this point, extra isn't border nor margin, so remove border\\n\\t\\t\\tif ( extra !== \\\"margin\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// At this point, extra isn't content, so add padding\\n\\t\\t\\tval += jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\n\\t\\t\\t// At this point, extra isn't content nor padding, so add border\\n\\t\\t\\tif ( extra !== \\\"padding\\\" ) {\\n\\t\\t\\t\\tval += jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn val;\\n}\\n\\nfunction getWidthOrHeight( elem, name, extra ) {\\n\\n\\t// Start with computed style\\n\\tvar valueIsBorderBox,\\n\\t\\tstyles = getStyles( elem ),\\n\\t\\tval = curCSS( elem, name, styles ),\\n\\t\\tisBorderBox = jQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\";\\n\\n\\t// Computed unit is not pixels. Stop here and return.\\n\\tif ( rnumnonpx.test( val ) ) {\\n\\t\\treturn val;\\n\\t}\\n\\n\\t// Check for style in case a browser which returns unreliable values\\n\\t// for getComputedStyle silently falls back to the reliable elem.style\\n\\tvalueIsBorderBox = isBorderBox &&\\n\\t\\t( support.boxSizingReliable() || val === elem.style[ name ] );\\n\\n\\t// Fall back to offsetWidth/Height when value is \\\"auto\\\"\\n\\t// This happens for inline elements with no explicit setting (gh-3571)\\n\\tif ( val === \\\"auto\\\" ) {\\n\\t\\tval = elem[ \\\"offset\\\" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];\\n\\t}\\n\\n\\t// Normalize \\\"\\\", auto, and prepare for extra\\n\\tval = parseFloat( val ) || 0;\\n\\n\\t// Use the active box-sizing model to add/subtract irrelevant styles\\n\\treturn ( val +\\n\\t\\taugmentWidthOrHeight(\\n\\t\\t\\telem,\\n\\t\\t\\tname,\\n\\t\\t\\textra || ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ),\\n\\t\\t\\tvalueIsBorderBox,\\n\\t\\t\\tstyles\\n\\t\\t)\\n\\t) + \\\"px\\\";\\n}\\n\\njQuery.extend( {\\n\\n\\t// Add in style property hooks for overriding the default\\n\\t// behavior of getting and setting a style property\\n\\tcssHooks: {\\n\\t\\topacity: {\\n\\t\\t\\tget: function( elem, computed ) {\\n\\t\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t\\t// We should always get a number back from opacity\\n\\t\\t\\t\\t\\tvar ret = curCSS( elem, \\\"opacity\\\" );\\n\\t\\t\\t\\t\\treturn ret === \\\"\\\" ? \\\"1\\\" : ret;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\t// Don't automatically add \\\"px\\\" to these possibly-unitless properties\\n\\tcssNumber: {\\n\\t\\t\\\"animationIterationCount\\\": true,\\n\\t\\t\\\"columnCount\\\": true,\\n\\t\\t\\\"fillOpacity\\\": true,\\n\\t\\t\\\"flexGrow\\\": true,\\n\\t\\t\\\"flexShrink\\\": true,\\n\\t\\t\\\"fontWeight\\\": true,\\n\\t\\t\\\"lineHeight\\\": true,\\n\\t\\t\\\"opacity\\\": true,\\n\\t\\t\\\"order\\\": true,\\n\\t\\t\\\"orphans\\\": true,\\n\\t\\t\\\"widows\\\": true,\\n\\t\\t\\\"zIndex\\\": true,\\n\\t\\t\\\"zoom\\\": true\\n\\t},\\n\\n\\t// Add in properties whose names you wish to fix before\\n\\t// setting or getting the value\\n\\tcssProps: {\\n\\t\\t\\\"float\\\": \\\"cssFloat\\\"\\n\\t},\\n\\n\\t// Get and set the style property on a DOM Node\\n\\tstyle: function( elem, name, value, extra ) {\\n\\n\\t\\t// Don't set styles on text and comment nodes\\n\\t\\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Make sure that we're working with the right name\\n\\t\\tvar ret, type, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name ),\\n\\t\\t\\tisCustomProp = rcustomProp.test( name ),\\n\\t\\t\\tstyle = elem.style;\\n\\n\\t\\t// Make sure that we're working with the right name. We don't\\n\\t\\t// want to query the value if it is a CSS custom property\\n\\t\\t// since they are user-defined.\\n\\t\\tif ( !isCustomProp ) {\\n\\t\\t\\tname = finalPropName( origName );\\n\\t\\t}\\n\\n\\t\\t// Gets hook for the prefixed version, then unprefixed version\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// Check if we're setting a value\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\ttype = typeof value;\\n\\n\\t\\t\\t// Convert \\\"+=\\\" or \\\"-=\\\" to relative numbers (#7345)\\n\\t\\t\\tif ( type === \\\"string\\\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\\n\\t\\t\\t\\tvalue = adjustCSS( elem, name, ret );\\n\\n\\t\\t\\t\\t// Fixes bug #9237\\n\\t\\t\\t\\ttype = \\\"number\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Make sure that null and NaN values aren't set (#7116)\\n\\t\\t\\tif ( value == null || value !== value ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a number was passed in, add the unit (except for certain CSS properties)\\n\\t\\t\\tif ( type === \\\"number\\\" ) {\\n\\t\\t\\t\\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \\\"\\\" : \\\"px\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// background-* props affect original clone's values\\n\\t\\t\\tif ( !support.clearCloneStyle && value === \\\"\\\" && name.indexOf( \\\"background\\\" ) === 0 ) {\\n\\t\\t\\t\\tstyle[ name ] = \\\"inherit\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a hook was provided, use that value, otherwise just set the specified value\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) ||\\n\\t\\t\\t\\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\tif ( isCustomProp ) {\\n\\t\\t\\t\\t\\tstyle.setProperty( name, value );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tstyle[ name ] = value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// If a hook was provided get the non-computed value from there\\n\\t\\t\\tif ( hooks && \\\"get\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Otherwise just get the value from the style object\\n\\t\\t\\treturn style[ name ];\\n\\t\\t}\\n\\t},\\n\\n\\tcss: function( elem, name, extra, styles ) {\\n\\t\\tvar val, num, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name ),\\n\\t\\t\\tisCustomProp = rcustomProp.test( name );\\n\\n\\t\\t// Make sure that we're working with the right name. We don't\\n\\t\\t// want to modify the value if it is a CSS custom property\\n\\t\\t// since they are user-defined.\\n\\t\\tif ( !isCustomProp ) {\\n\\t\\t\\tname = finalPropName( origName );\\n\\t\\t}\\n\\n\\t\\t// Try prefixed name followed by the unprefixed name\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// If a hook was provided get the computed value from there\\n\\t\\tif ( hooks && \\\"get\\\" in hooks ) {\\n\\t\\t\\tval = hooks.get( elem, true, extra );\\n\\t\\t}\\n\\n\\t\\t// Otherwise, if a way to get the computed value exists, use that\\n\\t\\tif ( val === undefined ) {\\n\\t\\t\\tval = curCSS( elem, name, styles );\\n\\t\\t}\\n\\n\\t\\t// Convert \\\"normal\\\" to computed value\\n\\t\\tif ( val === \\\"normal\\\" && name in cssNormalTransform ) {\\n\\t\\t\\tval = cssNormalTransform[ name ];\\n\\t\\t}\\n\\n\\t\\t// Make numeric if forced or a qualifier was provided and val looks numeric\\n\\t\\tif ( extra === \\\"\\\" || extra ) {\\n\\t\\t\\tnum = parseFloat( val );\\n\\t\\t\\treturn extra === true || isFinite( num ) ? num || 0 : val;\\n\\t\\t}\\n\\n\\t\\treturn val;\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"height\\\", \\\"width\\\" ], function( i, name ) {\\n\\tjQuery.cssHooks[ name ] = {\\n\\t\\tget: function( elem, computed, extra ) {\\n\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t// Certain elements can have dimension info if we invisibly show them\\n\\t\\t\\t\\t// but it must have a current display style that would benefit\\n\\t\\t\\t\\treturn rdisplayswap.test( jQuery.css( elem, \\\"display\\\" ) ) &&\\n\\n\\t\\t\\t\\t\\t// Support: Safari 8+\\n\\t\\t\\t\\t\\t// Table columns in Safari have non-zero offsetWidth & zero\\n\\t\\t\\t\\t\\t// getBoundingClientRect().width unless display is changed.\\n\\t\\t\\t\\t\\t// Support: IE <=11 only\\n\\t\\t\\t\\t\\t// Running getBoundingClientRect on a disconnected node\\n\\t\\t\\t\\t\\t// in IE throws an error.\\n\\t\\t\\t\\t\\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\\n\\t\\t\\t\\t\\t\\tswap( elem, cssShow, function() {\\n\\t\\t\\t\\t\\t\\t\\treturn getWidthOrHeight( elem, name, extra );\\n\\t\\t\\t\\t\\t\\t} ) :\\n\\t\\t\\t\\t\\t\\tgetWidthOrHeight( elem, name, extra );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tset: function( elem, value, extra ) {\\n\\t\\t\\tvar matches,\\n\\t\\t\\t\\tstyles = extra && getStyles( elem ),\\n\\t\\t\\t\\tsubtract = extra && augmentWidthOrHeight(\\n\\t\\t\\t\\t\\telem,\\n\\t\\t\\t\\t\\tname,\\n\\t\\t\\t\\t\\textra,\\n\\t\\t\\t\\t\\tjQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\",\\n\\t\\t\\t\\t\\tstyles\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t// Convert to pixels if value adjustment is needed\\n\\t\\t\\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\\n\\t\\t\\t\\t( matches[ 3 ] || \\\"px\\\" ) !== \\\"px\\\" ) {\\n\\n\\t\\t\\t\\telem.style[ name ] = value;\\n\\t\\t\\t\\tvalue = jQuery.css( elem, name );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn setPositiveNumber( elem, value, subtract );\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\\n\\tfunction( elem, computed ) {\\n\\t\\tif ( computed ) {\\n\\t\\t\\treturn ( parseFloat( curCSS( elem, \\\"marginLeft\\\" ) ) ||\\n\\t\\t\\t\\telem.getBoundingClientRect().left -\\n\\t\\t\\t\\t\\tswap( elem, { marginLeft: 0 }, function() {\\n\\t\\t\\t\\t\\t\\treturn elem.getBoundingClientRect().left;\\n\\t\\t\\t\\t\\t} )\\n\\t\\t\\t\\t) + \\\"px\\\";\\n\\t\\t}\\n\\t}\\n);\\n\\n// These hooks are used by animate to expand properties\\njQuery.each( {\\n\\tmargin: \\\"\\\",\\n\\tpadding: \\\"\\\",\\n\\tborder: \\\"Width\\\"\\n}, function( prefix, suffix ) {\\n\\tjQuery.cssHooks[ prefix + suffix ] = {\\n\\t\\texpand: function( value ) {\\n\\t\\t\\tvar i = 0,\\n\\t\\t\\t\\texpanded = {},\\n\\n\\t\\t\\t\\t// Assumes a single number if not a string\\n\\t\\t\\t\\tparts = typeof value === \\\"string\\\" ? value.split( \\\" \\\" ) : [ value ];\\n\\n\\t\\t\\tfor ( ; i < 4; i++ ) {\\n\\t\\t\\t\\texpanded[ prefix + cssExpand[ i ] + suffix ] =\\n\\t\\t\\t\\t\\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn expanded;\\n\\t\\t}\\n\\t};\\n\\n\\tif ( !rmargin.test( prefix ) ) {\\n\\t\\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tcss: function( name, value ) {\\n\\t\\treturn access( this, function( elem, name, value ) {\\n\\t\\t\\tvar styles, len,\\n\\t\\t\\t\\tmap = {},\\n\\t\\t\\t\\ti = 0;\\n\\n\\t\\t\\tif ( Array.isArray( name ) ) {\\n\\t\\t\\t\\tstyles = getStyles( elem );\\n\\t\\t\\t\\tlen = name.length;\\n\\n\\t\\t\\t\\tfor ( ; i < len; i++ ) {\\n\\t\\t\\t\\t\\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn map;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn value !== undefined ?\\n\\t\\t\\t\\tjQuery.style( elem, name, value ) :\\n\\t\\t\\t\\tjQuery.css( elem, name );\\n\\t\\t}, name, value, arguments.length > 1 );\\n\\t}\\n} );\\n\\n\\nfunction Tween( elem, options, prop, end, easing ) {\\n\\treturn new Tween.prototype.init( elem, options, prop, end, easing );\\n}\\njQuery.Tween = Tween;\\n\\nTween.prototype = {\\n\\tconstructor: Tween,\\n\\tinit: function( elem, options, prop, end, easing, unit ) {\\n\\t\\tthis.elem = elem;\\n\\t\\tthis.prop = prop;\\n\\t\\tthis.easing = easing || jQuery.easing._default;\\n\\t\\tthis.options = options;\\n\\t\\tthis.start = this.now = this.cur();\\n\\t\\tthis.end = end;\\n\\t\\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \\\"\\\" : \\\"px\\\" );\\n\\t},\\n\\tcur: function() {\\n\\t\\tvar hooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\treturn hooks && hooks.get ?\\n\\t\\t\\thooks.get( this ) :\\n\\t\\t\\tTween.propHooks._default.get( this );\\n\\t},\\n\\trun: function( percent ) {\\n\\t\\tvar eased,\\n\\t\\t\\thooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\tif ( this.options.duration ) {\\n\\t\\t\\tthis.pos = eased = jQuery.easing[ this.easing ](\\n\\t\\t\\t\\tpercent, this.options.duration * percent, 0, 1, this.options.duration\\n\\t\\t\\t);\\n\\t\\t} else {\\n\\t\\t\\tthis.pos = eased = percent;\\n\\t\\t}\\n\\t\\tthis.now = ( this.end - this.start ) * eased + this.start;\\n\\n\\t\\tif ( this.options.step ) {\\n\\t\\t\\tthis.options.step.call( this.elem, this.now, this );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && hooks.set ) {\\n\\t\\t\\thooks.set( this );\\n\\t\\t} else {\\n\\t\\t\\tTween.propHooks._default.set( this );\\n\\t\\t}\\n\\t\\treturn this;\\n\\t}\\n};\\n\\nTween.prototype.init.prototype = Tween.prototype;\\n\\nTween.propHooks = {\\n\\t_default: {\\n\\t\\tget: function( tween ) {\\n\\t\\t\\tvar result;\\n\\n\\t\\t\\t// Use a property on the element directly when it is not a DOM element,\\n\\t\\t\\t// or when there is no matching style property that exists.\\n\\t\\t\\tif ( tween.elem.nodeType !== 1 ||\\n\\t\\t\\t\\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\\n\\t\\t\\t\\treturn tween.elem[ tween.prop ];\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Passing an empty string as a 3rd parameter to .css will automatically\\n\\t\\t\\t// attempt a parseFloat and fallback to a string if the parse fails.\\n\\t\\t\\t// Simple values such as \\\"10px\\\" are parsed to Float;\\n\\t\\t\\t// complex values such as \\\"rotate(1rad)\\\" are returned as-is.\\n\\t\\t\\tresult = jQuery.css( tween.elem, tween.prop, \\\"\\\" );\\n\\n\\t\\t\\t// Empty strings, null, undefined and \\\"auto\\\" are converted to 0.\\n\\t\\t\\treturn !result || result === \\\"auto\\\" ? 0 : result;\\n\\t\\t},\\n\\t\\tset: function( tween ) {\\n\\n\\t\\t\\t// Use step hook for back compat.\\n\\t\\t\\t// Use cssHook if its there.\\n\\t\\t\\t// Use .style if available and use plain properties where available.\\n\\t\\t\\tif ( jQuery.fx.step[ tween.prop ] ) {\\n\\t\\t\\t\\tjQuery.fx.step[ tween.prop ]( tween );\\n\\t\\t\\t} else if ( tween.elem.nodeType === 1 &&\\n\\t\\t\\t\\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\\n\\t\\t\\t\\t\\tjQuery.cssHooks[ tween.prop ] ) ) {\\n\\t\\t\\t\\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\n// Support: IE <=9 only\\n// Panic based approach to setting things on disconnected nodes\\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\\n\\tset: function( tween ) {\\n\\t\\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\\n\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.easing = {\\n\\tlinear: function( p ) {\\n\\t\\treturn p;\\n\\t},\\n\\tswing: function( p ) {\\n\\t\\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\\n\\t},\\n\\t_default: \\\"swing\\\"\\n};\\n\\njQuery.fx = Tween.prototype.init;\\n\\n// Back compat <1.8 extension point\\njQuery.fx.step = {};\\n\\n\\n\\n\\nvar\\n\\tfxNow, inProgress,\\n\\trfxtypes = /^(?:toggle|show|hide)$/,\\n\\trrun = /queueHooks$/;\\n\\nfunction schedule() {\\n\\tif ( inProgress ) {\\n\\t\\tif ( document.hidden === false && window.requestAnimationFrame ) {\\n\\t\\t\\twindow.requestAnimationFrame( schedule );\\n\\t\\t} else {\\n\\t\\t\\twindow.setTimeout( schedule, jQuery.fx.interval );\\n\\t\\t}\\n\\n\\t\\tjQuery.fx.tick();\\n\\t}\\n}\\n\\n// Animations created synchronously will run synchronously\\nfunction createFxNow() {\\n\\twindow.setTimeout( function() {\\n\\t\\tfxNow = undefined;\\n\\t} );\\n\\treturn ( fxNow = jQuery.now() );\\n}\\n\\n// Generate parameters to create a standard animation\\nfunction genFx( type, includeWidth ) {\\n\\tvar which,\\n\\t\\ti = 0,\\n\\t\\tattrs = { height: type };\\n\\n\\t// If we include width, step value is 1 to do all cssExpand values,\\n\\t// otherwise step value is 2 to skip over Left and Right\\n\\tincludeWidth = includeWidth ? 1 : 0;\\n\\tfor ( ; i < 4; i += 2 - includeWidth ) {\\n\\t\\twhich = cssExpand[ i ];\\n\\t\\tattrs[ \\\"margin\\\" + which ] = attrs[ \\\"padding\\\" + which ] = type;\\n\\t}\\n\\n\\tif ( includeWidth ) {\\n\\t\\tattrs.opacity = attrs.width = type;\\n\\t}\\n\\n\\treturn attrs;\\n}\\n\\nfunction createTween( value, prop, animation ) {\\n\\tvar tween,\\n\\t\\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \\\"*\\\" ] ),\\n\\t\\tindex = 0,\\n\\t\\tlength = collection.length;\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\\n\\n\\t\\t\\t// We're done with this property\\n\\t\\t\\treturn tween;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction defaultPrefilter( elem, props, opts ) {\\n\\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\\n\\t\\tisBox = \\\"width\\\" in props || \\\"height\\\" in props,\\n\\t\\tanim = this,\\n\\t\\torig = {},\\n\\t\\tstyle = elem.style,\\n\\t\\thidden = elem.nodeType && isHiddenWithinTree( elem ),\\n\\t\\tdataShow = dataPriv.get( elem, \\\"fxshow\\\" );\\n\\n\\t// Queue-skipping animations hijack the fx hooks\\n\\tif ( !opts.queue ) {\\n\\t\\thooks = jQuery._queueHooks( elem, \\\"fx\\\" );\\n\\t\\tif ( hooks.unqueued == null ) {\\n\\t\\t\\thooks.unqueued = 0;\\n\\t\\t\\toldfire = hooks.empty.fire;\\n\\t\\t\\thooks.empty.fire = function() {\\n\\t\\t\\t\\tif ( !hooks.unqueued ) {\\n\\t\\t\\t\\t\\toldfire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t}\\n\\t\\thooks.unqueued++;\\n\\n\\t\\tanim.always( function() {\\n\\n\\t\\t\\t// Ensure the complete handler is called before this completes\\n\\t\\t\\tanim.always( function() {\\n\\t\\t\\t\\thooks.unqueued--;\\n\\t\\t\\t\\tif ( !jQuery.queue( elem, \\\"fx\\\" ).length ) {\\n\\t\\t\\t\\t\\thooks.empty.fire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t} );\\n\\t}\\n\\n\\t// Detect show/hide animations\\n\\tfor ( prop in props ) {\\n\\t\\tvalue = props[ prop ];\\n\\t\\tif ( rfxtypes.test( value ) ) {\\n\\t\\t\\tdelete props[ prop ];\\n\\t\\t\\ttoggle = toggle || value === \\\"toggle\\\";\\n\\t\\t\\tif ( value === ( hidden ? \\\"hide\\\" : \\\"show\\\" ) ) {\\n\\n\\t\\t\\t\\t// Pretend to be hidden if this is a \\\"show\\\" and\\n\\t\\t\\t\\t// there is still data from a stopped show/hide\\n\\t\\t\\t\\tif ( value === \\\"show\\\" && dataShow && dataShow[ prop ] !== undefined ) {\\n\\t\\t\\t\\t\\thidden = true;\\n\\n\\t\\t\\t\\t// Ignore all other no-op show/hide data\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\\n\\t\\t}\\n\\t}\\n\\n\\t// Bail out if this is a no-op like .hide().hide()\\n\\tpropTween = !jQuery.isEmptyObject( props );\\n\\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// Restrict \\\"overflow\\\" and \\\"display\\\" styles during box animations\\n\\tif ( isBox && elem.nodeType === 1 ) {\\n\\n\\t\\t// Support: IE <=9 - 11, Edge 12 - 13\\n\\t\\t// Record all 3 overflow attributes because IE does not infer the shorthand\\n\\t\\t// from identically-valued overflowX and overflowY\\n\\t\\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\\n\\n\\t\\t// Identify a display type, preferring old show/hide data over the CSS cascade\\n\\t\\trestoreDisplay = dataShow && dataShow.display;\\n\\t\\tif ( restoreDisplay == null ) {\\n\\t\\t\\trestoreDisplay = dataPriv.get( elem, \\\"display\\\" );\\n\\t\\t}\\n\\t\\tdisplay = jQuery.css( elem, \\\"display\\\" );\\n\\t\\tif ( display === \\\"none\\\" ) {\\n\\t\\t\\tif ( restoreDisplay ) {\\n\\t\\t\\t\\tdisplay = restoreDisplay;\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Get nonempty value(s) by temporarily forcing visibility\\n\\t\\t\\t\\tshowHide( [ elem ], true );\\n\\t\\t\\t\\trestoreDisplay = elem.style.display || restoreDisplay;\\n\\t\\t\\t\\tdisplay = jQuery.css( elem, \\\"display\\\" );\\n\\t\\t\\t\\tshowHide( [ elem ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Animate inline elements as inline-block\\n\\t\\tif ( display === \\\"inline\\\" || display === \\\"inline-block\\\" && restoreDisplay != null ) {\\n\\t\\t\\tif ( jQuery.css( elem, \\\"float\\\" ) === \\\"none\\\" ) {\\n\\n\\t\\t\\t\\t// Restore the original display value at the end of pure show/hide animations\\n\\t\\t\\t\\tif ( !propTween ) {\\n\\t\\t\\t\\t\\tanim.done( function() {\\n\\t\\t\\t\\t\\t\\tstyle.display = restoreDisplay;\\n\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\tif ( restoreDisplay == null ) {\\n\\t\\t\\t\\t\\t\\tdisplay = style.display;\\n\\t\\t\\t\\t\\t\\trestoreDisplay = display === \\\"none\\\" ? \\\"\\\" : display;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tstyle.display = \\\"inline-block\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tif ( opts.overflow ) {\\n\\t\\tstyle.overflow = \\\"hidden\\\";\\n\\t\\tanim.always( function() {\\n\\t\\t\\tstyle.overflow = opts.overflow[ 0 ];\\n\\t\\t\\tstyle.overflowX = opts.overflow[ 1 ];\\n\\t\\t\\tstyle.overflowY = opts.overflow[ 2 ];\\n\\t\\t} );\\n\\t}\\n\\n\\t// Implement show/hide animations\\n\\tpropTween = false;\\n\\tfor ( prop in orig ) {\\n\\n\\t\\t// General show/hide setup for this element animation\\n\\t\\tif ( !propTween ) {\\n\\t\\t\\tif ( dataShow ) {\\n\\t\\t\\t\\tif ( \\\"hidden\\\" in dataShow ) {\\n\\t\\t\\t\\t\\thidden = dataShow.hidden;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdataShow = dataPriv.access( elem, \\\"fxshow\\\", { display: restoreDisplay } );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Store hidden/visible for toggle so `.stop().toggle()` \\\"reverses\\\"\\n\\t\\t\\tif ( toggle ) {\\n\\t\\t\\t\\tdataShow.hidden = !hidden;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Show elements before animating them\\n\\t\\t\\tif ( hidden ) {\\n\\t\\t\\t\\tshowHide( [ elem ], true );\\n\\t\\t\\t}\\n\\n\\t\\t\\t/* eslint-disable no-loop-func */\\n\\n\\t\\t\\tanim.done( function() {\\n\\n\\t\\t\\t/* eslint-enable no-loop-func */\\n\\n\\t\\t\\t\\t// The final step of a \\\"hide\\\" animation is actually hiding the element\\n\\t\\t\\t\\tif ( !hidden ) {\\n\\t\\t\\t\\t\\tshowHide( [ elem ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataPriv.remove( elem, \\\"fxshow\\\" );\\n\\t\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\t\\tjQuery.style( elem, prop, orig[ prop ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\t// Per-property setup\\n\\t\\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\\n\\t\\tif ( !( prop in dataShow ) ) {\\n\\t\\t\\tdataShow[ prop ] = propTween.start;\\n\\t\\t\\tif ( hidden ) {\\n\\t\\t\\t\\tpropTween.end = propTween.start;\\n\\t\\t\\t\\tpropTween.start = 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction propFilter( props, specialEasing ) {\\n\\tvar index, name, easing, value, hooks;\\n\\n\\t// camelCase, specialEasing and expand cssHook pass\\n\\tfor ( index in props ) {\\n\\t\\tname = jQuery.camelCase( index );\\n\\t\\teasing = specialEasing[ name ];\\n\\t\\tvalue = props[ index ];\\n\\t\\tif ( Array.isArray( value ) ) {\\n\\t\\t\\teasing = value[ 1 ];\\n\\t\\t\\tvalue = props[ index ] = value[ 0 ];\\n\\t\\t}\\n\\n\\t\\tif ( index !== name ) {\\n\\t\\t\\tprops[ name ] = value;\\n\\t\\t\\tdelete props[ index ];\\n\\t\\t}\\n\\n\\t\\thooks = jQuery.cssHooks[ name ];\\n\\t\\tif ( hooks && \\\"expand\\\" in hooks ) {\\n\\t\\t\\tvalue = hooks.expand( value );\\n\\t\\t\\tdelete props[ name ];\\n\\n\\t\\t\\t// Not quite $.extend, this won't overwrite existing keys.\\n\\t\\t\\t// Reusing 'index' because we have the correct \\\"name\\\"\\n\\t\\t\\tfor ( index in value ) {\\n\\t\\t\\t\\tif ( !( index in props ) ) {\\n\\t\\t\\t\\t\\tprops[ index ] = value[ index ];\\n\\t\\t\\t\\t\\tspecialEasing[ index ] = easing;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tspecialEasing[ name ] = easing;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction Animation( elem, properties, options ) {\\n\\tvar result,\\n\\t\\tstopped,\\n\\t\\tindex = 0,\\n\\t\\tlength = Animation.prefilters.length,\\n\\t\\tdeferred = jQuery.Deferred().always( function() {\\n\\n\\t\\t\\t// Don't match elem in the :animated selector\\n\\t\\t\\tdelete tick.elem;\\n\\t\\t} ),\\n\\t\\ttick = function() {\\n\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\tvar currentTime = fxNow || createFxNow(),\\n\\t\\t\\t\\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\\n\\n\\t\\t\\t\\t// Support: Android 2.3 only\\n\\t\\t\\t\\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\\n\\t\\t\\t\\ttemp = remaining / animation.duration || 0,\\n\\t\\t\\t\\tpercent = 1 - temp,\\n\\t\\t\\t\\tindex = 0,\\n\\t\\t\\t\\tlength = animation.tweens.length;\\n\\n\\t\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\t\\tanimation.tweens[ index ].run( percent );\\n\\t\\t\\t}\\n\\n\\t\\t\\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\\n\\n\\t\\t\\t// If there's more to do, yield\\n\\t\\t\\tif ( percent < 1 && length ) {\\n\\t\\t\\t\\treturn remaining;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If this was an empty animation, synthesize a final progress notification\\n\\t\\t\\tif ( !length ) {\\n\\t\\t\\t\\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Resolve the animation and report its conclusion\\n\\t\\t\\tdeferred.resolveWith( elem, [ animation ] );\\n\\t\\t\\treturn false;\\n\\t\\t},\\n\\t\\tanimation = deferred.promise( {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tprops: jQuery.extend( {}, properties ),\\n\\t\\t\\topts: jQuery.extend( true, {\\n\\t\\t\\t\\tspecialEasing: {},\\n\\t\\t\\t\\teasing: jQuery.easing._default\\n\\t\\t\\t}, options ),\\n\\t\\t\\toriginalProperties: properties,\\n\\t\\t\\toriginalOptions: options,\\n\\t\\t\\tstartTime: fxNow || createFxNow(),\\n\\t\\t\\tduration: options.duration,\\n\\t\\t\\ttweens: [],\\n\\t\\t\\tcreateTween: function( prop, end ) {\\n\\t\\t\\t\\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\\n\\t\\t\\t\\t\\t\\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\\n\\t\\t\\t\\tanimation.tweens.push( tween );\\n\\t\\t\\t\\treturn tween;\\n\\t\\t\\t},\\n\\t\\t\\tstop: function( gotoEnd ) {\\n\\t\\t\\t\\tvar index = 0,\\n\\n\\t\\t\\t\\t\\t// If we are going to the end, we want to run all the tweens\\n\\t\\t\\t\\t\\t// otherwise we skip this part\\n\\t\\t\\t\\t\\tlength = gotoEnd ? animation.tweens.length : 0;\\n\\t\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tstopped = true;\\n\\t\\t\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\t\\t\\tanimation.tweens[ index ].run( 1 );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Resolve when we played the last frame; otherwise, reject\\n\\t\\t\\t\\tif ( gotoEnd ) {\\n\\t\\t\\t\\t\\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\\n\\t\\t\\t\\t\\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t}\\n\\t\\t} ),\\n\\t\\tprops = animation.props;\\n\\n\\tpropFilter( props, animation.opts.specialEasing );\\n\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\\n\\t\\tif ( result ) {\\n\\t\\t\\tif ( jQuery.isFunction( result.stop ) ) {\\n\\t\\t\\t\\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\\n\\t\\t\\t\\t\\tjQuery.proxy( result.stop, result );\\n\\t\\t\\t}\\n\\t\\t\\treturn result;\\n\\t\\t}\\n\\t}\\n\\n\\tjQuery.map( props, createTween, animation );\\n\\n\\tif ( jQuery.isFunction( animation.opts.start ) ) {\\n\\t\\tanimation.opts.start.call( elem, animation );\\n\\t}\\n\\n\\t// Attach callbacks from options\\n\\tanimation\\n\\t\\t.progress( animation.opts.progress )\\n\\t\\t.done( animation.opts.done, animation.opts.complete )\\n\\t\\t.fail( animation.opts.fail )\\n\\t\\t.always( animation.opts.always );\\n\\n\\tjQuery.fx.timer(\\n\\t\\tjQuery.extend( tick, {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tanim: animation,\\n\\t\\t\\tqueue: animation.opts.queue\\n\\t\\t} )\\n\\t);\\n\\n\\treturn animation;\\n}\\n\\njQuery.Animation = jQuery.extend( Animation, {\\n\\n\\ttweeners: {\\n\\t\\t\\\"*\\\": [ function( prop, value ) {\\n\\t\\t\\tvar tween = this.createTween( prop, value );\\n\\t\\t\\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\\n\\t\\t\\treturn tween;\\n\\t\\t} ]\\n\\t},\\n\\n\\ttweener: function( props, callback ) {\\n\\t\\tif ( jQuery.isFunction( props ) ) {\\n\\t\\t\\tcallback = props;\\n\\t\\t\\tprops = [ \\\"*\\\" ];\\n\\t\\t} else {\\n\\t\\t\\tprops = props.match( rnothtmlwhite );\\n\\t\\t}\\n\\n\\t\\tvar prop,\\n\\t\\t\\tindex = 0,\\n\\t\\t\\tlength = props.length;\\n\\n\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\tprop = props[ index ];\\n\\t\\t\\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\\n\\t\\t\\tAnimation.tweeners[ prop ].unshift( callback );\\n\\t\\t}\\n\\t},\\n\\n\\tprefilters: [ defaultPrefilter ],\\n\\n\\tprefilter: function( callback, prepend ) {\\n\\t\\tif ( prepend ) {\\n\\t\\t\\tAnimation.prefilters.unshift( callback );\\n\\t\\t} else {\\n\\t\\t\\tAnimation.prefilters.push( callback );\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.speed = function( speed, easing, fn ) {\\n\\tvar opt = speed && typeof speed === \\\"object\\\" ? jQuery.extend( {}, speed ) : {\\n\\t\\tcomplete: fn || !fn && easing ||\\n\\t\\t\\tjQuery.isFunction( speed ) && speed,\\n\\t\\tduration: speed,\\n\\t\\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\\n\\t};\\n\\n\\t// Go to the end state if fx are off\\n\\tif ( jQuery.fx.off ) {\\n\\t\\topt.duration = 0;\\n\\n\\t} else {\\n\\t\\tif ( typeof opt.duration !== \\\"number\\\" ) {\\n\\t\\t\\tif ( opt.duration in jQuery.fx.speeds ) {\\n\\t\\t\\t\\topt.duration = jQuery.fx.speeds[ opt.duration ];\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\topt.duration = jQuery.fx.speeds._default;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Normalize opt.queue - true/undefined/null -> \\\"fx\\\"\\n\\tif ( opt.queue == null || opt.queue === true ) {\\n\\t\\topt.queue = \\\"fx\\\";\\n\\t}\\n\\n\\t// Queueing\\n\\topt.old = opt.complete;\\n\\n\\topt.complete = function() {\\n\\t\\tif ( jQuery.isFunction( opt.old ) ) {\\n\\t\\t\\topt.old.call( this );\\n\\t\\t}\\n\\n\\t\\tif ( opt.queue ) {\\n\\t\\t\\tjQuery.dequeue( this, opt.queue );\\n\\t\\t}\\n\\t};\\n\\n\\treturn opt;\\n};\\n\\njQuery.fn.extend( {\\n\\tfadeTo: function( speed, to, easing, callback ) {\\n\\n\\t\\t// Show any hidden elements after setting opacity to 0\\n\\t\\treturn this.filter( isHiddenWithinTree ).css( \\\"opacity\\\", 0 ).show()\\n\\n\\t\\t\\t// Animate to the value specified\\n\\t\\t\\t.end().animate( { opacity: to }, speed, easing, callback );\\n\\t},\\n\\tanimate: function( prop, speed, easing, callback ) {\\n\\t\\tvar empty = jQuery.isEmptyObject( prop ),\\n\\t\\t\\toptall = jQuery.speed( speed, easing, callback ),\\n\\t\\t\\tdoAnimation = function() {\\n\\n\\t\\t\\t\\t// Operate on a copy of prop so per-property easing won't be lost\\n\\t\\t\\t\\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\\n\\n\\t\\t\\t\\t// Empty animations, or finishing resolves immediately\\n\\t\\t\\t\\tif ( empty || dataPriv.get( this, \\\"finish\\\" ) ) {\\n\\t\\t\\t\\t\\tanim.stop( true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t\\tdoAnimation.finish = doAnimation;\\n\\n\\t\\treturn empty || optall.queue === false ?\\n\\t\\t\\tthis.each( doAnimation ) :\\n\\t\\t\\tthis.queue( optall.queue, doAnimation );\\n\\t},\\n\\tstop: function( type, clearQueue, gotoEnd ) {\\n\\t\\tvar stopQueue = function( hooks ) {\\n\\t\\t\\tvar stop = hooks.stop;\\n\\t\\t\\tdelete hooks.stop;\\n\\t\\t\\tstop( gotoEnd );\\n\\t\\t};\\n\\n\\t\\tif ( typeof type !== \\\"string\\\" ) {\\n\\t\\t\\tgotoEnd = clearQueue;\\n\\t\\t\\tclearQueue = type;\\n\\t\\t\\ttype = undefined;\\n\\t\\t}\\n\\t\\tif ( clearQueue && type !== false ) {\\n\\t\\t\\tthis.queue( type || \\\"fx\\\", [] );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar dequeue = true,\\n\\t\\t\\t\\tindex = type != null && type + \\\"queueHooks\\\",\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tdata = dataPriv.get( this );\\n\\n\\t\\t\\tif ( index ) {\\n\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop ) {\\n\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tfor ( index in data ) {\\n\\t\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\\n\\t\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this &&\\n\\t\\t\\t\\t\\t( type == null || timers[ index ].queue === type ) ) {\\n\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( gotoEnd );\\n\\t\\t\\t\\t\\tdequeue = false;\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Start the next in the queue if the last step wasn't forced.\\n\\t\\t\\t// Timers currently will call their complete callbacks, which\\n\\t\\t\\t// will dequeue but only if they were gotoEnd.\\n\\t\\t\\tif ( dequeue || !gotoEnd ) {\\n\\t\\t\\t\\tjQuery.dequeue( this, type );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\tfinish: function( type ) {\\n\\t\\tif ( type !== false ) {\\n\\t\\t\\ttype = type || \\\"fx\\\";\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar index,\\n\\t\\t\\t\\tdata = dataPriv.get( this ),\\n\\t\\t\\t\\tqueue = data[ type + \\\"queue\\\" ],\\n\\t\\t\\t\\thooks = data[ type + \\\"queueHooks\\\" ],\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tlength = queue ? queue.length : 0;\\n\\n\\t\\t\\t// Enable finishing flag on private data\\n\\t\\t\\tdata.finish = true;\\n\\n\\t\\t\\t// Empty the queue first\\n\\t\\t\\tjQuery.queue( this, type, [] );\\n\\n\\t\\t\\tif ( hooks && hooks.stop ) {\\n\\t\\t\\t\\thooks.stop.call( this, true );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any active animations, and finish them\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( true );\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any animations in the old queue and finish them\\n\\t\\t\\tfor ( index = 0; index < length; index++ ) {\\n\\t\\t\\t\\tif ( queue[ index ] && queue[ index ].finish ) {\\n\\t\\t\\t\\t\\tqueue[ index ].finish.call( this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Turn off finishing flag\\n\\t\\t\\tdelete data.finish;\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"toggle\\\", \\\"show\\\", \\\"hide\\\" ], function( i, name ) {\\n\\tvar cssFn = jQuery.fn[ name ];\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn speed == null || typeof speed === \\\"boolean\\\" ?\\n\\t\\t\\tcssFn.apply( this, arguments ) :\\n\\t\\t\\tthis.animate( genFx( name, true ), speed, easing, callback );\\n\\t};\\n} );\\n\\n// Generate shortcuts for custom animations\\njQuery.each( {\\n\\tslideDown: genFx( \\\"show\\\" ),\\n\\tslideUp: genFx( \\\"hide\\\" ),\\n\\tslideToggle: genFx( \\\"toggle\\\" ),\\n\\tfadeIn: { opacity: \\\"show\\\" },\\n\\tfadeOut: { opacity: \\\"hide\\\" },\\n\\tfadeToggle: { opacity: \\\"toggle\\\" }\\n}, function( name, props ) {\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn this.animate( props, speed, easing, callback );\\n\\t};\\n} );\\n\\njQuery.timers = [];\\njQuery.fx.tick = function() {\\n\\tvar timer,\\n\\t\\ti = 0,\\n\\t\\ttimers = jQuery.timers;\\n\\n\\tfxNow = jQuery.now();\\n\\n\\tfor ( ; i < timers.length; i++ ) {\\n\\t\\ttimer = timers[ i ];\\n\\n\\t\\t// Run the timer and safely remove it when done (allowing for external removal)\\n\\t\\tif ( !timer() && timers[ i ] === timer ) {\\n\\t\\t\\ttimers.splice( i--, 1 );\\n\\t\\t}\\n\\t}\\n\\n\\tif ( !timers.length ) {\\n\\t\\tjQuery.fx.stop();\\n\\t}\\n\\tfxNow = undefined;\\n};\\n\\njQuery.fx.timer = function( timer ) {\\n\\tjQuery.timers.push( timer );\\n\\tjQuery.fx.start();\\n};\\n\\njQuery.fx.interval = 13;\\njQuery.fx.start = function() {\\n\\tif ( inProgress ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\tinProgress = true;\\n\\tschedule();\\n};\\n\\njQuery.fx.stop = function() {\\n\\tinProgress = null;\\n};\\n\\njQuery.fx.speeds = {\\n\\tslow: 600,\\n\\tfast: 200,\\n\\n\\t// Default speed\\n\\t_default: 400\\n};\\n\\n\\n// Based off of the plugin by Clint Helfers, with permission.\\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\\njQuery.fn.delay = function( time, type ) {\\n\\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\\n\\ttype = type || \\\"fx\\\";\\n\\n\\treturn this.queue( type, function( next, hooks ) {\\n\\t\\tvar timeout = window.setTimeout( next, time );\\n\\t\\thooks.stop = function() {\\n\\t\\t\\twindow.clearTimeout( timeout );\\n\\t\\t};\\n\\t} );\\n};\\n\\n\\n( function() {\\n\\tvar input = document.createElement( \\\"input\\\" ),\\n\\t\\tselect = document.createElement( \\\"select\\\" ),\\n\\t\\topt = select.appendChild( document.createElement( \\\"option\\\" ) );\\n\\n\\tinput.type = \\\"checkbox\\\";\\n\\n\\t// Support: Android <=4.3 only\\n\\t// Default value for a checkbox should be \\\"on\\\"\\n\\tsupport.checkOn = input.value !== \\\"\\\";\\n\\n\\t// Support: IE <=11 only\\n\\t// Must access selectedIndex to make default options select\\n\\tsupport.optSelected = opt.selected;\\n\\n\\t// Support: IE <=11 only\\n\\t// An input loses its value after becoming a radio\\n\\tinput = document.createElement( \\\"input\\\" );\\n\\tinput.value = \\\"t\\\";\\n\\tinput.type = \\\"radio\\\";\\n\\tsupport.radioValue = input.value === \\\"t\\\";\\n} )();\\n\\n\\nvar boolHook,\\n\\tattrHandle = jQuery.expr.attrHandle;\\n\\njQuery.fn.extend( {\\n\\tattr: function( name, value ) {\\n\\t\\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveAttr: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.removeAttr( this, name );\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tattr: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set attributes on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Fallback to prop when attributes are not supported\\n\\t\\tif ( typeof elem.getAttribute === \\\"undefined\\\" ) {\\n\\t\\t\\treturn jQuery.prop( elem, name, value );\\n\\t\\t}\\n\\n\\t\\t// Attribute hooks are determined by the lowercase version\\n\\t\\t// Grab necessary hook if one is defined\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\t\\t\\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\\n\\t\\t\\t\\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( value === null ) {\\n\\t\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\telem.setAttribute( name, value + \\\"\\\" );\\n\\t\\t\\treturn value;\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\tret = jQuery.find.attr( elem, name );\\n\\n\\t\\t// Non-existent attributes return null, we normalize to undefined\\n\\t\\treturn ret == null ? undefined : ret;\\n\\t},\\n\\n\\tattrHooks: {\\n\\t\\ttype: {\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tif ( !support.radioValue && value === \\\"radio\\\" &&\\n\\t\\t\\t\\t\\tnodeName( elem, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tvar val = elem.value;\\n\\t\\t\\t\\t\\telem.setAttribute( \\\"type\\\", value );\\n\\t\\t\\t\\t\\tif ( val ) {\\n\\t\\t\\t\\t\\t\\telem.value = val;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tremoveAttr: function( elem, value ) {\\n\\t\\tvar name,\\n\\t\\t\\ti = 0,\\n\\n\\t\\t\\t// Attribute names can contain non-HTML whitespace characters\\n\\t\\t\\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\\n\\t\\t\\tattrNames = value && value.match( rnothtmlwhite );\\n\\n\\t\\tif ( attrNames && elem.nodeType === 1 ) {\\n\\t\\t\\twhile ( ( name = attrNames[ i++ ] ) ) {\\n\\t\\t\\t\\telem.removeAttribute( name );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Hooks for boolean attributes\\nboolHook = {\\n\\tset: function( elem, value, name ) {\\n\\t\\tif ( value === false ) {\\n\\n\\t\\t\\t// Remove boolean attributes when set to false\\n\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t} else {\\n\\t\\t\\telem.setAttribute( name, name );\\n\\t\\t}\\n\\t\\treturn name;\\n\\t}\\n};\\n\\njQuery.each( jQuery.expr.match.bool.source.match( /\\\\w+/g ), function( i, name ) {\\n\\tvar getter = attrHandle[ name ] || jQuery.find.attr;\\n\\n\\tattrHandle[ name ] = function( elem, name, isXML ) {\\n\\t\\tvar ret, handle,\\n\\t\\t\\tlowercaseName = name.toLowerCase();\\n\\n\\t\\tif ( !isXML ) {\\n\\n\\t\\t\\t// Avoid an infinite loop by temporarily removing this function from the getter\\n\\t\\t\\thandle = attrHandle[ lowercaseName ];\\n\\t\\t\\tattrHandle[ lowercaseName ] = ret;\\n\\t\\t\\tret = getter( elem, name, isXML ) != null ?\\n\\t\\t\\t\\tlowercaseName :\\n\\t\\t\\t\\tnull;\\n\\t\\t\\tattrHandle[ lowercaseName ] = handle;\\n\\t\\t}\\n\\t\\treturn ret;\\n\\t};\\n} );\\n\\n\\n\\n\\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\\n\\trclickable = /^(?:a|area)$/i;\\n\\njQuery.fn.extend( {\\n\\tprop: function( name, value ) {\\n\\t\\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveProp: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tdelete this[ jQuery.propFix[ name ] || name ];\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tprop: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set properties on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// Fix name and attach hooks\\n\\t\\t\\tname = jQuery.propFix[ name ] || name;\\n\\t\\t\\thooks = jQuery.propHooks[ name ];\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn ( elem[ name ] = value );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\treturn elem[ name ];\\n\\t},\\n\\n\\tpropHooks: {\\n\\t\\ttabIndex: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\t// Support: IE <=9 - 11 only\\n\\t\\t\\t\\t// elem.tabIndex doesn't always return the\\n\\t\\t\\t\\t// correct value when it hasn't been explicitly set\\n\\t\\t\\t\\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\\n\\t\\t\\t\\t// Use proper attribute retrieval(#12072)\\n\\t\\t\\t\\tvar tabindex = jQuery.find.attr( elem, \\\"tabindex\\\" );\\n\\n\\t\\t\\t\\tif ( tabindex ) {\\n\\t\\t\\t\\t\\treturn parseInt( tabindex, 10 );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tif (\\n\\t\\t\\t\\t\\trfocusable.test( elem.nodeName ) ||\\n\\t\\t\\t\\t\\trclickable.test( elem.nodeName ) &&\\n\\t\\t\\t\\t\\telem.href\\n\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\treturn 0;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn -1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tpropFix: {\\n\\t\\t\\\"for\\\": \\\"htmlFor\\\",\\n\\t\\t\\\"class\\\": \\\"className\\\"\\n\\t}\\n} );\\n\\n// Support: IE <=11 only\\n// Accessing the selectedIndex property\\n// forces the browser to respect setting selected\\n// on the option\\n// The getter ensures a default option is selected\\n// when in an optgroup\\n// eslint rule \\\"no-unused-expressions\\\" is disabled for this code\\n// since it considers such accessions noop\\nif ( !support.optSelected ) {\\n\\tjQuery.propHooks.selected = {\\n\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t/* eslint no-unused-expressions: \\\"off\\\" */\\n\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent && parent.parentNode ) {\\n\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t}\\n\\t\\t\\treturn null;\\n\\t\\t},\\n\\t\\tset: function( elem ) {\\n\\n\\t\\t\\t/* eslint no-unused-expressions: \\\"off\\\" */\\n\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\tparent.selectedIndex;\\n\\n\\t\\t\\t\\tif ( parent.parentNode ) {\\n\\t\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\njQuery.each( [\\n\\t\\\"tabIndex\\\",\\n\\t\\\"readOnly\\\",\\n\\t\\\"maxLength\\\",\\n\\t\\\"cellSpacing\\\",\\n\\t\\\"cellPadding\\\",\\n\\t\\\"rowSpan\\\",\\n\\t\\\"colSpan\\\",\\n\\t\\\"useMap\\\",\\n\\t\\\"frameBorder\\\",\\n\\t\\\"contentEditable\\\"\\n], function() {\\n\\tjQuery.propFix[ this.toLowerCase() ] = this;\\n} );\\n\\n\\n\\n\\n\\t// Strip and collapse whitespace according to HTML spec\\n\\t// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace\\n\\tfunction stripAndCollapse( value ) {\\n\\t\\tvar tokens = value.match( rnothtmlwhite ) || [];\\n\\t\\treturn tokens.join( \\\" \\\" );\\n\\t}\\n\\n\\nfunction getClass( elem ) {\\n\\treturn elem.getAttribute && elem.getAttribute( \\\"class\\\" ) || \\\"\\\";\\n}\\n\\njQuery.fn.extend( {\\n\\taddClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\t\\t\\t\\tcur = elem.nodeType === 1 && ( \\\" \\\" + stripAndCollapse( curValue ) + \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\t\\t\\t\\t\\t\\tif ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) < 0 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur += clazz + \\\" \\\";\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = stripAndCollapse( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tremoveClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\treturn this.attr( \\\"class\\\", \\\"\\\" );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\n\\t\\t\\t\\t// This expression is here for better compressibility (see addClass)\\n\\t\\t\\t\\tcur = elem.nodeType === 1 && ( \\\" \\\" + stripAndCollapse( curValue ) + \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Remove *all* instances\\n\\t\\t\\t\\t\\t\\twhile ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) > -1 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur = cur.replace( \\\" \\\" + clazz + \\\" \\\", \\\" \\\" );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = stripAndCollapse( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\ttoggleClass: function( value, stateVal ) {\\n\\t\\tvar type = typeof value;\\n\\n\\t\\tif ( typeof stateVal === \\\"boolean\\\" && type === \\\"string\\\" ) {\\n\\t\\t\\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\\n\\t\\t}\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).toggleClass(\\n\\t\\t\\t\\t\\tvalue.call( this, i, getClass( this ), stateVal ),\\n\\t\\t\\t\\t\\tstateVal\\n\\t\\t\\t\\t);\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar className, i, self, classNames;\\n\\n\\t\\t\\tif ( type === \\\"string\\\" ) {\\n\\n\\t\\t\\t\\t// Toggle individual class names\\n\\t\\t\\t\\ti = 0;\\n\\t\\t\\t\\tself = jQuery( this );\\n\\t\\t\\t\\tclassNames = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\t\\twhile ( ( className = classNames[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t// Check each className given, space separated list\\n\\t\\t\\t\\t\\tif ( self.hasClass( className ) ) {\\n\\t\\t\\t\\t\\t\\tself.removeClass( className );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tself.addClass( className );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Toggle whole class name\\n\\t\\t\\t} else if ( value === undefined || type === \\\"boolean\\\" ) {\\n\\t\\t\\t\\tclassName = getClass( this );\\n\\t\\t\\t\\tif ( className ) {\\n\\n\\t\\t\\t\\t\\t// Store className if set\\n\\t\\t\\t\\t\\tdataPriv.set( this, \\\"__className__\\\", className );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// If the element has a class name or if we're passed `false`,\\n\\t\\t\\t\\t// then remove the whole classname (if there was one, the above saved it).\\n\\t\\t\\t\\t// Otherwise bring back whatever was previously saved (if anything),\\n\\t\\t\\t\\t// falling back to the empty string if nothing was stored.\\n\\t\\t\\t\\tif ( this.setAttribute ) {\\n\\t\\t\\t\\t\\tthis.setAttribute( \\\"class\\\",\\n\\t\\t\\t\\t\\t\\tclassName || value === false ?\\n\\t\\t\\t\\t\\t\\t\\\"\\\" :\\n\\t\\t\\t\\t\\t\\tdataPriv.get( this, \\\"__className__\\\" ) || \\\"\\\"\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\thasClass: function( selector ) {\\n\\t\\tvar className, elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tclassName = \\\" \\\" + selector + \\\" \\\";\\n\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\tif ( elem.nodeType === 1 &&\\n\\t\\t\\t\\t( \\\" \\\" + stripAndCollapse( getClass( elem ) ) + \\\" \\\" ).indexOf( className ) > -1 ) {\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn false;\\n\\t}\\n} );\\n\\n\\n\\n\\nvar rreturn = /\\\\r/g;\\n\\njQuery.fn.extend( {\\n\\tval: function( value ) {\\n\\t\\tvar hooks, ret, isFunction,\\n\\t\\t\\telem = this[ 0 ];\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\thooks = jQuery.valHooks[ elem.type ] ||\\n\\t\\t\\t\\t\\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t\\tif ( hooks &&\\n\\t\\t\\t\\t\\t\\\"get\\\" in hooks &&\\n\\t\\t\\t\\t\\t( ret = hooks.get( elem, \\\"value\\\" ) ) !== undefined\\n\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\treturn ret;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tret = elem.value;\\n\\n\\t\\t\\t\\t// Handle most common string cases\\n\\t\\t\\t\\tif ( typeof ret === \\\"string\\\" ) {\\n\\t\\t\\t\\t\\treturn ret.replace( rreturn, \\\"\\\" );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Handle cases where value is null/undef or number\\n\\t\\t\\t\\treturn ret == null ? \\\"\\\" : ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tvar val;\\n\\n\\t\\t\\tif ( this.nodeType !== 1 ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\tval = value.call( this, i, jQuery( this ).val() );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tval = value;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Treat null/undefined as \\\"\\\"; convert numbers to string\\n\\t\\t\\tif ( val == null ) {\\n\\t\\t\\t\\tval = \\\"\\\";\\n\\n\\t\\t\\t} else if ( typeof val === \\\"number\\\" ) {\\n\\t\\t\\t\\tval += \\\"\\\";\\n\\n\\t\\t\\t} else if ( Array.isArray( val ) ) {\\n\\t\\t\\t\\tval = jQuery.map( val, function( value ) {\\n\\t\\t\\t\\t\\treturn value == null ? \\\"\\\" : value + \\\"\\\";\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\n\\t\\t\\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t// If set returns undefined, fall back to normal setting\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) || hooks.set( this, val, \\\"value\\\" ) === undefined ) {\\n\\t\\t\\t\\tthis.value = val;\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tvalHooks: {\\n\\t\\toption: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\tvar val = jQuery.find.attr( elem, \\\"value\\\" );\\n\\t\\t\\t\\treturn val != null ?\\n\\t\\t\\t\\t\\tval :\\n\\n\\t\\t\\t\\t\\t// Support: IE <=10 - 11 only\\n\\t\\t\\t\\t\\t// option.text throws exceptions (#14686, #14858)\\n\\t\\t\\t\\t\\t// Strip and collapse whitespace\\n\\t\\t\\t\\t\\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\\n\\t\\t\\t\\t\\tstripAndCollapse( jQuery.text( elem ) );\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tselect: {\\n\\t\\t\\tget: function( elem ) {\\n\\t\\t\\t\\tvar value, option, i,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tindex = elem.selectedIndex,\\n\\t\\t\\t\\t\\tone = elem.type === \\\"select-one\\\",\\n\\t\\t\\t\\t\\tvalues = one ? null : [],\\n\\t\\t\\t\\t\\tmax = one ? index + 1 : options.length;\\n\\n\\t\\t\\t\\tif ( index < 0 ) {\\n\\t\\t\\t\\t\\ti = max;\\n\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ti = one ? index : 0;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Loop through all the selected options\\n\\t\\t\\t\\tfor ( ; i < max; i++ ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\n\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t// IE8-9 doesn't update selected after form reset (#2551)\\n\\t\\t\\t\\t\\tif ( ( option.selected || i === index ) &&\\n\\n\\t\\t\\t\\t\\t\\t\\t// Don't return options that are disabled or in a disabled optgroup\\n\\t\\t\\t\\t\\t\\t\\t!option.disabled &&\\n\\t\\t\\t\\t\\t\\t\\t( !option.parentNode.disabled ||\\n\\t\\t\\t\\t\\t\\t\\t\\t!nodeName( option.parentNode, \\\"optgroup\\\" ) ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Get the specific value for the option\\n\\t\\t\\t\\t\\t\\tvalue = jQuery( option ).val();\\n\\n\\t\\t\\t\\t\\t\\t// We don't need an array for one selects\\n\\t\\t\\t\\t\\t\\tif ( one ) {\\n\\t\\t\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// Multi-Selects return an array\\n\\t\\t\\t\\t\\t\\tvalues.push( value );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t},\\n\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tvar optionSet, option,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tvalues = jQuery.makeArray( value ),\\n\\t\\t\\t\\t\\ti = options.length;\\n\\n\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\n\\t\\t\\t\\t\\t/* eslint-disable no-cond-assign */\\n\\n\\t\\t\\t\\t\\tif ( option.selected =\\n\\t\\t\\t\\t\\t\\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\\n\\t\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\t\\toptionSet = true;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t/* eslint-enable no-cond-assign */\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Force browsers to behave consistently when non-matching value is set\\n\\t\\t\\t\\tif ( !optionSet ) {\\n\\t\\t\\t\\t\\telem.selectedIndex = -1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Radios and checkboxes getter/setter\\njQuery.each( [ \\\"radio\\\", \\\"checkbox\\\" ], function() {\\n\\tjQuery.valHooks[ this ] = {\\n\\t\\tset: function( elem, value ) {\\n\\t\\t\\tif ( Array.isArray( value ) ) {\\n\\t\\t\\t\\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\tif ( !support.checkOn ) {\\n\\t\\tjQuery.valHooks[ this ].get = function( elem ) {\\n\\t\\t\\treturn elem.getAttribute( \\\"value\\\" ) === null ? \\\"on\\\" : elem.value;\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Return jQuery for attributes-only inclusion\\n\\n\\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\\n\\njQuery.extend( jQuery.event, {\\n\\n\\ttrigger: function( event, data, elem, onlyHandlers ) {\\n\\n\\t\\tvar i, cur, tmp, bubbleType, ontype, handle, special,\\n\\t\\t\\teventPath = [ elem || document ],\\n\\t\\t\\ttype = hasOwn.call( event, \\\"type\\\" ) ? event.type : event,\\n\\t\\t\\tnamespaces = hasOwn.call( event, \\\"namespace\\\" ) ? event.namespace.split( \\\".\\\" ) : [];\\n\\n\\t\\tcur = tmp = elem = elem || document;\\n\\n\\t\\t// Don't do events on text and comment nodes\\n\\t\\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\\n\\t\\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( type.indexOf( \\\".\\\" ) > -1 ) {\\n\\n\\t\\t\\t// Namespaced trigger; create a regexp to match event type in handle()\\n\\t\\t\\tnamespaces = type.split( \\\".\\\" );\\n\\t\\t\\ttype = namespaces.shift();\\n\\t\\t\\tnamespaces.sort();\\n\\t\\t}\\n\\t\\tontype = type.indexOf( \\\":\\\" ) < 0 && \\\"on\\\" + type;\\n\\n\\t\\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\\n\\t\\tevent = event[ jQuery.expando ] ?\\n\\t\\t\\tevent :\\n\\t\\t\\tnew jQuery.Event( type, typeof event === \\\"object\\\" && event );\\n\\n\\t\\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\\n\\t\\tevent.isTrigger = onlyHandlers ? 2 : 3;\\n\\t\\tevent.namespace = namespaces.join( \\\".\\\" );\\n\\t\\tevent.rnamespace = event.namespace ?\\n\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" ) :\\n\\t\\t\\tnull;\\n\\n\\t\\t// Clean up the event in case it is being reused\\n\\t\\tevent.result = undefined;\\n\\t\\tif ( !event.target ) {\\n\\t\\t\\tevent.target = elem;\\n\\t\\t}\\n\\n\\t\\t// Clone any incoming data and prepend the event, creating the handler arg list\\n\\t\\tdata = data == null ?\\n\\t\\t\\t[ event ] :\\n\\t\\t\\tjQuery.makeArray( data, [ event ] );\\n\\n\\t\\t// Allow special events to draw outside the lines\\n\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine event propagation path in advance, per W3C events spec (#9951)\\n\\t\\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\\n\\t\\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\tbubbleType = special.delegateType || type;\\n\\t\\t\\tif ( !rfocusMorph.test( bubbleType + type ) ) {\\n\\t\\t\\t\\tcur = cur.parentNode;\\n\\t\\t\\t}\\n\\t\\t\\tfor ( ; cur; cur = cur.parentNode ) {\\n\\t\\t\\t\\teventPath.push( cur );\\n\\t\\t\\t\\ttmp = cur;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\\n\\t\\t\\tif ( tmp === ( elem.ownerDocument || document ) ) {\\n\\t\\t\\t\\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Fire handlers on the event path\\n\\t\\ti = 0;\\n\\t\\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\n\\t\\t\\tevent.type = i > 1 ?\\n\\t\\t\\t\\tbubbleType :\\n\\t\\t\\t\\tspecial.bindType || type;\\n\\n\\t\\t\\t// jQuery handler\\n\\t\\t\\thandle = ( dataPriv.get( cur, \\\"events\\\" ) || {} )[ event.type ] &&\\n\\t\\t\\t\\tdataPriv.get( cur, \\\"handle\\\" );\\n\\t\\t\\tif ( handle ) {\\n\\t\\t\\t\\thandle.apply( cur, data );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Native handler\\n\\t\\t\\thandle = ontype && cur[ ontype ];\\n\\t\\t\\tif ( handle && handle.apply && acceptData( cur ) ) {\\n\\t\\t\\t\\tevent.result = handle.apply( cur, data );\\n\\t\\t\\t\\tif ( event.result === false ) {\\n\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tevent.type = type;\\n\\n\\t\\t// If nobody prevented the default action, do it now\\n\\t\\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\\n\\n\\t\\t\\tif ( ( !special._default ||\\n\\t\\t\\t\\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\\n\\t\\t\\t\\tacceptData( elem ) ) {\\n\\n\\t\\t\\t\\t// Call a native DOM method on the target with the same name as the event.\\n\\t\\t\\t\\t// Don't do default actions on window, that's where global variables be (#6170)\\n\\t\\t\\t\\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\t\\t\\t// Don't re-trigger an onFOO event when we call its FOO() method\\n\\t\\t\\t\\t\\ttmp = elem[ ontype ];\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = null;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Prevent re-triggering of the same event, since we already bubbled it above\\n\\t\\t\\t\\t\\tjQuery.event.triggered = type;\\n\\t\\t\\t\\t\\telem[ type ]();\\n\\t\\t\\t\\t\\tjQuery.event.triggered = undefined;\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = tmp;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\t// Piggyback on a donor event to simulate a different one\\n\\t// Used only for `focus(in | out)` events\\n\\tsimulate: function( type, elem, event ) {\\n\\t\\tvar e = jQuery.extend(\\n\\t\\t\\tnew jQuery.Event(),\\n\\t\\t\\tevent,\\n\\t\\t\\t{\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\tisSimulated: true\\n\\t\\t\\t}\\n\\t\\t);\\n\\n\\t\\tjQuery.event.trigger( e, null, elem );\\n\\t}\\n\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\ttrigger: function( type, data ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.trigger( type, data, this );\\n\\t\\t} );\\n\\t},\\n\\ttriggerHandler: function( type, data ) {\\n\\t\\tvar elem = this[ 0 ];\\n\\t\\tif ( elem ) {\\n\\t\\t\\treturn jQuery.event.trigger( type, data, elem, true );\\n\\t\\t}\\n\\t}\\n} );\\n\\n\\njQuery.each( ( \\\"blur focus focusin focusout resize scroll click dblclick \\\" +\\n\\t\\\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \\\" +\\n\\t\\\"change select submit keydown keypress keyup contextmenu\\\" ).split( \\\" \\\" ),\\n\\tfunction( i, name ) {\\n\\n\\t// Handle event binding\\n\\tjQuery.fn[ name ] = function( data, fn ) {\\n\\t\\treturn arguments.length > 0 ?\\n\\t\\t\\tthis.on( name, null, data, fn ) :\\n\\t\\t\\tthis.trigger( name );\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\thover: function( fnOver, fnOut ) {\\n\\t\\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\\n\\t}\\n} );\\n\\n\\n\\n\\nsupport.focusin = \\\"onfocusin\\\" in window;\\n\\n\\n// Support: Firefox <=44\\n// Firefox doesn't have focus(in | out) events\\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\\n//\\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\\n// focus(in | out) events fire after focus & blur events,\\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\\nif ( !support.focusin ) {\\n\\tjQuery.each( { focus: \\\"focusin\\\", blur: \\\"focusout\\\" }, function( orig, fix ) {\\n\\n\\t\\t// Attach a single capturing handler on the document while someone wants focusin/focusout\\n\\t\\tvar handler = function( event ) {\\n\\t\\t\\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\\n\\t\\t};\\n\\n\\t\\tjQuery.event.special[ fix ] = {\\n\\t\\t\\tsetup: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix );\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.addEventListener( orig, handler, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\\n\\t\\t\\t},\\n\\t\\t\\tteardown: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix ) - 1;\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.removeEventListener( orig, handler, true );\\n\\t\\t\\t\\t\\tdataPriv.remove( doc, fix );\\n\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdataPriv.access( doc, fix, attaches );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t} );\\n}\\nvar location = window.location;\\n\\nvar nonce = jQuery.now();\\n\\nvar rquery = ( /\\\\?/ );\\n\\n\\n\\n// Cross-browser xml parsing\\njQuery.parseXML = function( data ) {\\n\\tvar xml;\\n\\tif ( !data || typeof data !== \\\"string\\\" ) {\\n\\t\\treturn null;\\n\\t}\\n\\n\\t// Support: IE 9 - 11 only\\n\\t// IE throws on parseFromString with invalid input.\\n\\ttry {\\n\\t\\txml = ( new window.DOMParser() ).parseFromString( data, \\\"text/xml\\\" );\\n\\t} catch ( e ) {\\n\\t\\txml = undefined;\\n\\t}\\n\\n\\tif ( !xml || xml.getElementsByTagName( \\\"parsererror\\\" ).length ) {\\n\\t\\tjQuery.error( \\\"Invalid XML: \\\" + data );\\n\\t}\\n\\treturn xml;\\n};\\n\\n\\nvar\\n\\trbracket = /\\\\[\\\\]$/,\\n\\trCRLF = /\\\\r?\\\\n/g,\\n\\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\\n\\trsubmittable = /^(?:input|select|textarea|keygen)/i;\\n\\nfunction buildParams( prefix, obj, traditional, add ) {\\n\\tvar name;\\n\\n\\tif ( Array.isArray( obj ) ) {\\n\\n\\t\\t// Serialize array item.\\n\\t\\tjQuery.each( obj, function( i, v ) {\\n\\t\\t\\tif ( traditional || rbracket.test( prefix ) ) {\\n\\n\\t\\t\\t\\t// Treat each array item as a scalar.\\n\\t\\t\\t\\tadd( prefix, v );\\n\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Item is non-scalar (array or object), encode its numeric index.\\n\\t\\t\\t\\tbuildParams(\\n\\t\\t\\t\\t\\tprefix + \\\"[\\\" + ( typeof v === \\\"object\\\" && v != null ? i : \\\"\\\" ) + \\\"]\\\",\\n\\t\\t\\t\\t\\tv,\\n\\t\\t\\t\\t\\ttraditional,\\n\\t\\t\\t\\t\\tadd\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t} );\\n\\n\\t} else if ( !traditional && jQuery.type( obj ) === \\\"object\\\" ) {\\n\\n\\t\\t// Serialize object item.\\n\\t\\tfor ( name in obj ) {\\n\\t\\t\\tbuildParams( prefix + \\\"[\\\" + name + \\\"]\\\", obj[ name ], traditional, add );\\n\\t\\t}\\n\\n\\t} else {\\n\\n\\t\\t// Serialize scalar item.\\n\\t\\tadd( prefix, obj );\\n\\t}\\n}\\n\\n// Serialize an array of form elements or a set of\\n// key/values into a query string\\njQuery.param = function( a, traditional ) {\\n\\tvar prefix,\\n\\t\\ts = [],\\n\\t\\tadd = function( key, valueOrFunction ) {\\n\\n\\t\\t\\t// If value is a function, invoke it and use its return value\\n\\t\\t\\tvar value = jQuery.isFunction( valueOrFunction ) ?\\n\\t\\t\\t\\tvalueOrFunction() :\\n\\t\\t\\t\\tvalueOrFunction;\\n\\n\\t\\t\\ts[ s.length ] = encodeURIComponent( key ) + \\\"=\\\" +\\n\\t\\t\\t\\tencodeURIComponent( value == null ? \\\"\\\" : value );\\n\\t\\t};\\n\\n\\t// If an array was passed in, assume that it is an array of form elements.\\n\\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\\n\\n\\t\\t// Serialize the form elements\\n\\t\\tjQuery.each( a, function() {\\n\\t\\t\\tadd( this.name, this.value );\\n\\t\\t} );\\n\\n\\t} else {\\n\\n\\t\\t// If traditional, encode the \\\"old\\\" way (the way 1.3.2 or older\\n\\t\\t// did it), otherwise encode params recursively.\\n\\t\\tfor ( prefix in a ) {\\n\\t\\t\\tbuildParams( prefix, a[ prefix ], traditional, add );\\n\\t\\t}\\n\\t}\\n\\n\\t// Return the resulting serialization\\n\\treturn s.join( \\\"&\\\" );\\n};\\n\\njQuery.fn.extend( {\\n\\tserialize: function() {\\n\\t\\treturn jQuery.param( this.serializeArray() );\\n\\t},\\n\\tserializeArray: function() {\\n\\t\\treturn this.map( function() {\\n\\n\\t\\t\\t// Can add propHook for \\\"elements\\\" to filter or add form elements\\n\\t\\t\\tvar elements = jQuery.prop( this, \\\"elements\\\" );\\n\\t\\t\\treturn elements ? jQuery.makeArray( elements ) : this;\\n\\t\\t} )\\n\\t\\t.filter( function() {\\n\\t\\t\\tvar type = this.type;\\n\\n\\t\\t\\t// Use .is( \\\":disabled\\\" ) so that fieldset[disabled] works\\n\\t\\t\\treturn this.name && !jQuery( this ).is( \\\":disabled\\\" ) &&\\n\\t\\t\\t\\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\\n\\t\\t\\t\\t( this.checked || !rcheckableType.test( type ) );\\n\\t\\t} )\\n\\t\\t.map( function( i, elem ) {\\n\\t\\t\\tvar val = jQuery( this ).val();\\n\\n\\t\\t\\tif ( val == null ) {\\n\\t\\t\\t\\treturn null;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( Array.isArray( val ) ) {\\n\\t\\t\\t\\treturn jQuery.map( val, function( val ) {\\n\\t\\t\\t\\t\\treturn { name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn { name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t} ).get();\\n\\t}\\n} );\\n\\n\\nvar\\n\\tr20 = /%20/g,\\n\\trhash = /#.*$/,\\n\\trantiCache = /([?&])_=[^&]*/,\\n\\trheaders = /^(.*?):[ \\\\t]*([^\\\\r\\\\n]*)$/mg,\\n\\n\\t// #7653, #8125, #8152: local protocol detection\\n\\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\\n\\trnoContent = /^(?:GET|HEAD)$/,\\n\\trprotocol = /^\\\\/\\\\//,\\n\\n\\t/* Prefilters\\n\\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\\n\\t * 2) These are called:\\n\\t * - BEFORE asking for a transport\\n\\t * - AFTER param serialization (s.data is a string if s.processData is true)\\n\\t * 3) key is the dataType\\n\\t * 4) the catchall symbol \\\"*\\\" can be used\\n\\t * 5) execution will start with transport dataType and THEN continue down to \\\"*\\\" if needed\\n\\t */\\n\\tprefilters = {},\\n\\n\\t/* Transports bindings\\n\\t * 1) key is the dataType\\n\\t * 2) the catchall symbol \\\"*\\\" can be used\\n\\t * 3) selection will start with transport dataType and THEN go to \\\"*\\\" if needed\\n\\t */\\n\\ttransports = {},\\n\\n\\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\\n\\tallTypes = \\\"*/\\\".concat( \\\"*\\\" ),\\n\\n\\t// Anchor tag for parsing the document origin\\n\\toriginAnchor = document.createElement( \\\"a\\\" );\\n\\toriginAnchor.href = location.href;\\n\\n// Base \\\"constructor\\\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\\nfunction addToPrefiltersOrTransports( structure ) {\\n\\n\\t// dataTypeExpression is optional and defaults to \\\"*\\\"\\n\\treturn function( dataTypeExpression, func ) {\\n\\n\\t\\tif ( typeof dataTypeExpression !== \\\"string\\\" ) {\\n\\t\\t\\tfunc = dataTypeExpression;\\n\\t\\t\\tdataTypeExpression = \\\"*\\\";\\n\\t\\t}\\n\\n\\t\\tvar dataType,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\\n\\n\\t\\tif ( jQuery.isFunction( func ) ) {\\n\\n\\t\\t\\t// For each dataType in the dataTypeExpression\\n\\t\\t\\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t// Prepend if requested\\n\\t\\t\\t\\tif ( dataType[ 0 ] === \\\"+\\\" ) {\\n\\t\\t\\t\\t\\tdataType = dataType.slice( 1 ) || \\\"*\\\";\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\\n\\n\\t\\t\\t\\t// Otherwise append\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\n// Base inspection function for prefilters and transports\\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\\n\\n\\tvar inspected = {},\\n\\t\\tseekingTransport = ( structure === transports );\\n\\n\\tfunction inspect( dataType ) {\\n\\t\\tvar selected;\\n\\t\\tinspected[ dataType ] = true;\\n\\t\\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\\n\\t\\t\\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\\n\\t\\t\\tif ( typeof dataTypeOrTransport === \\\"string\\\" &&\\n\\t\\t\\t\\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\\n\\n\\t\\t\\t\\toptions.dataTypes.unshift( dataTypeOrTransport );\\n\\t\\t\\t\\tinspect( dataTypeOrTransport );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t} else if ( seekingTransport ) {\\n\\t\\t\\t\\treturn !( selected = dataTypeOrTransport );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t\\treturn selected;\\n\\t}\\n\\n\\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \\\"*\\\" ] && inspect( \\\"*\\\" );\\n}\\n\\n// A special extend for ajax options\\n// that takes \\\"flat\\\" options (not to be deep extended)\\n// Fixes #9887\\nfunction ajaxExtend( target, src ) {\\n\\tvar key, deep,\\n\\t\\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\\n\\n\\tfor ( key in src ) {\\n\\t\\tif ( src[ key ] !== undefined ) {\\n\\t\\t\\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\\n\\t\\t}\\n\\t}\\n\\tif ( deep ) {\\n\\t\\tjQuery.extend( true, target, deep );\\n\\t}\\n\\n\\treturn target;\\n}\\n\\n/* Handles responses to an ajax request:\\n * - finds the right dataType (mediates between content-type and expected dataType)\\n * - returns the corresponding response\\n */\\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\\n\\n\\tvar ct, type, finalDataType, firstDataType,\\n\\t\\tcontents = s.contents,\\n\\t\\tdataTypes = s.dataTypes;\\n\\n\\t// Remove auto dataType and get content-type in the process\\n\\twhile ( dataTypes[ 0 ] === \\\"*\\\" ) {\\n\\t\\tdataTypes.shift();\\n\\t\\tif ( ct === undefined ) {\\n\\t\\t\\tct = s.mimeType || jqXHR.getResponseHeader( \\\"Content-Type\\\" );\\n\\t\\t}\\n\\t}\\n\\n\\t// Check if we're dealing with a known content-type\\n\\tif ( ct ) {\\n\\t\\tfor ( type in contents ) {\\n\\t\\t\\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\\n\\t\\t\\t\\tdataTypes.unshift( type );\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Check to see if we have a response for the expected dataType\\n\\tif ( dataTypes[ 0 ] in responses ) {\\n\\t\\tfinalDataType = dataTypes[ 0 ];\\n\\t} else {\\n\\n\\t\\t// Try convertible dataTypes\\n\\t\\tfor ( type in responses ) {\\n\\t\\t\\tif ( !dataTypes[ 0 ] || s.converters[ type + \\\" \\\" + dataTypes[ 0 ] ] ) {\\n\\t\\t\\t\\tfinalDataType = type;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tif ( !firstDataType ) {\\n\\t\\t\\t\\tfirstDataType = type;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Or just use first one\\n\\t\\tfinalDataType = finalDataType || firstDataType;\\n\\t}\\n\\n\\t// If we found a dataType\\n\\t// We add the dataType to the list if needed\\n\\t// and return the corresponding response\\n\\tif ( finalDataType ) {\\n\\t\\tif ( finalDataType !== dataTypes[ 0 ] ) {\\n\\t\\t\\tdataTypes.unshift( finalDataType );\\n\\t\\t}\\n\\t\\treturn responses[ finalDataType ];\\n\\t}\\n}\\n\\n/* Chain conversions given the request and the original response\\n * Also sets the responseXXX fields on the jqXHR instance\\n */\\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\\n\\tvar conv2, current, conv, tmp, prev,\\n\\t\\tconverters = {},\\n\\n\\t\\t// Work with a copy of dataTypes in case we need to modify it for conversion\\n\\t\\tdataTypes = s.dataTypes.slice();\\n\\n\\t// Create converters map with lowercased keys\\n\\tif ( dataTypes[ 1 ] ) {\\n\\t\\tfor ( conv in s.converters ) {\\n\\t\\t\\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\\n\\t\\t}\\n\\t}\\n\\n\\tcurrent = dataTypes.shift();\\n\\n\\t// Convert to each sequential dataType\\n\\twhile ( current ) {\\n\\n\\t\\tif ( s.responseFields[ current ] ) {\\n\\t\\t\\tjqXHR[ s.responseFields[ current ] ] = response;\\n\\t\\t}\\n\\n\\t\\t// Apply the dataFilter if provided\\n\\t\\tif ( !prev && isSuccess && s.dataFilter ) {\\n\\t\\t\\tresponse = s.dataFilter( response, s.dataType );\\n\\t\\t}\\n\\n\\t\\tprev = current;\\n\\t\\tcurrent = dataTypes.shift();\\n\\n\\t\\tif ( current ) {\\n\\n\\t\\t\\t// There's only work to do if current dataType is non-auto\\n\\t\\t\\tif ( current === \\\"*\\\" ) {\\n\\n\\t\\t\\t\\tcurrent = prev;\\n\\n\\t\\t\\t// Convert response if prev dataType is non-auto and differs from current\\n\\t\\t\\t} else if ( prev !== \\\"*\\\" && prev !== current ) {\\n\\n\\t\\t\\t\\t// Seek a direct converter\\n\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + current ] || converters[ \\\"* \\\" + current ];\\n\\n\\t\\t\\t\\t// If none found, seek a pair\\n\\t\\t\\t\\tif ( !conv ) {\\n\\t\\t\\t\\t\\tfor ( conv2 in converters ) {\\n\\n\\t\\t\\t\\t\\t\\t// If conv2 outputs current\\n\\t\\t\\t\\t\\t\\ttmp = conv2.split( \\\" \\\" );\\n\\t\\t\\t\\t\\t\\tif ( tmp[ 1 ] === current ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// If prev can be converted to accepted input\\n\\t\\t\\t\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + tmp[ 0 ] ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\tconverters[ \\\"* \\\" + tmp[ 0 ] ];\\n\\t\\t\\t\\t\\t\\t\\tif ( conv ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Condense equivalence converters\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( conv === true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tconv = converters[ conv2 ];\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Otherwise, insert the intermediate dataType\\n\\t\\t\\t\\t\\t\\t\\t\\t} else if ( converters[ conv2 ] !== true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcurrent = tmp[ 0 ];\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdataTypes.unshift( tmp[ 1 ] );\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Apply converter (if not an equivalence)\\n\\t\\t\\t\\tif ( conv !== true ) {\\n\\n\\t\\t\\t\\t\\t// Unless errors are allowed to bubble, catch and return them\\n\\t\\t\\t\\t\\tif ( conv && s.throws ) {\\n\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t\\t} catch ( e ) {\\n\\t\\t\\t\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\t\\t\\t\\tstate: \\\"parsererror\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\terror: conv ? e : \\\"No conversion from \\\" + prev + \\\" to \\\" + current\\n\\t\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn { state: \\\"success\\\", data: response };\\n}\\n\\njQuery.extend( {\\n\\n\\t// Counter for holding the number of active queries\\n\\tactive: 0,\\n\\n\\t// Last-Modified header cache for next request\\n\\tlastModified: {},\\n\\tetag: {},\\n\\n\\tajaxSettings: {\\n\\t\\turl: location.href,\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tisLocal: rlocalProtocol.test( location.protocol ),\\n\\t\\tglobal: true,\\n\\t\\tprocessData: true,\\n\\t\\tasync: true,\\n\\t\\tcontentType: \\\"application/x-www-form-urlencoded; charset=UTF-8\\\",\\n\\n\\t\\t/*\\n\\t\\ttimeout: 0,\\n\\t\\tdata: null,\\n\\t\\tdataType: null,\\n\\t\\tusername: null,\\n\\t\\tpassword: null,\\n\\t\\tcache: null,\\n\\t\\tthrows: false,\\n\\t\\ttraditional: false,\\n\\t\\theaders: {},\\n\\t\\t*/\\n\\n\\t\\taccepts: {\\n\\t\\t\\t\\\"*\\\": allTypes,\\n\\t\\t\\ttext: \\\"text/plain\\\",\\n\\t\\t\\thtml: \\\"text/html\\\",\\n\\t\\t\\txml: \\\"application/xml, text/xml\\\",\\n\\t\\t\\tjson: \\\"application/json, text/javascript\\\"\\n\\t\\t},\\n\\n\\t\\tcontents: {\\n\\t\\t\\txml: /\\\\bxml\\\\b/,\\n\\t\\t\\thtml: /\\\\bhtml/,\\n\\t\\t\\tjson: /\\\\bjson\\\\b/\\n\\t\\t},\\n\\n\\t\\tresponseFields: {\\n\\t\\t\\txml: \\\"responseXML\\\",\\n\\t\\t\\ttext: \\\"responseText\\\",\\n\\t\\t\\tjson: \\\"responseJSON\\\"\\n\\t\\t},\\n\\n\\t\\t// Data converters\\n\\t\\t// Keys separate source (or catchall \\\"*\\\") and destination types with a single space\\n\\t\\tconverters: {\\n\\n\\t\\t\\t// Convert anything to text\\n\\t\\t\\t\\\"* text\\\": String,\\n\\n\\t\\t\\t// Text to html (true = no transformation)\\n\\t\\t\\t\\\"text html\\\": true,\\n\\n\\t\\t\\t// Evaluate text as a json expression\\n\\t\\t\\t\\\"text json\\\": JSON.parse,\\n\\n\\t\\t\\t// Parse text as xml\\n\\t\\t\\t\\\"text xml\\\": jQuery.parseXML\\n\\t\\t},\\n\\n\\t\\t// For options that shouldn't be deep extended:\\n\\t\\t// you can add your own custom options here if\\n\\t\\t// and when you create one that shouldn't be\\n\\t\\t// deep extended (see ajaxExtend)\\n\\t\\tflatOptions: {\\n\\t\\t\\turl: true,\\n\\t\\t\\tcontext: true\\n\\t\\t}\\n\\t},\\n\\n\\t// Creates a full fledged settings object into target\\n\\t// with both ajaxSettings and settings fields.\\n\\t// If target is omitted, writes into ajaxSettings.\\n\\tajaxSetup: function( target, settings ) {\\n\\t\\treturn settings ?\\n\\n\\t\\t\\t// Building a settings object\\n\\t\\t\\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\\n\\n\\t\\t\\t// Extending ajaxSettings\\n\\t\\t\\tajaxExtend( jQuery.ajaxSettings, target );\\n\\t},\\n\\n\\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\\n\\tajaxTransport: addToPrefiltersOrTransports( transports ),\\n\\n\\t// Main method\\n\\tajax: function( url, options ) {\\n\\n\\t\\t// If url is an object, simulate pre-1.5 signature\\n\\t\\tif ( typeof url === \\\"object\\\" ) {\\n\\t\\t\\toptions = url;\\n\\t\\t\\turl = undefined;\\n\\t\\t}\\n\\n\\t\\t// Force options to be an object\\n\\t\\toptions = options || {};\\n\\n\\t\\tvar transport,\\n\\n\\t\\t\\t// URL without anti-cache param\\n\\t\\t\\tcacheURL,\\n\\n\\t\\t\\t// Response headers\\n\\t\\t\\tresponseHeadersString,\\n\\t\\t\\tresponseHeaders,\\n\\n\\t\\t\\t// timeout handle\\n\\t\\t\\ttimeoutTimer,\\n\\n\\t\\t\\t// Url cleanup var\\n\\t\\t\\turlAnchor,\\n\\n\\t\\t\\t// Request state (becomes false upon send and true upon completion)\\n\\t\\t\\tcompleted,\\n\\n\\t\\t\\t// To know if global events are to be dispatched\\n\\t\\t\\tfireGlobals,\\n\\n\\t\\t\\t// Loop variable\\n\\t\\t\\ti,\\n\\n\\t\\t\\t// uncached part of the url\\n\\t\\t\\tuncached,\\n\\n\\t\\t\\t// Create the final options object\\n\\t\\t\\ts = jQuery.ajaxSetup( {}, options ),\\n\\n\\t\\t\\t// Callbacks context\\n\\t\\t\\tcallbackContext = s.context || s,\\n\\n\\t\\t\\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\\n\\t\\t\\tglobalEventContext = s.context &&\\n\\t\\t\\t\\t( callbackContext.nodeType || callbackContext.jquery ) ?\\n\\t\\t\\t\\t\\tjQuery( callbackContext ) :\\n\\t\\t\\t\\t\\tjQuery.event,\\n\\n\\t\\t\\t// Deferreds\\n\\t\\t\\tdeferred = jQuery.Deferred(),\\n\\t\\t\\tcompleteDeferred = jQuery.Callbacks( \\\"once memory\\\" ),\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tstatusCode = s.statusCode || {},\\n\\n\\t\\t\\t// Headers (they are sent all at once)\\n\\t\\t\\trequestHeaders = {},\\n\\t\\t\\trequestHeadersNames = {},\\n\\n\\t\\t\\t// Default abort message\\n\\t\\t\\tstrAbort = \\\"canceled\\\",\\n\\n\\t\\t\\t// Fake xhr\\n\\t\\t\\tjqXHR = {\\n\\t\\t\\t\\treadyState: 0,\\n\\n\\t\\t\\t\\t// Builds headers hashtable if needed\\n\\t\\t\\t\\tgetResponseHeader: function( key ) {\\n\\t\\t\\t\\t\\tvar match;\\n\\t\\t\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\t\\t\\tif ( !responseHeaders ) {\\n\\t\\t\\t\\t\\t\\t\\tresponseHeaders = {};\\n\\t\\t\\t\\t\\t\\t\\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tmatch = responseHeaders[ key.toLowerCase() ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn match == null ? null : match;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Raw string\\n\\t\\t\\t\\tgetAllResponseHeaders: function() {\\n\\t\\t\\t\\t\\treturn completed ? responseHeadersString : null;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Caches the header\\n\\t\\t\\t\\tsetRequestHeader: function( name, value ) {\\n\\t\\t\\t\\t\\tif ( completed == null ) {\\n\\t\\t\\t\\t\\t\\tname = requestHeadersNames[ name.toLowerCase() ] =\\n\\t\\t\\t\\t\\t\\t\\trequestHeadersNames[ name.toLowerCase() ] || name;\\n\\t\\t\\t\\t\\t\\trequestHeaders[ name ] = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Overrides response content-type header\\n\\t\\t\\t\\toverrideMimeType: function( type ) {\\n\\t\\t\\t\\t\\tif ( completed == null ) {\\n\\t\\t\\t\\t\\t\\ts.mimeType = type;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\t\\tstatusCode: function( map ) {\\n\\t\\t\\t\\t\\tvar code;\\n\\t\\t\\t\\t\\tif ( map ) {\\n\\t\\t\\t\\t\\t\\tif ( completed ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Execute the appropriate callbacks\\n\\t\\t\\t\\t\\t\\t\\tjqXHR.always( map[ jqXHR.status ] );\\n\\t\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Lazy-add the new callbacks in a way that preserves old ones\\n\\t\\t\\t\\t\\t\\t\\tfor ( code in map ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Cancel the request\\n\\t\\t\\t\\tabort: function( statusText ) {\\n\\t\\t\\t\\t\\tvar finalText = statusText || strAbort;\\n\\t\\t\\t\\t\\tif ( transport ) {\\n\\t\\t\\t\\t\\t\\ttransport.abort( finalText );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdone( 0, finalText );\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\n\\t\\t// Attach deferreds\\n\\t\\tdeferred.promise( jqXHR );\\n\\n\\t\\t// Add protocol if not provided (prefilters might expect it)\\n\\t\\t// Handle falsy url in the settings object (#10093: consistency with old signature)\\n\\t\\t// We also use the url parameter if available\\n\\t\\ts.url = ( ( url || s.url || location.href ) + \\\"\\\" )\\n\\t\\t\\t.replace( rprotocol, location.protocol + \\\"//\\\" );\\n\\n\\t\\t// Alias method option to type as per ticket #12004\\n\\t\\ts.type = options.method || options.type || s.method || s.type;\\n\\n\\t\\t// Extract dataTypes list\\n\\t\\ts.dataTypes = ( s.dataType || \\\"*\\\" ).toLowerCase().match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\n\\t\\t// A cross-domain request is in order when the origin doesn't match the current origin.\\n\\t\\tif ( s.crossDomain == null ) {\\n\\t\\t\\turlAnchor = document.createElement( \\\"a\\\" );\\n\\n\\t\\t\\t// Support: IE <=8 - 11, Edge 12 - 13\\n\\t\\t\\t// IE throws exception on accessing the href property if url is malformed,\\n\\t\\t\\t// e.g. http://example.com:80x/\\n\\t\\t\\ttry {\\n\\t\\t\\t\\turlAnchor.href = s.url;\\n\\n\\t\\t\\t\\t// Support: IE <=8 - 11 only\\n\\t\\t\\t\\t// Anchor's host property isn't correctly set when s.url is relative\\n\\t\\t\\t\\turlAnchor.href = urlAnchor.href;\\n\\t\\t\\t\\ts.crossDomain = originAnchor.protocol + \\\"//\\\" + originAnchor.host !==\\n\\t\\t\\t\\t\\turlAnchor.protocol + \\\"//\\\" + urlAnchor.host;\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// If there is an error parsing the URL, assume it is crossDomain,\\n\\t\\t\\t\\t// it can be rejected by the transport if it is invalid\\n\\t\\t\\t\\ts.crossDomain = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Convert data if not already a string\\n\\t\\tif ( s.data && s.processData && typeof s.data !== \\\"string\\\" ) {\\n\\t\\t\\ts.data = jQuery.param( s.data, s.traditional );\\n\\t\\t}\\n\\n\\t\\t// Apply prefilters\\n\\t\\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\\n\\n\\t\\t// If request was aborted inside a prefilter, stop there\\n\\t\\tif ( completed ) {\\n\\t\\t\\treturn jqXHR;\\n\\t\\t}\\n\\n\\t\\t// We can fire global events as of now if asked to\\n\\t\\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\\n\\t\\tfireGlobals = jQuery.event && s.global;\\n\\n\\t\\t// Watch for a new set of requests\\n\\t\\tif ( fireGlobals && jQuery.active++ === 0 ) {\\n\\t\\t\\tjQuery.event.trigger( \\\"ajaxStart\\\" );\\n\\t\\t}\\n\\n\\t\\t// Uppercase the type\\n\\t\\ts.type = s.type.toUpperCase();\\n\\n\\t\\t// Determine if request has content\\n\\t\\ts.hasContent = !rnoContent.test( s.type );\\n\\n\\t\\t// Save the URL in case we're toying with the If-Modified-Since\\n\\t\\t// and/or If-None-Match header later on\\n\\t\\t// Remove hash to simplify url manipulation\\n\\t\\tcacheURL = s.url.replace( rhash, \\\"\\\" );\\n\\n\\t\\t// More options handling for requests with no content\\n\\t\\tif ( !s.hasContent ) {\\n\\n\\t\\t\\t// Remember the hash so we can put it back\\n\\t\\t\\tuncached = s.url.slice( cacheURL.length );\\n\\n\\t\\t\\t// If data is available, append data to url\\n\\t\\t\\tif ( s.data ) {\\n\\t\\t\\t\\tcacheURL += ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + s.data;\\n\\n\\t\\t\\t\\t// #9682: remove data so that it's not used in an eventual retry\\n\\t\\t\\t\\tdelete s.data;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add or update anti-cache param if needed\\n\\t\\t\\tif ( s.cache === false ) {\\n\\t\\t\\t\\tcacheURL = cacheURL.replace( rantiCache, \\\"$1\\\" );\\n\\t\\t\\t\\tuncached = ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + \\\"_=\\\" + ( nonce++ ) + uncached;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\\n\\t\\t\\ts.url = cacheURL + uncached;\\n\\n\\t\\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\\n\\t\\t} else if ( s.data && s.processData &&\\n\\t\\t\\t( s.contentType || \\\"\\\" ).indexOf( \\\"application/x-www-form-urlencoded\\\" ) === 0 ) {\\n\\t\\t\\ts.data = s.data.replace( r20, \\\"+\\\" );\\n\\t\\t}\\n\\n\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\tif ( s.ifModified ) {\\n\\t\\t\\tif ( jQuery.lastModified[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-Modified-Since\\\", jQuery.lastModified[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t\\tif ( jQuery.etag[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-None-Match\\\", jQuery.etag[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Set the correct header, if data is being sent\\n\\t\\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\\n\\t\\t\\tjqXHR.setRequestHeader( \\\"Content-Type\\\", s.contentType );\\n\\t\\t}\\n\\n\\t\\t// Set the Accepts header for the server, depending on the dataType\\n\\t\\tjqXHR.setRequestHeader(\\n\\t\\t\\t\\\"Accept\\\",\\n\\t\\t\\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\\n\\t\\t\\t\\ts.accepts[ s.dataTypes[ 0 ] ] +\\n\\t\\t\\t\\t\\t( s.dataTypes[ 0 ] !== \\\"*\\\" ? \\\", \\\" + allTypes + \\\"; q=0.01\\\" : \\\"\\\" ) :\\n\\t\\t\\t\\ts.accepts[ \\\"*\\\" ]\\n\\t\\t);\\n\\n\\t\\t// Check for headers option\\n\\t\\tfor ( i in s.headers ) {\\n\\t\\t\\tjqXHR.setRequestHeader( i, s.headers[ i ] );\\n\\t\\t}\\n\\n\\t\\t// Allow custom headers/mimetypes and early abort\\n\\t\\tif ( s.beforeSend &&\\n\\t\\t\\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\\n\\n\\t\\t\\t// Abort if not done already and return\\n\\t\\t\\treturn jqXHR.abort();\\n\\t\\t}\\n\\n\\t\\t// Aborting is no longer a cancellation\\n\\t\\tstrAbort = \\\"abort\\\";\\n\\n\\t\\t// Install callbacks on deferreds\\n\\t\\tcompleteDeferred.add( s.complete );\\n\\t\\tjqXHR.done( s.success );\\n\\t\\tjqXHR.fail( s.error );\\n\\n\\t\\t// Get transport\\n\\t\\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\\n\\n\\t\\t// If no transport, we auto-abort\\n\\t\\tif ( !transport ) {\\n\\t\\t\\tdone( -1, \\\"No Transport\\\" );\\n\\t\\t} else {\\n\\t\\t\\tjqXHR.readyState = 1;\\n\\n\\t\\t\\t// Send global event\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxSend\\\", [ jqXHR, s ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If request was aborted inside ajaxSend, stop there\\n\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\treturn jqXHR;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Timeout\\n\\t\\t\\tif ( s.async && s.timeout > 0 ) {\\n\\t\\t\\t\\ttimeoutTimer = window.setTimeout( function() {\\n\\t\\t\\t\\t\\tjqXHR.abort( \\\"timeout\\\" );\\n\\t\\t\\t\\t}, s.timeout );\\n\\t\\t\\t}\\n\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tcompleted = false;\\n\\t\\t\\t\\ttransport.send( requestHeaders, done );\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// Rethrow post-completion exceptions\\n\\t\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Propagate others as results\\n\\t\\t\\t\\tdone( -1, e );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Callback for when everything is done\\n\\t\\tfunction done( status, nativeStatusText, responses, headers ) {\\n\\t\\t\\tvar isSuccess, success, error, response, modified,\\n\\t\\t\\t\\tstatusText = nativeStatusText;\\n\\n\\t\\t\\t// Ignore repeat invocations\\n\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tcompleted = true;\\n\\n\\t\\t\\t// Clear timeout if it exists\\n\\t\\t\\tif ( timeoutTimer ) {\\n\\t\\t\\t\\twindow.clearTimeout( timeoutTimer );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Dereference transport for early garbage collection\\n\\t\\t\\t// (no matter how long the jqXHR object will be used)\\n\\t\\t\\ttransport = undefined;\\n\\n\\t\\t\\t// Cache response headers\\n\\t\\t\\tresponseHeadersString = headers || \\\"\\\";\\n\\n\\t\\t\\t// Set readyState\\n\\t\\t\\tjqXHR.readyState = status > 0 ? 4 : 0;\\n\\n\\t\\t\\t// Determine if successful\\n\\t\\t\\tisSuccess = status >= 200 && status < 300 || status === 304;\\n\\n\\t\\t\\t// Get response data\\n\\t\\t\\tif ( responses ) {\\n\\t\\t\\t\\tresponse = ajaxHandleResponses( s, jqXHR, responses );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Convert no matter what (that way responseXXX fields are always set)\\n\\t\\t\\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\\n\\n\\t\\t\\t// If successful, handle type chaining\\n\\t\\t\\tif ( isSuccess ) {\\n\\n\\t\\t\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\t\\t\\tif ( s.ifModified ) {\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"Last-Modified\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.lastModified[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"etag\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.etag[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// if no content\\n\\t\\t\\t\\tif ( status === 204 || s.type === \\\"HEAD\\\" ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"nocontent\\\";\\n\\n\\t\\t\\t\\t// if not modified\\n\\t\\t\\t\\t} else if ( status === 304 ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"notmodified\\\";\\n\\n\\t\\t\\t\\t// If we have data, let's convert it\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tstatusText = response.state;\\n\\t\\t\\t\\t\\tsuccess = response.data;\\n\\t\\t\\t\\t\\terror = response.error;\\n\\t\\t\\t\\t\\tisSuccess = !error;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Extract error from statusText and normalize for non-aborts\\n\\t\\t\\t\\terror = statusText;\\n\\t\\t\\t\\tif ( status || !statusText ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"error\\\";\\n\\t\\t\\t\\t\\tif ( status < 0 ) {\\n\\t\\t\\t\\t\\t\\tstatus = 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Set data for the fake xhr object\\n\\t\\t\\tjqXHR.status = status;\\n\\t\\t\\tjqXHR.statusText = ( nativeStatusText || statusText ) + \\\"\\\";\\n\\n\\t\\t\\t// Success/Error\\n\\t\\t\\tif ( isSuccess ) {\\n\\t\\t\\t\\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tjqXHR.statusCode( statusCode );\\n\\t\\t\\tstatusCode = undefined;\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( isSuccess ? \\\"ajaxSuccess\\\" : \\\"ajaxError\\\",\\n\\t\\t\\t\\t\\t[ jqXHR, s, isSuccess ? success : error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Complete\\n\\t\\t\\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxComplete\\\", [ jqXHR, s ] );\\n\\n\\t\\t\\t\\t// Handle the global AJAX counter\\n\\t\\t\\t\\tif ( !( --jQuery.active ) ) {\\n\\t\\t\\t\\t\\tjQuery.event.trigger( \\\"ajaxStop\\\" );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn jqXHR;\\n\\t},\\n\\n\\tgetJSON: function( url, data, callback ) {\\n\\t\\treturn jQuery.get( url, data, callback, \\\"json\\\" );\\n\\t},\\n\\n\\tgetScript: function( url, callback ) {\\n\\t\\treturn jQuery.get( url, undefined, callback, \\\"script\\\" );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"get\\\", \\\"post\\\" ], function( i, method ) {\\n\\tjQuery[ method ] = function( url, data, callback, type ) {\\n\\n\\t\\t// Shift arguments if data argument was omitted\\n\\t\\tif ( jQuery.isFunction( data ) ) {\\n\\t\\t\\ttype = type || callback;\\n\\t\\t\\tcallback = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t}\\n\\n\\t\\t// The url can be an options object (which then must have .url)\\n\\t\\treturn jQuery.ajax( jQuery.extend( {\\n\\t\\t\\turl: url,\\n\\t\\t\\ttype: method,\\n\\t\\t\\tdataType: type,\\n\\t\\t\\tdata: data,\\n\\t\\t\\tsuccess: callback\\n\\t\\t}, jQuery.isPlainObject( url ) && url ) );\\n\\t};\\n} );\\n\\n\\njQuery._evalUrl = function( url ) {\\n\\treturn jQuery.ajax( {\\n\\t\\turl: url,\\n\\n\\t\\t// Make this explicit, since user can override this through ajaxSetup (#11264)\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tdataType: \\\"script\\\",\\n\\t\\tcache: true,\\n\\t\\tasync: false,\\n\\t\\tglobal: false,\\n\\t\\t\\\"throws\\\": true\\n\\t} );\\n};\\n\\n\\njQuery.fn.extend( {\\n\\twrapAll: function( html ) {\\n\\t\\tvar wrap;\\n\\n\\t\\tif ( this[ 0 ] ) {\\n\\t\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\t\\thtml = html.call( this[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// The elements to wrap the target around\\n\\t\\t\\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\\n\\n\\t\\t\\tif ( this[ 0 ].parentNode ) {\\n\\t\\t\\t\\twrap.insertBefore( this[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\twrap.map( function() {\\n\\t\\t\\t\\tvar elem = this;\\n\\n\\t\\t\\t\\twhile ( elem.firstElementChild ) {\\n\\t\\t\\t\\t\\telem = elem.firstElementChild;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn elem;\\n\\t\\t\\t} ).append( this );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\twrapInner: function( html ) {\\n\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).wrapInner( html.call( this, i ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar self = jQuery( this ),\\n\\t\\t\\t\\tcontents = self.contents();\\n\\n\\t\\t\\tif ( contents.length ) {\\n\\t\\t\\t\\tcontents.wrapAll( html );\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.append( html );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\twrap: function( html ) {\\n\\t\\tvar isFunction = jQuery.isFunction( html );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\\n\\t\\t} );\\n\\t},\\n\\n\\tunwrap: function( selector ) {\\n\\t\\tthis.parent( selector ).not( \\\"body\\\" ).each( function() {\\n\\t\\t\\tjQuery( this ).replaceWith( this.childNodes );\\n\\t\\t} );\\n\\t\\treturn this;\\n\\t}\\n} );\\n\\n\\njQuery.expr.pseudos.hidden = function( elem ) {\\n\\treturn !jQuery.expr.pseudos.visible( elem );\\n};\\njQuery.expr.pseudos.visible = function( elem ) {\\n\\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\\n};\\n\\n\\n\\n\\njQuery.ajaxSettings.xhr = function() {\\n\\ttry {\\n\\t\\treturn new window.XMLHttpRequest();\\n\\t} catch ( e ) {}\\n};\\n\\nvar xhrSuccessStatus = {\\n\\n\\t\\t// File protocol always yields status code 0, assume 200\\n\\t\\t0: 200,\\n\\n\\t\\t// Support: IE <=9 only\\n\\t\\t// #1450: sometimes IE returns 1223 when it should be 204\\n\\t\\t1223: 204\\n\\t},\\n\\txhrSupported = jQuery.ajaxSettings.xhr();\\n\\nsupport.cors = !!xhrSupported && ( \\\"withCredentials\\\" in xhrSupported );\\nsupport.ajax = xhrSupported = !!xhrSupported;\\n\\njQuery.ajaxTransport( function( options ) {\\n\\tvar callback, errorCallback;\\n\\n\\t// Cross domain only allowed if supported through XMLHttpRequest\\n\\tif ( support.cors || xhrSupported && !options.crossDomain ) {\\n\\t\\treturn {\\n\\t\\t\\tsend: function( headers, complete ) {\\n\\t\\t\\t\\tvar i,\\n\\t\\t\\t\\t\\txhr = options.xhr();\\n\\n\\t\\t\\t\\txhr.open(\\n\\t\\t\\t\\t\\toptions.type,\\n\\t\\t\\t\\t\\toptions.url,\\n\\t\\t\\t\\t\\toptions.async,\\n\\t\\t\\t\\t\\toptions.username,\\n\\t\\t\\t\\t\\toptions.password\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t\\t// Apply custom fields if provided\\n\\t\\t\\t\\tif ( options.xhrFields ) {\\n\\t\\t\\t\\t\\tfor ( i in options.xhrFields ) {\\n\\t\\t\\t\\t\\t\\txhr[ i ] = options.xhrFields[ i ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Override mime type if needed\\n\\t\\t\\t\\tif ( options.mimeType && xhr.overrideMimeType ) {\\n\\t\\t\\t\\t\\txhr.overrideMimeType( options.mimeType );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// X-Requested-With header\\n\\t\\t\\t\\t// For cross-domain requests, seeing as conditions for a preflight are\\n\\t\\t\\t\\t// akin to a jigsaw puzzle, we simply never set it to be sure.\\n\\t\\t\\t\\t// (it can always be set on a per-request basis or even using ajaxSetup)\\n\\t\\t\\t\\t// For same-domain requests, won't change header if already provided.\\n\\t\\t\\t\\tif ( !options.crossDomain && !headers[ \\\"X-Requested-With\\\" ] ) {\\n\\t\\t\\t\\t\\theaders[ \\\"X-Requested-With\\\" ] = \\\"XMLHttpRequest\\\";\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Set headers\\n\\t\\t\\t\\tfor ( i in headers ) {\\n\\t\\t\\t\\t\\txhr.setRequestHeader( i, headers[ i ] );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Callback\\n\\t\\t\\t\\tcallback = function( type ) {\\n\\t\\t\\t\\t\\treturn function() {\\n\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\tcallback = errorCallback = xhr.onload =\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\\n\\n\\t\\t\\t\\t\\t\\t\\tif ( type === \\\"abort\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.abort();\\n\\t\\t\\t\\t\\t\\t\\t} else if ( type === \\\"error\\\" ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t// On a manual native abort, IE9 throws\\n\\t\\t\\t\\t\\t\\t\\t\\t// errors on any property access that is not readyState\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( typeof xhr.status !== \\\"number\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete( 0, \\\"error\\\" );\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// File: protocol always yields status 0; see #8605, #14207\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhrSuccessStatus[ xhr.status ] || xhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText,\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// IE9 has no XHR2 but throws on binary (trac-11426)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// For XHR2 non-text, let the caller handle it (gh-2498)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t( xhr.responseType || \\\"text\\\" ) !== \\\"text\\\" ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttypeof xhr.responseText !== \\\"string\\\" ?\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ binary: xhr.response } :\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ text: xhr.responseText },\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.getAllResponseHeaders()\\n\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t};\\n\\n\\t\\t\\t\\t// Listen to events\\n\\t\\t\\t\\txhr.onload = callback();\\n\\t\\t\\t\\terrorCallback = xhr.onerror = callback( \\\"error\\\" );\\n\\n\\t\\t\\t\\t// Support: IE 9 only\\n\\t\\t\\t\\t// Use onreadystatechange to replace onabort\\n\\t\\t\\t\\t// to handle uncaught aborts\\n\\t\\t\\t\\tif ( xhr.onabort !== undefined ) {\\n\\t\\t\\t\\t\\txhr.onabort = errorCallback;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\txhr.onreadystatechange = function() {\\n\\n\\t\\t\\t\\t\\t\\t// Check readyState before timeout as it changes\\n\\t\\t\\t\\t\\t\\tif ( xhr.readyState === 4 ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Allow onerror to be called first,\\n\\t\\t\\t\\t\\t\\t\\t// but that will not handle a native abort\\n\\t\\t\\t\\t\\t\\t\\t// Also, save errorCallback to a variable\\n\\t\\t\\t\\t\\t\\t\\t// as xhr.onerror cannot be accessed\\n\\t\\t\\t\\t\\t\\t\\twindow.setTimeout( function() {\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\terrorCallback();\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Create the abort callback\\n\\t\\t\\t\\tcallback = callback( \\\"abort\\\" );\\n\\n\\t\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t\\t// Do send the request (this may raise an exception)\\n\\t\\t\\t\\t\\txhr.send( options.hasContent && options.data || null );\\n\\t\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t\\t// #14683: Only rethrow if this hasn't been notified as an error yet\\n\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\tabort: function() {\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\\njQuery.ajaxPrefilter( function( s ) {\\n\\tif ( s.crossDomain ) {\\n\\t\\ts.contents.script = false;\\n\\t}\\n} );\\n\\n// Install script dataType\\njQuery.ajaxSetup( {\\n\\taccepts: {\\n\\t\\tscript: \\\"text/javascript, application/javascript, \\\" +\\n\\t\\t\\t\\\"application/ecmascript, application/x-ecmascript\\\"\\n\\t},\\n\\tcontents: {\\n\\t\\tscript: /\\\\b(?:java|ecma)script\\\\b/\\n\\t},\\n\\tconverters: {\\n\\t\\t\\\"text script\\\": function( text ) {\\n\\t\\t\\tjQuery.globalEval( text );\\n\\t\\t\\treturn text;\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Handle cache's special case and crossDomain\\njQuery.ajaxPrefilter( \\\"script\\\", function( s ) {\\n\\tif ( s.cache === undefined ) {\\n\\t\\ts.cache = false;\\n\\t}\\n\\tif ( s.crossDomain ) {\\n\\t\\ts.type = \\\"GET\\\";\\n\\t}\\n} );\\n\\n// Bind script tag hack transport\\njQuery.ajaxTransport( \\\"script\\\", function( s ) {\\n\\n\\t// This transport only deals with cross domain requests\\n\\tif ( s.crossDomain ) {\\n\\t\\tvar script, callback;\\n\\t\\treturn {\\n\\t\\t\\tsend: function( _, complete ) {\\n\\t\\t\\t\\tscript = jQuery( \\\"\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlP2FiYTYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjdGlvbi1saW5rW2RhdGEtdi0yMjU3NzhjMl0ge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5tLWItbm9uZVtkYXRhLXYtMjI1Nzc4YzJdIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIlBlcnNvbmFsQWNjZXNzVG9rZW5zLnZ1ZT81NzM0ZjRlNFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJQZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVxcXCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2Vuc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cXFwiYWN0aW9uLWxpbmtcXFwiIEBjbGljaz1cXFwic2hvd0NyZWF0ZVRva2VuRm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBOZXcgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBUb2tlbnMgTm90aWNlIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XFxcIm0tYi1ub25lXFxcIiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID09PSAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZSBub3QgY3JlYXRlZCBhbnkgcGVyc29uYWwgYWNjZXNzIHRva2Vucy5cXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUGVyc29uYWwgQWNjZXNzIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCIgdi1pZj1cXFwidG9rZW5zLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cXFwidG9rZW4gaW4gdG9rZW5zXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xpZW50IE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b2tlbi5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGUgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gTW9kYWwgLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbCBmYWRlXFxcIiBpZD1cXFwibW9kYWwtY3JlYXRlLXRva2VuXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZm9ybS5lcnJvcnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+V2hvb3BzITwvc3Ryb25nPiBTb21ldGhpbmcgd2VudCB3cm9uZyE8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIHYtZm9yPVxcXCJlcnJvciBpbiBmb3JtLmVycm9yc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXJyb3IgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gRm9ybSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cXFwiZm9ybS1ob3Jpem9udGFsXFxcIiByb2xlPVxcXCJmb3JtXFxcIiBAc3VibWl0LnByZXZlbnQ9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+TmFtZTwvbGFiZWw+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJjcmVhdGUtdG9rZW4tbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwibmFtZVxcXCIgdi1tb2RlbD1cXFwiZm9ybS5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTY29wZXMgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIHYtaWY9XFxcInNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+U2NvcGVzPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC02XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtZm9yPVxcXCJzY29wZSBpbiBzY29wZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjaGVja2JveFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcInRvZ2dsZVNjb3BlKHNjb3BlLmlkKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNoZWNrZWQ9XFxcInNjb3BlSXNBc3NpZ25lZChzY29wZS5pZClcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzY29wZS5pZCB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQWNjZXNzIFRva2VuIE1vZGFsIC0tPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwgZmFkZVxcXCIgaWQ9XFxcIm1vZGFsLWFjY2Vzcy10b2tlblxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2VuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgeW91ciBuZXcgcGVyc29uYWwgYWNjZXNzIHRva2VuLiBUaGlzIGlzIHRoZSBvbmx5IHRpbWUgaXQgd2lsbCBiZSBzaG93biBzbyBkb24ndCBsb3NlIGl0IVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IG5vdyB1c2UgdGhpcyB0b2tlbiB0byBtYWtlIEFQSSByZXF1ZXN0cy5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT57eyBhY2Nlc3NUb2tlbiB9fTwvY29kZT48L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNb2RhbCBBY3Rpb25zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCI+Q2xvc2U8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogbnVsbCxcXG5cXG4gICAgICAgICAgICAgICAgdG9rZW5zOiBbXSxcXG4gICAgICAgICAgICAgICAgc2NvcGVzOiBbXSxcXG5cXG4gICAgICAgICAgICAgICAgZm9ybToge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICBzY29wZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW5zKCk7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2NvcGVzKCk7XFxuXFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5vbignc2hvd24uYnMubW9kYWwnLCAoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAkKCcjY3JlYXRlLXRva2VuLW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zID0gcmVzcG9uc2UuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBzY29wZXMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgZ2V0U2NvcGVzKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmdldCgnL29hdXRoL3Njb3BlcycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlcyA9IHJlc3BvbnNlLmRhdGE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBTaG93IHRoZSBmb3JtIGZvciBjcmVhdGluZyBuZXcgdG9rZW5zLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dDcmVhdGVUb2tlbkZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5tb2RhbCgnc2hvdycpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogQ3JlYXRlIGEgbmV3IHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBzdG9yZSgpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XFxuXFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2VucycsIHRoaXMuZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5uYW1lID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmVycm9ycyA9IFtdO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHJlc3BvbnNlLmRhdGEudG9rZW4pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBY2Nlc3NUb2tlbihyZXNwb25zZS5kYXRhLmFjY2Vzc1Rva2VuKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBfLmZsYXR0ZW4oXy50b0FycmF5KHJlc3BvbnNlLmRhdGEpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kaXIodGhpcy5mb3JtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLiddO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBUb2dnbGUgdGhlIGdpdmVuIHNjb3BlIGluIHRoZSBsaXN0IG9mIGFzc2lnbmVkIHNjb3Blcy5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB0b2dnbGVTY29wZShzY29wZSkge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZUlzQXNzaWduZWQoc2NvcGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2NvcGVzID0gXy5yZWplY3QodGhpcy5mb3JtLnNjb3BlcywgcyA9PiBzID09IHNjb3BlKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMucHVzaChzY29wZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gc2NvcGUgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRva2VuLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNjb3BlSXNBc3NpZ25lZChzY29wZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5pbmRleE9mKHRoaXMuZm9ybS5zY29wZXMsIHNjb3BlKSA+PSAwO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZ2l2ZW4gYWNjZXNzIHRva2VuIHRvIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLXRva2VuJykubW9kYWwoJ2hpZGUnKTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtYWNjZXNzLXRva2VuJykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFJldm9rZSB0aGUgZ2l2ZW4gdG9rZW4uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcmV2b2tlKHRva2VuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZGVsZXRlKCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2Vucy8nICsgdG9rZW4uaWQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXX1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0yMjU3NzhjMiZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9wYXNzcG9ydC9QZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcbi8vIG1vZHVsZSBpZCA9IDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"alert.vue\\\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvYWxlcnQudnVlP2EwMWUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJcIixcImZpbGVcIjpcImFsZXJ0LnZ1ZVwifV0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNlZGVmM2JhJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2FsZXJ0LnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\ntd[data-v-5301a236] {\\\\n font-size: 14px;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"importer.vue?ec28e03c\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA\\\",\\\"file\\\":\\\"importer.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXIudnVlPzNiMGEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxudGRbZGF0YS12LTUzMDFhMjM2XSB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcImltcG9ydGVyLnZ1ZT9lYzI4ZTAzY1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJpbXBvcnRlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG50ZCB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuPC9zdHlsZT5cXG48dGVtcGxhdGU+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJvd1xcXCI+XFxuICAgICAgICA8YWxlcnQgdi1zaG93PVxcXCJhbGVydC52aXNpYmxlXFxcIiA6YWxlcnRUeXBlPVxcXCJhbGVydC50eXBlXFxcIiB2LW9uOmhpZGU9XFxcImFsZXJ0LnZpc2libGUgPSBmYWxzZVxcXCI+e3sgYWxlcnQubWVzc2FnZSB9fTwvYWxlcnQ+XFxuICAgICAgICA8ZXJyb3JzIDplcnJvcnM9XFxcImltcG9ydEVycm9yc1xcXCI+PC9lcnJvcnM+XFxuICAgICAgICA8bW9kYWwgdi1tb2RlbD1cXFwiZGlzcGxheUltcG9ydE1vZGFsXFxcIiBlZmZlY3Q9XFxcImZhZGVcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgc2xvdD1cXFwibW9kYWwtaGVhZGVyXFxcIiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVxcXCJtb2RhbC10aXRsZVxcXCI+SW1wb3J0IEZpbGU6PC9oND5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IHNsb3Q9XFxcIm1vZGFsLWJvZHlcXFwiIGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZHluYW1pYy1mb3JtLXJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNCBjb2wteHMtMTJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJpbXBvcnQtdHlwZVxcXCI+SW1wb3J0IFR5cGU6PC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTggY29sLXhzLTEyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0MiA6b3B0aW9ucz1cXFwibW9kYWwuaW1wb3J0VHlwZXNcXFwiIHYtbW9kZWw9XFxcIm1vZGFsLmltcG9ydFR5cGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPVxcXCIwXFxcIj48L29wdGlvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdDI+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkeW5hbWljLWZvcm0tcm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC00IGNvbC14cy0xMlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImltcG9ydC11cGRhdGVcXFwiPlVwZGF0ZSBFeGlzdGluZyBWYWx1ZXM/OjwvbGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC04IGNvbC14cy0xMlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBuYW1lPVxcXCJpbXBvcnQtdXBkYXRlXFxcIiB2LW1vZGVsPVxcXCJtb2RhbC51cGRhdGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIiBzbG90PVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1zdWNjZXNzIGNvbC1tZC01IGNvbC1tZC1vZmZzZXQtMVxcXCIgc3R5bGU9XFxcInRleHQtYWxpZ246bGVmdFxcXCIgdi1pZj1cXFwibW9kYWwuc3RhdHVzVGV4dFxcXCI+e3sgdGhpcy5tb2RhbC5zdGF0dXNUZXh0IH19PC9kaXY+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBAY2xpY2s9XFxcImRpc3BsYXlJbXBvcnRNb2RhbCA9IGZhbHNlXFxcIj5DYW5jZWw8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwicG9zdFNhdmVcXFwiPlByb2Nlc3M8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvbW9kYWw+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTJcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBmaWxlaW5wdXQtYnV0dG9uIHNwYW4gaXMgdXNlZCB0byBzdHlsZSB0aGUgZmlsZSBpbnB1dCBmaWVsZCBhcyBidXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJidG4gYnRuLWluZm8gZmlsZWlucHV0LWJ1dHRvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TZWxlY3QgSW1wb3J0IEZpbGUuLi48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBmaWxlIGlucHV0IGZpZWxkIHVzZWQgYXMgdGFyZ2V0IGZvciB0aGUgZmlsZSB1cGxvYWQgd2lkZ2V0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJmaWxldXBsb2FkXFxcIiB0eXBlPVxcXCJmaWxlXFxcIiBuYW1lPVxcXCJmaWxlc1tdXFxcIiBkYXRhLXVybD1cXFwiL2FwaS92MS9pbXBvcnRzXFxcIiBhY2NlcHQ9XFxcInRleHQvY3N2XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC05XFxcIiB2LXNob3c9XFxcInByb2dyZXNzLnZpc2libGVcXFwiIHN0eWxlPVxcXCJwYWRkaW5nLWJvdHRvbToyMHB4XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTExXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInByb2dyZXNzIHByb2dyZXNzLXN0cmlwZWQtYWN0aXZlXFxcIiBzdHlsZT1cXFwibWFyZ2luLXRvcDogOHB4XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwcm9ncmVzcy1iYXJcXFwiIDpjbGFzcz1cXFwicHJvZ3Jlc3MuY3VycmVudENsYXNzXFxcIiByb2xlPVxcXCJwcm9ncmVzc2JhclxcXCIgOnN0eWxlPVxcXCJwcm9ncmVzc1dpZHRoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJvZ3Jlc3Muc3RhdHVzVGV4dCB9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XFxcInRhYmxlIHRhYmxlLXN0cmlwZWRcXFwiIGlkPVxcXCJ1cGxvYWQtdGFibGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5GaWxlPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+Q3JlYXRlZDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNpemU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImZpbGUgaW4gZmlsZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZmlsZS5maWxlX3BhdGggfX08L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZmlsZS5jcmVhdGVkX2F0IH19IDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBmaWxlLmZpbGVzaXplIH19PC90ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiYnRuIGJ0bi1zbSBidG4taW5mb1xcXCIgQGNsaWNrPVxcXCJzaG93TW9kYWwoZmlsZSlcXFwiPjxpIGNsYXNzPVxcXCJmYSBmYS1zcGlubmVyIHByb2Nlc3NcXFwiPjwvaT5Qcm9jZXNzPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJidG4gYnRuLXNtIGJ0bi1kYW5nZXJcXFwiIEBjbGljaz1cXFwiZGVsZXRlRmlsZShmaWxlKVxcXCI+PGkgY2xhc3M9XFxcImZhIGZhLXRyYXNoIGljb24td2hpdGVcXFwiPjwvaT48L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIHJlcXVpcmUoJ2JsdWVpbXAtZmlsZS11cGxvYWQnKTtcXG4gICAgdmFyIG1vZGFsID0gcmVxdWlyZSgndnVlLXN0cmFwJykubW9kYWxcXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGZpbGVzOiBbXSxcXG4gICAgICAgICAgICAgICAgZGlzcGxheUltcG9ydE1vZGFsOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgYWN0aXZlRmlsZTogbnVsbCxcXG4gICAgICAgICAgICAgICAgYWxlcnQ6IHtcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBudWxsLFxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIG1vZGFsOiB7XFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRUeXBlOiAnYXNzZXQnLFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydFR5cGVzOiBbXFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogJ2Fzc2V0JywgdGV4dDogJ0Fzc2V0cycgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAnYWNjZXNzb3J5JywgdGV4dDogJ0FjY2Vzc29yaWVzJyB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdjb25zdW1hYmxlJywgdGV4dDogJ0NvbnN1bWFibGUnIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogJ2NvbXBvbmVudCcsIHRleHQ6ICdDb21wb25lbnRzJyB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdsaWNlbnNlJywgdGV4dDogJ0xpY2Vuc2VzJyB9XFxuICAgICAgICAgICAgICAgICAgICBdLFxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogbnVsbCxcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgaW1wb3J0RXJyb3JzOiBudWxsLFxcbiAgICAgICAgICAgICAgICBwcm9ncmVzczoge1xcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzOiBcXFwicHJvZ3Jlc3MtYmFyLXdhcm5pbmdcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBlcmNlbnQ6IFxcXCIwXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6ICcnLFxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLyoqXFxuICAgICAgICAgKiBQcmVwYXJlIHRoZSBjb21wb25lbnQgKFZ1ZSAyLngpLlxcbiAgICAgICAgICovXFxuICAgICAgICBtb3VudGVkKCkge1xcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hGaWxlcygpO1xcbiAgICAgICAgICAgIGxldCB2bSA9IHRoaXM7XFxuICAgICAgICAgICAgJCgnI2ZpbGV1cGxvYWQnKS5maWxldXBsb2FkKHtcXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcXG4gICAgICAgICAgICAgICAgZG9uZShlLCBkYXRhKSB7XFxuICAgICAgICAgICAgICAgICAgICB2bS5wcm9ncmVzcy5jdXJyZW50Q2xhc3M9XFxcInByb2dyZXNzLWJhci1zdWNjZXNzXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLnN0YXR1c1RleHQgPSBcXFwiU3VjY2VzcyFcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgdm0uZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlcy5jb25jYXQodm0uZmlsZXMpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBhZGQoZSwgZGF0YSkge1xcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5oZWFkZXJzID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJYLVJlcXVlc3RlZC1XaXRoXFxcIjogJ1hNTEh0dHBSZXF1ZXN0JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiWC1DU1JGLVRPS0VOXFxcIjogTGFyYXZlbC5jc3JmVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKCAoKSA9PiB7ZGF0YS5zdWJtaXQoKTt9KTtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLnZpc2libGU9dHJ1ZTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3MoZSwgZGF0YSkge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2dyZXNzID0gcGFyc2VJbnQoKGRhdGEubG9hZGVkIC8gZGF0YS50b3RhbCAqIDEwMCwgMTApKTtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLmN1cnJlbnRQZXJjZW50ID0gcHJvZ3Jlc3M7XFxuICAgICAgICAgICAgICAgICAgICB2bS5wcm9ncmVzcy5zdGF0dXNUZXh0ID0gcHJvZ3Jlc3MrJyUgQ29tcGxldGUnO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBmYWlsKGUsIGRhdGEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLmN1cnJlbnRDbGFzcyA9IFxcXCJwcm9ncmVzcy1iYXItZGFuZ2VyXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIC8vIERpc3BsYXkgYW55IGVycm9ycyByZXR1cm5lZCBmcm9tIHRoZSAkLmFqYXgoKVxcbiAgICAgICAgICAgICAgICAgICAgdm0ucHJvZ3Jlc3Muc3RhdHVzVGV4dCA9IGRhdGEuanFYSFIucmVzcG9uc2VKU09OLm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgZmV0Y2hGaWxlcygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9hcGkvdjEvaW1wb3J0cycpXFxuICAgICAgICAgICAgICAgIC50aGVuKCAoe2RhdGF9KSA9PiB0aGlzLmZpbGVzID0gZGF0YSwgLy8gU3VjY2Vzc1xcbiAgICAgICAgICAgICAgICAgICAgLy9GYWlsXFxuICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC50eXBlPVxcXCJkYW5nZXJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC52aXNpYmxlPXRydWU7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0Lm1lc3NhZ2U9XFxcIlNvbWV0aGluZyB3ZW50IHdyb25nIGZldGNoaW5nIGZpbGVzLi4uXFxcIjtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBkZWxldGVGaWxlKGZpbGUsIGtleSkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZShcXFwiL2FwaS92MS9pbXBvcnRzL1xcXCIrZmlsZS5pZClcXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB0aGlzLmZpbGVzLnNwbGljZShrZXksIDEpLCAvLyBTdWNjZXNzXFxuICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHsvLyBGYWlsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC50eXBlPVxcXCJkYW5nZXJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQudmlzaWJsZT10cnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQubWVzc2FnZT1yZXNwb25zZS5ib2R5Lm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgc2hvd01vZGFsKGZpbGUpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGaWxlID0gZmlsZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SW1wb3J0TW9kYWwgPSB0cnVlO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgcG9zdFNhdmUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuc3RhdHVzVGV4dCA9IFxcXCJQcm9jZXNzaW5nLi4uXFxcIjtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvYXBpL3YxL2ltcG9ydHMvcHJvY2Vzcy8nK3RoaXMuYWN0aXZlRmlsZS5pZCwge1xcbiAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydC11cGRhdGUnOiB0aGlzLm1vZGFsLnVwZGF0ZSxcXG4gICAgICAgICAgICAgICAgICAgICdpbXBvcnQtdHlwZSc6IHRoaXMubW9kYWwuaW1wb3J0VHlwZVxcbiAgICAgICAgICAgICAgICB9KS50aGVuKCAocmVzcG9uc2UpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3NcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuc3RhdHVzVGV4dCA9IFxcXCJTdWNjZXNzLi4uIFJlZGlyZWN0aW5nLlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlLmJvZHkubWVzc2FnZXMucmVkaXJlY3RfdXJsO1xcbiAgICAgICAgICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vIEZhaWx1cmVcXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmJvZHkuc3RhdHVzID09ICdpbXBvcnQtZXJyb3JzJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0RXJyb3JzID0gcmVzcG9uc2UuYm9keS5tZXNzYWdlcztcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC5tZXNzYWdlPSByZXNwb25zZS5ib2R5Lm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQudHlwZT1cXFwiZGFuZ2VyXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0LnZpc2libGU9dHJ1ZTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUltcG9ydE1vZGFsPWZhbHNlO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICB9LFxcblxcbiAgICAgICAgY29tcHV0ZWQ6IHtcXG4gICAgICAgICAgICBwcm9ncmVzc1dpZHRoKCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcIndpZHRoOiBcXFwiK3RoaXMucHJvZ3Jlc3MuY3VycmVudFBlcmNlbnQqMTArJyUnO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBjb21wb25lbnRzOiB7XFxuICAgICAgICAgICAgbW9kYWwsXFxuICAgICAgICAgICAgZXJyb3JzOiByZXF1aXJlKCcuL2ltcG9ydGVyLWVycm9ycy52dWUnKSxcXG4gICAgICAgICAgICBhbGVydDogcmVxdWlyZSgnLi4vYWxlcnQudnVlJyksXFxuICAgICAgICAgICAgc2VsZWN0MjogcmVxdWlyZSgnLi4vc2VsZWN0Mi52dWUnKVxcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuPC9zY3JpcHQ+XFxuXCJdfV0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTUzMDFhMjM2JnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2ltcG9ydGVyL2ltcG9ydGVyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"importer-errors.vue\\\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZT8zYWQ2Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcblxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiXCIsXCJmaWxlXCI6XCJpbXBvcnRlci1lcnJvcnMudnVlXCJ9XSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNTY2N2MzMTImc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n.action-link[data-v-de0d0e4e] {\\\\n cursor: pointer;\\\\n}\\\\n.m-b-none[data-v-de0d0e4e] {\\\\n margin-bottom: 0;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"AuthorizedClients.vue?a99076c0\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\\\",\\\"file\\\":\\\"AuthorizedClients.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlPzA2NGIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjdGlvbi1saW5rW2RhdGEtdi1kZTBkMGU0ZV0ge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5tLWItbm9uZVtkYXRhLXYtZGUwZDBlNGVdIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIkF1dGhvcml6ZWRDbGllbnRzLnZ1ZT9hOTkwNzZjMFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBdXRob3JpemVkQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmdcXFwiPkF1dGhvcml6ZWQgQXBwbGljYXRpb25zPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRob3JpemVkIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+U2NvcGVzPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcInRva2VuIGluIHRva2Vuc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudCBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uY2xpZW50Lm5hbWUgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNjb3BlcyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XFxcInRva2VuLnNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uc2NvcGVzLmpvaW4oJywgJykgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXZva2UgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZva2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICB0b2tlbnM6IFtdXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBwcmVwYXJlQ29tcG9uZW50KCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogR2V0IGFsbCBvZiB0aGUgYXV0aG9yaXplZCB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC90b2tlbnMnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbnMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUmV2b2tlIHRoZSBnaXZlbiB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICByZXZva2UodG9rZW4pIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5kZWxldGUoJy9vYXV0aC90b2tlbnMvJyArIHRva2VuLmlkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbnMoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cIl19XSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZGUwZDBlNGUmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlXG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n.action-link[data-v-e9c80318] {\\\\n cursor: pointer;\\\\n}\\\\n.m-b-none[data-v-e9c80318] {\\\\n margin-bottom: 0;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"Clients.vue?35867ce4\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\\\",\\\"file\\\":\\\"Clients.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/ZjE0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LWU5YzgwMzE4XSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi1lOWM4MDMxOF0ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiQ2xpZW50cy52dWU/MzU4NjdjZTRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0EsZ0JBQUE7Q0FDQTtBQUVBO0lBQ0EsaUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XFxcImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgT0F1dGggQ2xpZW50c1xcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcInNob3dDcmVhdGVDbGllbnRGb3JtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IENsaWVudFxcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBDdXJyZW50IENsaWVudHMgLS0+XFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVxcXCJtLWItbm9uZVxcXCIgdi1pZj1cXFwiY2xpZW50cy5sZW5ndGggPT09IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgWW91IGhhdmUgbm90IGNyZWF0ZWQgYW55IE9BdXRoIGNsaWVudHMuXFxuICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVxcXCJ0YWJsZSB0YWJsZS1ib3JkZXJsZXNzIG0tYi1ub25lXFxcIiB2LWlmPVxcXCJjbGllbnRzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkNsaWVudCBJRDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNlY3JldDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImNsaWVudCBpbiBjbGllbnRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJRCAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjbGllbnQuaWQgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNsaWVudC5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VjcmV0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt7IGNsaWVudC5zZWNyZXQgfX08L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRWRpdCBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcImVkaXQoY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZSBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcImRlc3Ryb3koY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgIDwvdGFibGU+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1jcmVhdGUtY2xpZW50XFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgQ2xpZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtIEVycm9ycyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1kYW5nZXJcXFwiIHYtaWY9XFxcImNyZWF0ZUZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gY3JlYXRlRm9ybS5lcnJvcnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVycm9yIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBGb3JtIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVxcXCJmb3JtLWhvcml6b250YWxcXFwiIHJvbGU9XFxcImZvcm1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5OYW1lPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImNyZWF0ZS1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJzdG9yZVxcXCIgdi1tb2RlbD1cXFwiY3JlYXRlRm9ybS5uYW1lXFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aGluZyB5b3VyIHVzZXJzIHdpbGwgcmVjb2duaXplIGFuZCB0cnVzdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVkaXJlY3QgVVJMIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTMgY29udHJvbC1sYWJlbFxcXCI+UmVkaXJlY3QgVVJMPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwicmVkaXJlY3RcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBrZXl1cC5lbnRlcj1cXFwic3RvcmVcXFwiIHYtbW9kZWw9XFxcImNyZWF0ZUZvcm0ucmVkaXJlY3RcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91ciBhcHBsaWNhdGlvbidzIGF1dGhvcml6YXRpb24gY2FsbGJhY2sgVVJMLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTW9kYWwgQWN0aW9ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIGRhdGEtZGlzbWlzcz1cXFwibW9kYWxcXFwiPkNsb3NlPC9idXR0b24+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwic3RvcmVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBFZGl0IENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1lZGl0LWNsaWVudFxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBDbGllbnRcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZWRpdEZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gZWRpdEZvcm0uZXJyb3JzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlcnJvciB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVkaXQgQ2xpZW50IEZvcm0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XFxcImZvcm0taG9yaXpvbnRhbFxcXCIgcm9sZT1cXFwiZm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmFtZSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XFxcImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcXFwiPk5hbWU8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwiZWRpdC1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLm5hbWVcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZXRoaW5nIHlvdXIgdXNlcnMgd2lsbCByZWNvZ25pemUgYW5kIHRydXN0LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWRpcmVjdCBVUkwgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5SZWRpcmVjdCBVUkw8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuYW1lPVxcXCJyZWRpcmVjdFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLnJlZGlyZWN0XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdXIgYXBwbGljYXRpb24ncyBhdXRob3JpemF0aW9uIGNhbGxiYWNrIFVSTC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInVwZGF0ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgQ2hhbmdlc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvdGVtcGxhdGU+XFxuXFxuPHNjcmlwdD5cXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGNsaWVudHM6IFtdLFxcblxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb3JtOiB7XFxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogJydcXG4gICAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAgICAgZWRpdEZvcm06IHtcXG4gICAgICAgICAgICAgICAgICAgIGVycm9yczogW10sXFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyxcXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnJ1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLWNsaWVudCcpLm9uKCdzaG93bi5icy5tb2RhbCcsICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGUtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50Jykub24oJ3Nob3duLmJzLm1vZGFsJywgKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgJCgnI2VkaXQtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIE9BdXRoIGNsaWVudHMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldENsaWVudHMoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZ2V0KCcvb2F1dGgvY2xpZW50cycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZm9ybSBmb3IgY3JlYXRpbmcgbmV3IGNsaWVudHMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgc2hvd0NyZWF0ZUNsaWVudEZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIENyZWF0ZSBhIG5ldyBPQXV0aCBjbGllbnQgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHN0b3JlKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RDbGllbnQoXFxuICAgICAgICAgICAgICAgICAgICAncG9zdCcsICcvb2F1dGgvY2xpZW50cycsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm0sICcjbW9kYWwtY3JlYXRlLWNsaWVudCdcXG4gICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEVkaXQgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBlZGl0KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLmlkID0gY2xpZW50LmlkO1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLm5hbWUgPSBjbGllbnQubmFtZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5yZWRpcmVjdCA9IGNsaWVudC5yZWRpcmVjdDtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgY2xpZW50IGJlaW5nIGVkaXRlZC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB1cGRhdGUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdENsaWVudChcXG4gICAgICAgICAgICAgICAgICAgICdwdXQnLCAnL29hdXRoL2NsaWVudHMvJyArIHRoaXMuZWRpdEZvcm0uaWQsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLCAnI21vZGFsLWVkaXQtY2xpZW50J1xcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUGVyc2lzdCB0aGUgY2xpZW50IHRvIHN0b3JhZ2UgdXNpbmcgdGhlIGdpdmVuIGZvcm0uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcGVyc2lzdENsaWVudChtZXRob2QsIHVyaSwgZm9ybSwgbW9kYWwpIHtcXG4gICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cFttZXRob2RdKHVyaSwgZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsaWVudHMoKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLm5hbWUgPSAnJztcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlZGlyZWN0ID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAkKG1vZGFsKS5tb2RhbCgnaGlkZScpO1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5kYXRhID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmVycm9ycyA9IF8uZmxhdHRlbihfLnRvQXJyYXkocmVzcG9uc2UuZGF0YSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZXJyb3JzID0gWydTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERlc3Ryb3kgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBkZXN0cm95KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZSgnL29hdXRoL2NsaWVudHMvJyArIGNsaWVudC5pZClcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXX1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1lOWM4MDMxOCZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9wYXNzcG9ydC9DbGllbnRzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"select2.vue\\\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvc2VsZWN0Mi52dWU/MTkwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwic2VsZWN0Mi52dWVcIn1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZjU2NGE4NiZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9zZWxlY3QyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {\\n\\tif ( true ) {\\n\\n\\t\\t// AMD. Register as an anonymous module.\\n\\t\\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\t} else {\\n\\n\\t\\t// Browser globals\\n\\t\\tfactory( jQuery );\\n\\t}\\n} ( function( $ ) {\\n\\n$.ui = $.ui || {};\\n\\nreturn $.ui.version = \\\"1.12.1\\\";\\n\\n} ) );\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzP2JkNDEiXSwic291cmNlc0NvbnRlbnQiOlsiKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSAoIGZ1bmN0aW9uKCAkICkge1xuXG4kLnVpID0gJC51aSB8fCB7fTtcblxucmV0dXJuICQudWkudmVyc2lvbiA9IFwiMS4xMi4xXCI7XG5cbn0gKSApO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\\n * jQuery UI Widget 1.12.1\\n * http://jqueryui.com\\n *\\n * Copyright jQuery Foundation and other contributors\\n * Released under the MIT license.\\n * http://jquery.org/license\\n */\\n\\n//>>label: Widget\\n//>>group: Core\\n//>>description: Provides a factory for creating stateful widgets with a common API.\\n//>>docs: http://api.jqueryui.com/jQuery.widget/\\n//>>demos: http://jqueryui.com/widget/\\n\\n( function( factory ) {\\n\\tif ( true ) {\\n\\n\\t\\t// AMD. Register as an anonymous module.\\n\\t\\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3), __webpack_require__(26) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\t} else {\\n\\n\\t\\t// Browser globals\\n\\t\\tfactory( jQuery );\\n\\t}\\n}( function( $ ) {\\n\\nvar widgetUuid = 0;\\nvar widgetSlice = Array.prototype.slice;\\n\\n$.cleanData = ( function( orig ) {\\n\\treturn function( elems ) {\\n\\t\\tvar events, elem, i;\\n\\t\\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\\n\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t// Only trigger remove when necessary to save time\\n\\t\\t\\t\\tevents = $._data( elem, \\\"events\\\" );\\n\\t\\t\\t\\tif ( events && events.remove ) {\\n\\t\\t\\t\\t\\t$( elem ).triggerHandler( \\\"remove\\\" );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Http://bugs.jquery.com/ticket/8235\\n\\t\\t\\t} catch ( e ) {}\\n\\t\\t}\\n\\t\\torig( elems );\\n\\t};\\n} )( $.cleanData );\\n\\n$.widget = function( name, base, prototype ) {\\n\\tvar existingConstructor, constructor, basePrototype;\\n\\n\\t// ProxiedPrototype allows the provided prototype to remain unmodified\\n\\t// so that it can be used as a mixin for multiple widgets (#8876)\\n\\tvar proxiedPrototype = {};\\n\\n\\tvar namespace = name.split( \\\".\\\" )[ 0 ];\\n\\tname = name.split( \\\".\\\" )[ 1 ];\\n\\tvar fullName = namespace + \\\"-\\\" + name;\\n\\n\\tif ( !prototype ) {\\n\\t\\tprototype = base;\\n\\t\\tbase = $.Widget;\\n\\t}\\n\\n\\tif ( $.isArray( prototype ) ) {\\n\\t\\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\\n\\t}\\n\\n\\t// Create selector for plugin\\n\\t$.expr[ \\\":\\\" ][ fullName.toLowerCase() ] = function( elem ) {\\n\\t\\treturn !!$.data( elem, fullName );\\n\\t};\\n\\n\\t$[ namespace ] = $[ namespace ] || {};\\n\\texistingConstructor = $[ namespace ][ name ];\\n\\tconstructor = $[ namespace ][ name ] = function( options, element ) {\\n\\n\\t\\t// Allow instantiation without \\\"new\\\" keyword\\n\\t\\tif ( !this._createWidget ) {\\n\\t\\t\\treturn new constructor( options, element );\\n\\t\\t}\\n\\n\\t\\t// Allow instantiation without initializing for simple inheritance\\n\\t\\t// must use \\\"new\\\" keyword (the code above always passes args)\\n\\t\\tif ( arguments.length ) {\\n\\t\\t\\tthis._createWidget( options, element );\\n\\t\\t}\\n\\t};\\n\\n\\t// Extend with the existing constructor to carry over any static properties\\n\\t$.extend( constructor, existingConstructor, {\\n\\t\\tversion: prototype.version,\\n\\n\\t\\t// Copy the object used to create the prototype in case we need to\\n\\t\\t// redefine the widget later\\n\\t\\t_proto: $.extend( {}, prototype ),\\n\\n\\t\\t// Track widgets that inherit from this widget in case this widget is\\n\\t\\t// redefined after a widget inherits from it\\n\\t\\t_childConstructors: []\\n\\t} );\\n\\n\\tbasePrototype = new base();\\n\\n\\t// We need to make the options hash a property directly on the new instance\\n\\t// otherwise we'll modify the options hash on the prototype that we're\\n\\t// inheriting from\\n\\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\\n\\t$.each( prototype, function( prop, value ) {\\n\\t\\tif ( !$.isFunction( value ) ) {\\n\\t\\t\\tproxiedPrototype[ prop ] = value;\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tproxiedPrototype[ prop ] = ( function() {\\n\\t\\t\\tfunction _super() {\\n\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\tfunction _superApply( args ) {\\n\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, args );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn function() {\\n\\t\\t\\t\\tvar __super = this._super;\\n\\t\\t\\t\\tvar __superApply = this._superApply;\\n\\t\\t\\t\\tvar returnValue;\\n\\n\\t\\t\\t\\tthis._super = _super;\\n\\t\\t\\t\\tthis._superApply = _superApply;\\n\\n\\t\\t\\t\\treturnValue = value.apply( this, arguments );\\n\\n\\t\\t\\t\\tthis._super = __super;\\n\\t\\t\\t\\tthis._superApply = __superApply;\\n\\n\\t\\t\\t\\treturn returnValue;\\n\\t\\t\\t};\\n\\t\\t} )();\\n\\t} );\\n\\tconstructor.prototype = $.widget.extend( basePrototype, {\\n\\n\\t\\t// TODO: remove support for widgetEventPrefix\\n\\t\\t// always use the name + a colon as the prefix, e.g., draggable:start\\n\\t\\t// don't prefix for widgets that aren't DOM-based\\n\\t\\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\\n\\t}, proxiedPrototype, {\\n\\t\\tconstructor: constructor,\\n\\t\\tnamespace: namespace,\\n\\t\\twidgetName: name,\\n\\t\\twidgetFullName: fullName\\n\\t} );\\n\\n\\t// If this widget is being redefined then we need to find all widgets that\\n\\t// are inheriting from it and redefine all of them so that they inherit from\\n\\t// the new version of this widget. We're essentially trying to replace one\\n\\t// level in the prototype chain.\\n\\tif ( existingConstructor ) {\\n\\t\\t$.each( existingConstructor._childConstructors, function( i, child ) {\\n\\t\\t\\tvar childPrototype = child.prototype;\\n\\n\\t\\t\\t// Redefine the child widget using the same prototype that was\\n\\t\\t\\t// originally used, but inherit from the new version of the base\\n\\t\\t\\t$.widget( childPrototype.namespace + \\\".\\\" + childPrototype.widgetName, constructor,\\n\\t\\t\\t\\tchild._proto );\\n\\t\\t} );\\n\\n\\t\\t// Remove the list of existing child constructors from the old constructor\\n\\t\\t// so the old child constructors can be garbage collected\\n\\t\\tdelete existingConstructor._childConstructors;\\n\\t} else {\\n\\t\\tbase._childConstructors.push( constructor );\\n\\t}\\n\\n\\t$.widget.bridge( name, constructor );\\n\\n\\treturn constructor;\\n};\\n\\n$.widget.extend = function( target ) {\\n\\tvar input = widgetSlice.call( arguments, 1 );\\n\\tvar inputIndex = 0;\\n\\tvar inputLength = input.length;\\n\\tvar key;\\n\\tvar value;\\n\\n\\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\\n\\t\\tfor ( key in input[ inputIndex ] ) {\\n\\t\\t\\tvalue = input[ inputIndex ][ key ];\\n\\t\\t\\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\\n\\n\\t\\t\\t\\t// Clone objects\\n\\t\\t\\t\\tif ( $.isPlainObject( value ) ) {\\n\\t\\t\\t\\t\\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, target[ key ], value ) :\\n\\n\\t\\t\\t\\t\\t\\t// Don't extend strings, arrays, etc. with objects\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, value );\\n\\n\\t\\t\\t\\t// Copy everything else by reference\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttarget[ key ] = value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn target;\\n};\\n\\n$.widget.bridge = function( name, object ) {\\n\\tvar fullName = object.prototype.widgetFullName || name;\\n\\t$.fn[ name ] = function( options ) {\\n\\t\\tvar isMethodCall = typeof options === \\\"string\\\";\\n\\t\\tvar args = widgetSlice.call( arguments, 1 );\\n\\t\\tvar returnValue = this;\\n\\n\\t\\tif ( isMethodCall ) {\\n\\n\\t\\t\\t// If this is an empty collection, we need to have the instance method\\n\\t\\t\\t// return undefined instead of the jQuery instance\\n\\t\\t\\tif ( !this.length && options === \\\"instance\\\" ) {\\n\\t\\t\\t\\treturnValue = undefined;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\t\\tvar methodValue;\\n\\t\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\n\\t\\t\\t\\t\\tif ( options === \\\"instance\\\" ) {\\n\\t\\t\\t\\t\\t\\treturnValue = instance;\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif ( !instance ) {\\n\\t\\t\\t\\t\\t\\treturn $.error( \\\"cannot call methods on \\\" + name +\\n\\t\\t\\t\\t\\t\\t\\t\\\" prior to initialization; \\\" +\\n\\t\\t\\t\\t\\t\\t\\t\\\"attempted to call method '\\\" + options + \\\"'\\\" );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \\\"_\\\" ) {\\n\\t\\t\\t\\t\\t\\treturn $.error( \\\"no such method '\\\" + options + \\\"' for \\\" + name +\\n\\t\\t\\t\\t\\t\\t\\t\\\" widget instance\\\" );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tmethodValue = instance[ options ].apply( instance, args );\\n\\n\\t\\t\\t\\t\\tif ( methodValue !== instance && methodValue !== undefined ) {\\n\\t\\t\\t\\t\\t\\treturnValue = methodValue && methodValue.jquery ?\\n\\t\\t\\t\\t\\t\\t\\treturnValue.pushStack( methodValue.get() ) :\\n\\t\\t\\t\\t\\t\\t\\tmethodValue;\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// Allow multiple hashes to be passed on init\\n\\t\\t\\tif ( args.length ) {\\n\\t\\t\\t\\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\\n\\t\\t\\t}\\n\\n\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\t\\t\\t\\tif ( instance ) {\\n\\t\\t\\t\\t\\tinstance.option( options || {} );\\n\\t\\t\\t\\t\\tif ( instance._init ) {\\n\\t\\t\\t\\t\\t\\tinstance._init();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t$.data( this, fullName, new object( options, this ) );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn returnValue;\\n\\t};\\n};\\n\\n$.Widget = function( /* options, element */ ) {};\\n$.Widget._childConstructors = [];\\n\\n$.Widget.prototype = {\\n\\twidgetName: \\\"widget\\\",\\n\\twidgetEventPrefix: \\\"\\\",\\n\\tdefaultElement: \\\"
\\\",\\n\\n\\toptions: {\\n\\t\\tclasses: {},\\n\\t\\tdisabled: false,\\n\\n\\t\\t// Callbacks\\n\\t\\tcreate: null\\n\\t},\\n\\n\\t_createWidget: function( options, element ) {\\n\\t\\telement = $( element || this.defaultElement || this )[ 0 ];\\n\\t\\tthis.element = $( element );\\n\\t\\tthis.uuid = widgetUuid++;\\n\\t\\tthis.eventNamespace = \\\".\\\" + this.widgetName + this.uuid;\\n\\n\\t\\tthis.bindings = $();\\n\\t\\tthis.hoverable = $();\\n\\t\\tthis.focusable = $();\\n\\t\\tthis.classesElementLookup = {};\\n\\n\\t\\tif ( element !== this ) {\\n\\t\\t\\t$.data( element, this.widgetFullName, this );\\n\\t\\t\\tthis._on( true, this.element, {\\n\\t\\t\\t\\tremove: function( event ) {\\n\\t\\t\\t\\t\\tif ( event.target === element ) {\\n\\t\\t\\t\\t\\t\\tthis.destroy();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t\\tthis.document = $( element.style ?\\n\\n\\t\\t\\t\\t// Element within the document\\n\\t\\t\\t\\telement.ownerDocument :\\n\\n\\t\\t\\t\\t// Element is window or document\\n\\t\\t\\t\\telement.document || element );\\n\\t\\t\\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\\n\\t\\t}\\n\\n\\t\\tthis.options = $.widget.extend( {},\\n\\t\\t\\tthis.options,\\n\\t\\t\\tthis._getCreateOptions(),\\n\\t\\t\\toptions );\\n\\n\\t\\tthis._create();\\n\\n\\t\\tif ( this.options.disabled ) {\\n\\t\\t\\tthis._setOptionDisabled( this.options.disabled );\\n\\t\\t}\\n\\n\\t\\tthis._trigger( \\\"create\\\", null, this._getCreateEventData() );\\n\\t\\tthis._init();\\n\\t},\\n\\n\\t_getCreateOptions: function() {\\n\\t\\treturn {};\\n\\t},\\n\\n\\t_getCreateEventData: $.noop,\\n\\n\\t_create: $.noop,\\n\\n\\t_init: $.noop,\\n\\n\\tdestroy: function() {\\n\\t\\tvar that = this;\\n\\n\\t\\tthis._destroy();\\n\\t\\t$.each( this.classesElementLookup, function( key, value ) {\\n\\t\\t\\tthat._removeClass( value, key );\\n\\t\\t} );\\n\\n\\t\\t// We can probably remove the unbind calls in 2.0\\n\\t\\t// all event bindings should go through this._on()\\n\\t\\tthis.element\\n\\t\\t\\t.off( this.eventNamespace )\\n\\t\\t\\t.removeData( this.widgetFullName );\\n\\t\\tthis.widget()\\n\\t\\t\\t.off( this.eventNamespace )\\n\\t\\t\\t.removeAttr( \\\"aria-disabled\\\" );\\n\\n\\t\\t// Clean up events and states\\n\\t\\tthis.bindings.off( this.eventNamespace );\\n\\t},\\n\\n\\t_destroy: $.noop,\\n\\n\\twidget: function() {\\n\\t\\treturn this.element;\\n\\t},\\n\\n\\toption: function( key, value ) {\\n\\t\\tvar options = key;\\n\\t\\tvar parts;\\n\\t\\tvar curOption;\\n\\t\\tvar i;\\n\\n\\t\\tif ( arguments.length === 0 ) {\\n\\n\\t\\t\\t// Don't return a reference to the internal hash\\n\\t\\t\\treturn $.widget.extend( {}, this.options );\\n\\t\\t}\\n\\n\\t\\tif ( typeof key === \\\"string\\\" ) {\\n\\n\\t\\t\\t// Handle nested keys, e.g., \\\"foo.bar\\\" => { foo: { bar: ___ } }\\n\\t\\t\\toptions = {};\\n\\t\\t\\tparts = key.split( \\\".\\\" );\\n\\t\\t\\tkey = parts.shift();\\n\\t\\t\\tif ( parts.length ) {\\n\\t\\t\\t\\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\\n\\t\\t\\t\\tfor ( i = 0; i < parts.length - 1; i++ ) {\\n\\t\\t\\t\\t\\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\\n\\t\\t\\t\\t\\tcurOption = curOption[ parts[ i ] ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tkey = parts.pop();\\n\\t\\t\\t\\tif ( arguments.length === 1 ) {\\n\\t\\t\\t\\t\\treturn curOption[ key ] === undefined ? null : curOption[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcurOption[ key ] = value;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif ( arguments.length === 1 ) {\\n\\t\\t\\t\\t\\treturn this.options[ key ] === undefined ? null : this.options[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\toptions[ key ] = value;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._setOptions( options );\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOptions: function( options ) {\\n\\t\\tvar key;\\n\\n\\t\\tfor ( key in options ) {\\n\\t\\t\\tthis._setOption( key, options[ key ] );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOption: function( key, value ) {\\n\\t\\tif ( key === \\\"classes\\\" ) {\\n\\t\\t\\tthis._setOptionClasses( value );\\n\\t\\t}\\n\\n\\t\\tthis.options[ key ] = value;\\n\\n\\t\\tif ( key === \\\"disabled\\\" ) {\\n\\t\\t\\tthis._setOptionDisabled( value );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOptionClasses: function( value ) {\\n\\t\\tvar classKey, elements, currentElements;\\n\\n\\t\\tfor ( classKey in value ) {\\n\\t\\t\\tcurrentElements = this.classesElementLookup[ classKey ];\\n\\t\\t\\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\\n\\t\\t\\t\\t\\t!currentElements ||\\n\\t\\t\\t\\t\\t!currentElements.length ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// We are doing this to create a new jQuery object because the _removeClass() call\\n\\t\\t\\t// on the next line is going to destroy the reference to the current elements being\\n\\t\\t\\t// tracked. We need to save a copy of this collection so that we can add the new classes\\n\\t\\t\\t// below.\\n\\t\\t\\telements = $( currentElements.get() );\\n\\t\\t\\tthis._removeClass( currentElements, classKey );\\n\\n\\t\\t\\t// We don't use _addClass() here, because that uses this.options.classes\\n\\t\\t\\t// for generating the string of classes. We want to use the value passed in from\\n\\t\\t\\t// _setOption(), this is the new value of the classes option which was passed to\\n\\t\\t\\t// _setOption(). We pass this value directly to _classes().\\n\\t\\t\\telements.addClass( this._classes( {\\n\\t\\t\\t\\telement: elements,\\n\\t\\t\\t\\tkeys: classKey,\\n\\t\\t\\t\\tclasses: value,\\n\\t\\t\\t\\tadd: true\\n\\t\\t\\t} ) );\\n\\t\\t}\\n\\t},\\n\\n\\t_setOptionDisabled: function( value ) {\\n\\t\\tthis._toggleClass( this.widget(), this.widgetFullName + \\\"-disabled\\\", null, !!value );\\n\\n\\t\\t// If the widget is becoming disabled, then nothing is interactive\\n\\t\\tif ( value ) {\\n\\t\\t\\tthis._removeClass( this.hoverable, null, \\\"ui-state-hover\\\" );\\n\\t\\t\\tthis._removeClass( this.focusable, null, \\\"ui-state-focus\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tenable: function() {\\n\\t\\treturn this._setOptions( { disabled: false } );\\n\\t},\\n\\n\\tdisable: function() {\\n\\t\\treturn this._setOptions( { disabled: true } );\\n\\t},\\n\\n\\t_classes: function( options ) {\\n\\t\\tvar full = [];\\n\\t\\tvar that = this;\\n\\n\\t\\toptions = $.extend( {\\n\\t\\t\\telement: this.element,\\n\\t\\t\\tclasses: this.options.classes || {}\\n\\t\\t}, options );\\n\\n\\t\\tfunction processClassString( classes, checkOption ) {\\n\\t\\t\\tvar current, i;\\n\\t\\t\\tfor ( i = 0; i < classes.length; i++ ) {\\n\\t\\t\\t\\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\\n\\t\\t\\t\\tif ( options.add ) {\\n\\t\\t\\t\\t\\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcurrent = $( current.not( options.element ).get() );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tthat.classesElementLookup[ classes[ i ] ] = current;\\n\\t\\t\\t\\tfull.push( classes[ i ] );\\n\\t\\t\\t\\tif ( checkOption && options.classes[ classes[ i ] ] ) {\\n\\t\\t\\t\\t\\tfull.push( options.classes[ classes[ i ] ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._on( options.element, {\\n\\t\\t\\t\\\"remove\\\": \\\"_untrackClassesElement\\\"\\n\\t\\t} );\\n\\n\\t\\tif ( options.keys ) {\\n\\t\\t\\tprocessClassString( options.keys.match( /\\\\S+/g ) || [], true );\\n\\t\\t}\\n\\t\\tif ( options.extra ) {\\n\\t\\t\\tprocessClassString( options.extra.match( /\\\\S+/g ) || [] );\\n\\t\\t}\\n\\n\\t\\treturn full.join( \\\" \\\" );\\n\\t},\\n\\n\\t_untrackClassesElement: function( event ) {\\n\\t\\tvar that = this;\\n\\t\\t$.each( that.classesElementLookup, function( key, value ) {\\n\\t\\t\\tif ( $.inArray( event.target, value ) !== -1 ) {\\n\\t\\t\\t\\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_removeClass: function( element, keys, extra ) {\\n\\t\\treturn this._toggleClass( element, keys, extra, false );\\n\\t},\\n\\n\\t_addClass: function( element, keys, extra ) {\\n\\t\\treturn this._toggleClass( element, keys, extra, true );\\n\\t},\\n\\n\\t_toggleClass: function( element, keys, extra, add ) {\\n\\t\\tadd = ( typeof add === \\\"boolean\\\" ) ? add : extra;\\n\\t\\tvar shift = ( typeof element === \\\"string\\\" || element === null ),\\n\\t\\t\\toptions = {\\n\\t\\t\\t\\textra: shift ? keys : extra,\\n\\t\\t\\t\\tkeys: shift ? element : keys,\\n\\t\\t\\t\\telement: shift ? this.element : element,\\n\\t\\t\\t\\tadd: add\\n\\t\\t\\t};\\n\\t\\toptions.element.toggleClass( this._classes( options ), add );\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_on: function( suppressDisabledCheck, element, handlers ) {\\n\\t\\tvar delegateElement;\\n\\t\\tvar instance = this;\\n\\n\\t\\t// No suppressDisabledCheck flag, shuffle arguments\\n\\t\\tif ( typeof suppressDisabledCheck !== \\\"boolean\\\" ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = suppressDisabledCheck;\\n\\t\\t\\tsuppressDisabledCheck = false;\\n\\t\\t}\\n\\n\\t\\t// No element argument, shuffle and use this.element\\n\\t\\tif ( !handlers ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = this.element;\\n\\t\\t\\tdelegateElement = this.widget();\\n\\t\\t} else {\\n\\t\\t\\telement = delegateElement = $( element );\\n\\t\\t\\tthis.bindings = this.bindings.add( element );\\n\\t\\t}\\n\\n\\t\\t$.each( handlers, function( event, handler ) {\\n\\t\\t\\tfunction handlerProxy() {\\n\\n\\t\\t\\t\\t// Allow widgets to customize the disabled handling\\n\\t\\t\\t\\t// - disabled as an array instead of boolean\\n\\t\\t\\t\\t// - disabled class as method for disabling individual parts\\n\\t\\t\\t\\tif ( !suppressDisabledCheck &&\\n\\t\\t\\t\\t\\t\\t( instance.options.disabled === true ||\\n\\t\\t\\t\\t\\t\\t$( this ).hasClass( \\\"ui-state-disabled\\\" ) ) ) {\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Copy the guid so direct unbinding works\\n\\t\\t\\tif ( typeof handler !== \\\"string\\\" ) {\\n\\t\\t\\t\\thandlerProxy.guid = handler.guid =\\n\\t\\t\\t\\t\\thandler.guid || handlerProxy.guid || $.guid++;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvar match = event.match( /^([\\\\w:-]*)\\\\s*(.*)$/ );\\n\\t\\t\\tvar eventName = match[ 1 ] + instance.eventNamespace;\\n\\t\\t\\tvar selector = match[ 2 ];\\n\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\tdelegateElement.on( eventName, selector, handlerProxy );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\telement.on( eventName, handlerProxy );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_off: function( element, eventName ) {\\n\\t\\teventName = ( eventName || \\\"\\\" ).split( \\\" \\\" ).join( this.eventNamespace + \\\" \\\" ) +\\n\\t\\t\\tthis.eventNamespace;\\n\\t\\telement.off( eventName ).off( eventName );\\n\\n\\t\\t// Clear the stack to avoid memory leaks (#10056)\\n\\t\\tthis.bindings = $( this.bindings.not( element ).get() );\\n\\t\\tthis.focusable = $( this.focusable.not( element ).get() );\\n\\t\\tthis.hoverable = $( this.hoverable.not( element ).get() );\\n\\t},\\n\\n\\t_delay: function( handler, delay ) {\\n\\t\\tfunction handlerProxy() {\\n\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t}\\n\\t\\tvar instance = this;\\n\\t\\treturn setTimeout( handlerProxy, delay || 0 );\\n\\t},\\n\\n\\t_hoverable: function( element ) {\\n\\t\\tthis.hoverable = this.hoverable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tmouseenter: function( event ) {\\n\\t\\t\\t\\tthis._addClass( $( event.currentTarget ), null, \\\"ui-state-hover\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tmouseleave: function( event ) {\\n\\t\\t\\t\\tthis._removeClass( $( event.currentTarget ), null, \\\"ui-state-hover\\\" );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_focusable: function( element ) {\\n\\t\\tthis.focusable = this.focusable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tfocusin: function( event ) {\\n\\t\\t\\t\\tthis._addClass( $( event.currentTarget ), null, \\\"ui-state-focus\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tfocusout: function( event ) {\\n\\t\\t\\t\\tthis._removeClass( $( event.currentTarget ), null, \\\"ui-state-focus\\\" );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_trigger: function( type, event, data ) {\\n\\t\\tvar prop, orig;\\n\\t\\tvar callback = this.options[ type ];\\n\\n\\t\\tdata = data || {};\\n\\t\\tevent = $.Event( event );\\n\\t\\tevent.type = ( type === this.widgetEventPrefix ?\\n\\t\\t\\ttype :\\n\\t\\t\\tthis.widgetEventPrefix + type ).toLowerCase();\\n\\n\\t\\t// The original event may come from any element\\n\\t\\t// so we need to reset the target on the new event\\n\\t\\tevent.target = this.element[ 0 ];\\n\\n\\t\\t// Copy original event properties over to the new event\\n\\t\\torig = event.originalEvent;\\n\\t\\tif ( orig ) {\\n\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\tif ( !( prop in event ) ) {\\n\\t\\t\\t\\t\\tevent[ prop ] = orig[ prop ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis.element.trigger( event, data );\\n\\t\\treturn !( $.isFunction( callback ) &&\\n\\t\\t\\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\\n\\t\\t\\tevent.isDefaultPrevented() );\\n\\t}\\n};\\n\\n$.each( { show: \\\"fadeIn\\\", hide: \\\"fadeOut\\\" }, function( method, defaultEffect ) {\\n\\t$.Widget.prototype[ \\\"_\\\" + method ] = function( element, options, callback ) {\\n\\t\\tif ( typeof options === \\\"string\\\" ) {\\n\\t\\t\\toptions = { effect: options };\\n\\t\\t}\\n\\n\\t\\tvar hasOptions;\\n\\t\\tvar effectName = !options ?\\n\\t\\t\\tmethod :\\n\\t\\t\\toptions === true || typeof options === \\\"number\\\" ?\\n\\t\\t\\t\\tdefaultEffect :\\n\\t\\t\\t\\toptions.effect || defaultEffect;\\n\\n\\t\\toptions = options || {};\\n\\t\\tif ( typeof options === \\\"number\\\" ) {\\n\\t\\t\\toptions = { duration: options };\\n\\t\\t}\\n\\n\\t\\thasOptions = !$.isEmptyObject( options );\\n\\t\\toptions.complete = callback;\\n\\n\\t\\tif ( options.delay ) {\\n\\t\\t\\telement.delay( options.delay );\\n\\t\\t}\\n\\n\\t\\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\\n\\t\\t\\telement[ method ]( options );\\n\\t\\t} else if ( effectName !== method && element[ effectName ] ) {\\n\\t\\t\\telement[ effectName ]( options.duration, options.easing, callback );\\n\\t\\t} else {\\n\\t\\t\\telement.queue( function( next ) {\\n\\t\\t\\t\\t$( this )[ method ]();\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback.call( element[ 0 ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnext();\\n\\t\\t\\t} );\\n\\t\\t}\\n\\t};\\n} );\\n\\nreturn $.widget;\\n\\n} ) );\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS93aWRnZXQuanM/NDliZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMi4xXG4gKiBodHRwOi8vanF1ZXJ5dWkuY29tXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqL1xuXG4vLz4+bGFiZWw6IFdpZGdldFxuLy8+Pmdyb3VwOiBDb3JlXG4vLz4+ZGVzY3JpcHRpb246IFByb3ZpZGVzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgc3RhdGVmdWwgd2lkZ2V0cyB3aXRoIGEgY29tbW9uIEFQSS5cbi8vPj5kb2NzOiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9qUXVlcnkud2lkZ2V0L1xuLy8+PmRlbW9zOiBodHRwOi8vanF1ZXJ5dWkuY29tL3dpZGdldC9cblxuKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiwgXCIuL3ZlcnNpb25cIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSggZnVuY3Rpb24oICQgKSB7XG5cbnZhciB3aWRnZXRVdWlkID0gMDtcbnZhciB3aWRnZXRTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuJC5jbGVhbkRhdGEgPSAoIGZ1bmN0aW9uKCBvcmlnICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBldmVudHMsIGVsZW0sIGk7XG5cdFx0Zm9yICggaSA9IDA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdC8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lXG5cdFx0XHRcdGV2ZW50cyA9ICQuX2RhdGEoIGVsZW0sIFwiZXZlbnRzXCIgKTtcblx0XHRcdFx0aWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHtcblx0XHRcdFx0XHQkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoIFwicmVtb3ZlXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIdHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0fVxuXHRcdG9yaWcoIGVsZW1zICk7XG5cdH07XG59ICkoICQuY2xlYW5EYXRhICk7XG5cbiQud2lkZ2V0ID0gZnVuY3Rpb24oIG5hbWUsIGJhc2UsIHByb3RvdHlwZSApIHtcblx0dmFyIGV4aXN0aW5nQ29uc3RydWN0b3IsIGNvbnN0cnVjdG9yLCBiYXNlUHJvdG90eXBlO1xuXG5cdC8vIFByb3hpZWRQcm90b3R5cGUgYWxsb3dzIHRoZSBwcm92aWRlZCBwcm90b3R5cGUgdG8gcmVtYWluIHVubW9kaWZpZWRcblx0Ly8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3Nilcblx0dmFyIHByb3hpZWRQcm90b3R5cGUgPSB7fTtcblxuXHR2YXIgbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMCBdO1xuXHRuYW1lID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMSBdO1xuXHR2YXIgZnVsbE5hbWUgPSBuYW1lc3BhY2UgKyBcIi1cIiArIG5hbWU7XG5cblx0aWYgKCAhcHJvdG90eXBlICkge1xuXHRcdHByb3RvdHlwZSA9IGJhc2U7XG5cdFx0YmFzZSA9ICQuV2lkZ2V0O1xuXHR9XG5cblx0aWYgKCAkLmlzQXJyYXkoIHByb3RvdHlwZSApICkge1xuXHRcdHByb3RvdHlwZSA9ICQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIHt9IF0uY29uY2F0KCBwcm90b3R5cGUgKSApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW5cblx0JC5leHByWyBcIjpcIiBdWyBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpIF0gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gISEkLmRhdGEoIGVsZW0sIGZ1bGxOYW1lICk7XG5cdH07XG5cblx0JFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTtcblx0ZXhpc3RpbmdDb25zdHJ1Y3RvciA9ICRbIG5hbWVzcGFjZSBdWyBuYW1lIF07XG5cdGNvbnN0cnVjdG9yID0gJFsgbmFtZXNwYWNlIF1bIG5hbWUgXSA9IGZ1bmN0aW9uKCBvcHRpb25zLCBlbGVtZW50ICkge1xuXG5cdFx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IFwibmV3XCIga2V5d29yZFxuXHRcdGlmICggIXRoaXMuX2NyZWF0ZVdpZGdldCApIHtcblx0XHRcdHJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGZvciBzaW1wbGUgaW5oZXJpdGFuY2Vcblx0XHQvLyBtdXN0IHVzZSBcIm5ld1wiIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncylcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLl9jcmVhdGVXaWRnZXQoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cdH07XG5cblx0Ly8gRXh0ZW5kIHdpdGggdGhlIGV4aXN0aW5nIGNvbnN0cnVjdG9yIHRvIGNhcnJ5IG92ZXIgYW55IHN0YXRpYyBwcm9wZXJ0aWVzXG5cdCQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3Rvciwge1xuXHRcdHZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLFxuXG5cdFx0Ly8gQ29weSB0aGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBwcm90b3R5cGUgaW4gY2FzZSB3ZSBuZWVkIHRvXG5cdFx0Ly8gcmVkZWZpbmUgdGhlIHdpZGdldCBsYXRlclxuXHRcdF9wcm90bzogJC5leHRlbmQoIHt9LCBwcm90b3R5cGUgKSxcblxuXHRcdC8vIFRyYWNrIHdpZGdldHMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyB3aWRnZXQgaW4gY2FzZSB0aGlzIHdpZGdldCBpc1xuXHRcdC8vIHJlZGVmaW5lZCBhZnRlciBhIHdpZGdldCBpbmhlcml0cyBmcm9tIGl0XG5cdFx0X2NoaWxkQ29uc3RydWN0b3JzOiBbXVxuXHR9ICk7XG5cblx0YmFzZVByb3RvdHlwZSA9IG5ldyBiYXNlKCk7XG5cblx0Ly8gV2UgbmVlZCB0byBtYWtlIHRoZSBvcHRpb25zIGhhc2ggYSBwcm9wZXJ0eSBkaXJlY3RseSBvbiB0aGUgbmV3IGluc3RhbmNlXG5cdC8vIG90aGVyd2lzZSB3ZSdsbCBtb2RpZnkgdGhlIG9wdGlvbnMgaGFzaCBvbiB0aGUgcHJvdG90eXBlIHRoYXQgd2UncmVcblx0Ly8gaW5oZXJpdGluZyBmcm9tXG5cdGJhc2VQcm90b3R5cGUub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sIGJhc2VQcm90b3R5cGUub3B0aW9ucyApO1xuXHQkLmVhY2goIHByb3RvdHlwZSwgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdGlmICggISQuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHByb3hpZWRQcm90b3R5cGVbIHByb3AgXSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZnVuY3Rpb24gX3N1cGVyKCkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIF9zdXBlckFwcGx5KCBhcmdzICkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBfX3N1cGVyID0gdGhpcy5fc3VwZXI7XG5cdFx0XHRcdHZhciBfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5O1xuXHRcdFx0XHR2YXIgcmV0dXJuVmFsdWU7XG5cblx0XHRcdFx0dGhpcy5fc3VwZXIgPSBfc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfc3VwZXJBcHBseTtcblxuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHZhbHVlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHR0aGlzLl9zdXBlciA9IF9fc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7XG5cblx0XHRcdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHRcdFx0fTtcblx0XHR9ICkoKTtcblx0fSApO1xuXHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSAkLndpZGdldC5leHRlbmQoIGJhc2VQcm90b3R5cGUsIHtcblxuXHRcdC8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeFxuXHRcdC8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydFxuXHRcdC8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWRcblx0XHR3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/ICggYmFzZVByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeCB8fCBuYW1lICkgOiBuYW1lXG5cdH0sIHByb3hpZWRQcm90b3R5cGUsIHtcblx0XHRjb25zdHJ1Y3RvcjogY29uc3RydWN0b3IsXG5cdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2UsXG5cdFx0d2lkZ2V0TmFtZTogbmFtZSxcblx0XHR3aWRnZXRGdWxsTmFtZTogZnVsbE5hbWVcblx0fSApO1xuXG5cdC8vIElmIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lkZ2V0cyB0aGF0XG5cdC8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb21cblx0Ly8gdGhlIG5ldyB2ZXJzaW9uIG9mIHRoaXMgd2lkZ2V0LiBXZSdyZSBlc3NlbnRpYWxseSB0cnlpbmcgdG8gcmVwbGFjZSBvbmVcblx0Ly8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi5cblx0aWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkge1xuXHRcdCQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHtcblx0XHRcdHZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3RvdHlwZTtcblxuXHRcdFx0Ly8gUmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXNcblx0XHRcdC8vIG9yaWdpbmFsbHkgdXNlZCwgYnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2Vcblx0XHRcdCQud2lkZ2V0KCBjaGlsZFByb3RvdHlwZS5uYW1lc3BhY2UgKyBcIi5cIiArIGNoaWxkUHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLFxuXHRcdFx0XHRjaGlsZC5fcHJvdG8gKTtcblx0XHR9ICk7XG5cblx0XHQvLyBSZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQgY29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvclxuXHRcdC8vIHNvIHRoZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZFxuXHRcdGRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9ycztcblx0fSBlbHNlIHtcblx0XHRiYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApO1xuXHR9XG5cblx0JC53aWRnZXQuYnJpZGdlKCBuYW1lLCBjb25zdHJ1Y3RvciApO1xuXG5cdHJldHVybiBjb25zdHJ1Y3Rvcjtcbn07XG5cbiQud2lkZ2V0LmV4dGVuZCA9IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdHZhciBpbnB1dCA9IHdpZGdldFNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApO1xuXHR2YXIgaW5wdXRJbmRleCA9IDA7XG5cdHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0dmFyIGtleTtcblx0dmFyIHZhbHVlO1xuXG5cdGZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7XG5cdFx0Zm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7XG5cdFx0XHR2YWx1ZSA9IGlucHV0WyBpbnB1dEluZGV4IF1bIGtleSBdO1xuXHRcdFx0aWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIENsb25lIG9iamVjdHNcblx0XHRcdFx0aWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID9cblx0XHRcdFx0XHRcdCQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0c1xuXHRcdFx0XHRcdFx0JC53aWRnZXQuZXh0ZW5kKCB7fSwgdmFsdWUgKTtcblxuXHRcdFx0XHQvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0YXJnZXRbIGtleSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7XG5cdHZhciBmdWxsTmFtZSA9IG9iamVjdC5wcm90b3R5cGUud2lkZ2V0RnVsbE5hbWUgfHwgbmFtZTtcblx0JC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiO1xuXHRcdHZhciBhcmdzID0gd2lkZ2V0U2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICk7XG5cdFx0dmFyIHJldHVyblZhbHVlID0gdGhpcztcblxuXHRcdGlmICggaXNNZXRob2RDYWxsICkge1xuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGFuIGVtcHR5IGNvbGxlY3Rpb24sIHdlIG5lZWQgdG8gaGF2ZSB0aGUgaW5zdGFuY2UgbWV0aG9kXG5cdFx0XHQvLyByZXR1cm4gdW5kZWZpbmVkIGluc3RlYWQgb2YgdGhlIGpRdWVyeSBpbnN0YW5jZVxuXHRcdFx0aWYgKCAhdGhpcy5sZW5ndGggJiYgb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdHZhciBpbnN0YW5jZSA9ICQuZGF0YSggdGhpcywgZnVsbE5hbWUgKTtcblxuXHRcdFx0XHRcdGlmICggb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBpbnN0YW5jZTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICFpbnN0YW5jZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiAkLmVycm9yKCBcImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gXCIgKyBuYW1lICtcblx0XHRcdFx0XHRcdFx0XCIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IFwiICtcblx0XHRcdFx0XHRcdFx0XCJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJ1wiICsgb3B0aW9ucyArIFwiJ1wiICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhJC5pc0Z1bmN0aW9uKCBpbnN0YW5jZVsgb3B0aW9ucyBdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gXCJfXCIgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5lcnJvciggXCJubyBzdWNoIG1ldGhvZCAnXCIgKyBvcHRpb25zICsgXCInIGZvciBcIiArIG5hbWUgK1xuXHRcdFx0XHRcdFx0XHRcIiB3aWRnZXQgaW5zdGFuY2VcIiApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1ldGhvZFZhbHVlID0gaW5zdGFuY2VbIG9wdGlvbnMgXS5hcHBseSggaW5zdGFuY2UsIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggbWV0aG9kVmFsdWUgIT09IGluc3RhbmNlICYmIG1ldGhvZFZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IG1ldGhvZFZhbHVlICYmIG1ldGhvZFZhbHVlLmpxdWVyeSA/XG5cdFx0XHRcdFx0XHRcdHJldHVyblZhbHVlLnB1c2hTdGFjayggbWV0aG9kVmFsdWUuZ2V0KCkgKSA6XG5cdFx0XHRcdFx0XHRcdG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEFsbG93IG11bHRpcGxlIGhhc2hlcyB0byBiZSBwYXNzZWQgb24gaW5pdFxuXHRcdFx0aWYgKCBhcmdzLmxlbmd0aCApIHtcblx0XHRcdFx0b3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZC5hcHBseSggbnVsbCwgWyBvcHRpb25zIF0uY29uY2F0KCBhcmdzICkgKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApO1xuXHRcdFx0XHRpZiAoIGluc3RhbmNlICkge1xuXHRcdFx0XHRcdGluc3RhbmNlLm9wdGlvbiggb3B0aW9ucyB8fCB7fSApO1xuXHRcdFx0XHRcdGlmICggaW5zdGFuY2UuX2luaXQgKSB7XG5cdFx0XHRcdFx0XHRpbnN0YW5jZS5faW5pdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lLCBuZXcgb2JqZWN0KCBvcHRpb25zLCB0aGlzICkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0fTtcbn07XG5cbiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTtcbiQuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycyA9IFtdO1xuXG4kLldpZGdldC5wcm90b3R5cGUgPSB7XG5cdHdpZGdldE5hbWU6IFwid2lkZ2V0XCIsXG5cdHdpZGdldEV2ZW50UHJlZml4OiBcIlwiLFxuXHRkZWZhdWx0RWxlbWVudDogXCI8ZGl2PlwiLFxuXG5cdG9wdGlvbnM6IHtcblx0XHRjbGFzc2VzOiB7fSxcblx0XHRkaXNhYmxlZDogZmFsc2UsXG5cblx0XHQvLyBDYWxsYmFja3Ncblx0XHRjcmVhdGU6IG51bGxcblx0fSxcblxuXHRfY3JlYXRlV2lkZ2V0OiBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHtcblx0XHRlbGVtZW50ID0gJCggZWxlbWVudCB8fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdO1xuXHRcdHRoaXMuZWxlbWVudCA9ICQoIGVsZW1lbnQgKTtcblx0XHR0aGlzLnV1aWQgPSB3aWRnZXRVdWlkKys7XG5cdFx0dGhpcy5ldmVudE5hbWVzcGFjZSA9IFwiLlwiICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkO1xuXG5cdFx0dGhpcy5iaW5kaW5ncyA9ICQoKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoKTtcblx0XHR0aGlzLmZvY3VzYWJsZSA9ICQoKTtcblx0XHR0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwID0ge307XG5cblx0XHRpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7XG5cdFx0XHQkLmRhdGEoIGVsZW1lbnQsIHRoaXMud2lkZ2V0RnVsbE5hbWUsIHRoaXMgKTtcblx0XHRcdHRoaXMuX29uKCB0cnVlLCB0aGlzLmVsZW1lbnQsIHtcblx0XHRcdFx0cmVtb3ZlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdFx0aWYgKCBldmVudC50YXJnZXQgPT09IGVsZW1lbnQgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHRcdHRoaXMuZG9jdW1lbnQgPSAkKCBlbGVtZW50LnN0eWxlID9cblxuXHRcdFx0XHQvLyBFbGVtZW50IHdpdGhpbiB0aGUgZG9jdW1lbnRcblx0XHRcdFx0ZWxlbWVudC5vd25lckRvY3VtZW50IDpcblxuXHRcdFx0XHQvLyBFbGVtZW50IGlzIHdpbmRvdyBvciBkb2N1bWVudFxuXHRcdFx0XHRlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQgKTtcblx0XHRcdHRoaXMud2luZG93ID0gJCggdGhpcy5kb2N1bWVudFsgMCBdLmRlZmF1bHRWaWV3IHx8IHRoaXMuZG9jdW1lbnRbIDAgXS5wYXJlbnRXaW5kb3cgKTtcblx0XHR9XG5cblx0XHR0aGlzLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LFxuXHRcdFx0dGhpcy5vcHRpb25zLFxuXHRcdFx0dGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLFxuXHRcdFx0b3B0aW9ucyApO1xuXG5cdFx0dGhpcy5fY3JlYXRlKCk7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHtcblx0XHRcdHRoaXMuX3NldE9wdGlvbkRpc2FibGVkKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKTtcblx0XHR9XG5cblx0XHR0aGlzLl90cmlnZ2VyKCBcImNyZWF0ZVwiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApO1xuXHRcdHRoaXMuX2luaXQoKTtcblx0fSxcblxuXHRfZ2V0Q3JlYXRlT3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9LFxuXG5cdF9nZXRDcmVhdGVFdmVudERhdGE6ICQubm9vcCxcblxuXHRfY3JlYXRlOiAkLm5vb3AsXG5cblx0X2luaXQ6ICQubm9vcCxcblxuXHRkZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cblx0XHR0aGlzLl9kZXN0cm95KCk7XG5cdFx0JC5lYWNoKCB0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdHRoYXQuX3JlbW92ZUNsYXNzKCB2YWx1ZSwga2V5ICk7XG5cdFx0fSApO1xuXG5cdFx0Ly8gV2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMFxuXHRcdC8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpXG5cdFx0dGhpcy5lbGVtZW50XG5cdFx0XHQub2ZmKCB0aGlzLmV2ZW50TmFtZXNwYWNlIClcblx0XHRcdC5yZW1vdmVEYXRhKCB0aGlzLndpZGdldEZ1bGxOYW1lICk7XG5cdFx0dGhpcy53aWRnZXQoKVxuXHRcdFx0Lm9mZiggdGhpcy5ldmVudE5hbWVzcGFjZSApXG5cdFx0XHQucmVtb3ZlQXR0ciggXCJhcmlhLWRpc2FibGVkXCIgKTtcblxuXHRcdC8vIENsZWFuIHVwIGV2ZW50cyBhbmQgc3RhdGVzXG5cdFx0dGhpcy5iaW5kaW5ncy5vZmYoIHRoaXMuZXZlbnROYW1lc3BhY2UgKTtcblx0fSxcblxuXHRfZGVzdHJveTogJC5ub29wLFxuXG5cdHdpZGdldDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudDtcblx0fSxcblxuXHRvcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBvcHRpb25zID0ga2V5O1xuXHRcdHZhciBwYXJ0cztcblx0XHR2YXIgY3VyT3B0aW9uO1xuXHRcdHZhciBpO1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHQvLyBEb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2hcblx0XHRcdHJldHVybiAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vIEhhbmRsZSBuZXN0ZWQga2V5cywgZS5nLiwgXCJmb28uYmFyXCIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9XG5cdFx0XHRvcHRpb25zID0ge307XG5cdFx0XHRwYXJ0cyA9IGtleS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdGtleSA9IHBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRpZiAoIHBhcnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y3VyT3B0aW9uID0gb3B0aW9uc1sga2V5IF0gPSAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnNbIGtleSBdICk7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrICkge1xuXHRcdFx0XHRcdGN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307XG5cdFx0XHRcdFx0Y3VyT3B0aW9uID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07XG5cdFx0XHRcdH1cblx0XHRcdFx0a2V5ID0gcGFydHMucG9wKCk7XG5cdFx0XHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdFx0XHRyZXR1cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9wdGlvblsga2V5IF07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3VyT3B0aW9uWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnNbIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5vcHRpb25zWyBrZXkgXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvcHRpb25zWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuX3NldE9wdGlvbnMoIG9wdGlvbnMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdF9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIga2V5O1xuXG5cdFx0Zm9yICgga2V5IGluIG9wdGlvbnMgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb24oIGtleSwgb3B0aW9uc1sga2V5IF0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRpZiAoIGtleSA9PT0gXCJjbGFzc2VzXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25DbGFzc2VzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdHRoaXMub3B0aW9uc1sga2V5IF0gPSB2YWx1ZTtcblxuXHRcdGlmICgga2V5ID09PSBcImRpc2FibGVkXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25EaXNhYmxlZCggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uQ2xhc3NlczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc0tleSwgZWxlbWVudHMsIGN1cnJlbnRFbGVtZW50cztcblxuXHRcdGZvciAoIGNsYXNzS2V5IGluIHZhbHVlICkge1xuXHRcdFx0Y3VycmVudEVsZW1lbnRzID0gdGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cFsgY2xhc3NLZXkgXTtcblx0XHRcdGlmICggdmFsdWVbIGNsYXNzS2V5IF0gPT09IHRoaXMub3B0aW9ucy5jbGFzc2VzWyBjbGFzc0tleSBdIHx8XG5cdFx0XHRcdFx0IWN1cnJlbnRFbGVtZW50cyB8fFxuXHRcdFx0XHRcdCFjdXJyZW50RWxlbWVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UgYXJlIGRvaW5nIHRoaXMgdG8gY3JlYXRlIGEgbmV3IGpRdWVyeSBvYmplY3QgYmVjYXVzZSB0aGUgX3JlbW92ZUNsYXNzKCkgY2FsbFxuXHRcdFx0Ly8gb24gdGhlIG5leHQgbGluZSBpcyBnb2luZyB0byBkZXN0cm95IHRoZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZWxlbWVudHMgYmVpbmdcblx0XHRcdC8vIHRyYWNrZWQuIFdlIG5lZWQgdG8gc2F2ZSBhIGNvcHkgb2YgdGhpcyBjb2xsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGFkZCB0aGUgbmV3IGNsYXNzZXNcblx0XHRcdC8vIGJlbG93LlxuXHRcdFx0ZWxlbWVudHMgPSAkKCBjdXJyZW50RWxlbWVudHMuZ2V0KCkgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCBjdXJyZW50RWxlbWVudHMsIGNsYXNzS2V5ICk7XG5cblx0XHRcdC8vIFdlIGRvbid0IHVzZSBfYWRkQ2xhc3MoKSBoZXJlLCBiZWNhdXNlIHRoYXQgdXNlcyB0aGlzLm9wdGlvbnMuY2xhc3Nlc1xuXHRcdFx0Ly8gZm9yIGdlbmVyYXRpbmcgdGhlIHN0cmluZyBvZiBjbGFzc2VzLiBXZSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgcGFzc2VkIGluIGZyb21cblx0XHRcdC8vIF9zZXRPcHRpb24oKSwgdGhpcyBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjbGFzc2VzIG9wdGlvbiB3aGljaCB3YXMgcGFzc2VkIHRvXG5cdFx0XHQvLyBfc2V0T3B0aW9uKCkuIFdlIHBhc3MgdGhpcyB2YWx1ZSBkaXJlY3RseSB0byBfY2xhc3NlcygpLlxuXHRcdFx0ZWxlbWVudHMuYWRkQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIHtcblx0XHRcdFx0ZWxlbWVudDogZWxlbWVudHMsXG5cdFx0XHRcdGtleXM6IGNsYXNzS2V5LFxuXHRcdFx0XHRjbGFzc2VzOiB2YWx1ZSxcblx0XHRcdFx0YWRkOiB0cnVlXG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cdH0sXG5cblx0X3NldE9wdGlvbkRpc2FibGVkOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dGhpcy5fdG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0KCksIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyBcIi1kaXNhYmxlZFwiLCBudWxsLCAhIXZhbHVlICk7XG5cblx0XHQvLyBJZiB0aGUgd2lkZ2V0IGlzIGJlY29taW5nIGRpc2FibGVkLCB0aGVuIG5vdGhpbmcgaXMgaW50ZXJhY3RpdmVcblx0XHRpZiAoIHZhbHVlICkge1xuXHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoIHRoaXMuaG92ZXJhYmxlLCBudWxsLCBcInVpLXN0YXRlLWhvdmVyXCIgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCB0aGlzLmZvY3VzYWJsZSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoIHsgZGlzYWJsZWQ6IGZhbHNlIH0gKTtcblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyggeyBkaXNhYmxlZDogdHJ1ZSB9ICk7XG5cdH0sXG5cblx0X2NsYXNzZXM6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBmdWxsID0gW107XG5cdFx0dmFyIHRoYXQgPSB0aGlzO1xuXG5cdFx0b3B0aW9ucyA9ICQuZXh0ZW5kKCB7XG5cdFx0XHRlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG5cdFx0XHRjbGFzc2VzOiB0aGlzLm9wdGlvbnMuY2xhc3NlcyB8fCB7fVxuXHRcdH0sIG9wdGlvbnMgKTtcblxuXHRcdGZ1bmN0aW9uIHByb2Nlc3NDbGFzc1N0cmluZyggY2xhc3NlcywgY2hlY2tPcHRpb24gKSB7XG5cdFx0XHR2YXIgY3VycmVudCwgaTtcblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0Y3VycmVudCA9IHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdIHx8ICQoKTtcblx0XHRcdFx0aWYgKCBvcHRpb25zLmFkZCApIHtcblx0XHRcdFx0XHRjdXJyZW50ID0gJCggJC51bmlxdWUoIGN1cnJlbnQuZ2V0KCkuY29uY2F0KCBvcHRpb25zLmVsZW1lbnQuZ2V0KCkgKSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudCA9ICQoIGN1cnJlbnQubm90KCBvcHRpb25zLmVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdID0gY3VycmVudDtcblx0XHRcdFx0ZnVsbC5wdXNoKCBjbGFzc2VzWyBpIF0gKTtcblx0XHRcdFx0aWYgKCBjaGVja09wdGlvbiAmJiBvcHRpb25zLmNsYXNzZXNbIGNsYXNzZXNbIGkgXSBdICkge1xuXHRcdFx0XHRcdGZ1bGwucHVzaCggb3B0aW9ucy5jbGFzc2VzWyBjbGFzc2VzWyBpIF0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fb24oIG9wdGlvbnMuZWxlbWVudCwge1xuXHRcdFx0XCJyZW1vdmVcIjogXCJfdW50cmFja0NsYXNzZXNFbGVtZW50XCJcblx0XHR9ICk7XG5cblx0XHRpZiAoIG9wdGlvbnMua2V5cyApIHtcblx0XHRcdHByb2Nlc3NDbGFzc1N0cmluZyggb3B0aW9ucy5rZXlzLm1hdGNoKCAvXFxTKy9nICkgfHwgW10sIHRydWUgKTtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmV4dHJhICkge1xuXHRcdFx0cHJvY2Vzc0NsYXNzU3RyaW5nKCBvcHRpb25zLmV4dHJhLm1hdGNoKCAvXFxTKy9nICkgfHwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZnVsbC5qb2luKCBcIiBcIiApO1xuXHR9LFxuXG5cdF91bnRyYWNrQ2xhc3Nlc0VsZW1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cdFx0JC5lYWNoKCB0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdGlmICggJC5pbkFycmF5KCBldmVudC50YXJnZXQsIHZhbHVlICkgIT09IC0xICkge1xuXHRcdFx0XHR0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwWyBrZXkgXSA9ICQoIHZhbHVlLm5vdCggZXZlbnQudGFyZ2V0ICkuZ2V0KCkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X3JlbW92ZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3RvZ2dsZUNsYXNzKCBlbGVtZW50LCBrZXlzLCBleHRyYSwgZmFsc2UgKTtcblx0fSxcblxuXHRfYWRkQ2xhc3M6IGZ1bmN0aW9uKCBlbGVtZW50LCBrZXlzLCBleHRyYSApIHtcblx0XHRyZXR1cm4gdGhpcy5fdG9nZ2xlQ2xhc3MoIGVsZW1lbnQsIGtleXMsIGV4dHJhLCB0cnVlICk7XG5cdH0sXG5cblx0X3RvZ2dsZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEsIGFkZCApIHtcblx0XHRhZGQgPSAoIHR5cGVvZiBhZGQgPT09IFwiYm9vbGVhblwiICkgPyBhZGQgOiBleHRyYTtcblx0XHR2YXIgc2hpZnQgPSAoIHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiIHx8IGVsZW1lbnQgPT09IG51bGwgKSxcblx0XHRcdG9wdGlvbnMgPSB7XG5cdFx0XHRcdGV4dHJhOiBzaGlmdCA/IGtleXMgOiBleHRyYSxcblx0XHRcdFx0a2V5czogc2hpZnQgPyBlbGVtZW50IDoga2V5cyxcblx0XHRcdFx0ZWxlbWVudDogc2hpZnQgPyB0aGlzLmVsZW1lbnQgOiBlbGVtZW50LFxuXHRcdFx0XHRhZGQ6IGFkZFxuXHRcdFx0fTtcblx0XHRvcHRpb25zLmVsZW1lbnQudG9nZ2xlQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIG9wdGlvbnMgKSwgYWRkICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0X29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgZGVsZWdhdGVFbGVtZW50O1xuXHRcdHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cblx0XHQvLyBObyBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgZmxhZywgc2h1ZmZsZSBhcmd1bWVudHNcblx0XHRpZiAoIHR5cGVvZiBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgIT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0aGFuZGxlcnMgPSBlbGVtZW50O1xuXHRcdFx0ZWxlbWVudCA9IHN1cHByZXNzRGlzYWJsZWRDaGVjaztcblx0XHRcdHN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIE5vIGVsZW1lbnQgYXJndW1lbnQsIHNodWZmbGUgYW5kIHVzZSB0aGlzLmVsZW1lbnRcblx0XHRpZiAoICFoYW5kbGVycyApIHtcblx0XHRcdGhhbmRsZXJzID0gZWxlbWVudDtcblx0XHRcdGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XG5cdFx0XHRkZWxlZ2F0ZUVsZW1lbnQgPSB0aGlzLndpZGdldCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50ID0gZGVsZWdhdGVFbGVtZW50ID0gJCggZWxlbWVudCApO1xuXHRcdFx0dGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7XG5cdFx0fVxuXG5cdFx0JC5lYWNoKCBoYW5kbGVycywgZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVyICkge1xuXHRcdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXG5cdFx0XHRcdC8vIEFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZ1xuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGFzIGFuIGFycmF5IGluc3RlYWQgb2YgYm9vbGVhblxuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGNsYXNzIGFzIG1ldGhvZCBmb3IgZGlzYWJsaW5nIGluZGl2aWR1YWwgcGFydHNcblx0XHRcdFx0aWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmXG5cdFx0XHRcdFx0XHQoIGluc3RhbmNlLm9wdGlvbnMuZGlzYWJsZWQgPT09IHRydWUgfHxcblx0XHRcdFx0XHRcdCQoIHRoaXMgKS5oYXNDbGFzcyggXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiICkgKSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdFx0LmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3Jrc1xuXHRcdFx0aWYgKCB0eXBlb2YgaGFuZGxlciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0aGFuZGxlclByb3h5Lmd1aWQgPSBoYW5kbGVyLmd1aWQgPVxuXHRcdFx0XHRcdGhhbmRsZXIuZ3VpZCB8fCBoYW5kbGVyUHJveHkuZ3VpZCB8fCAkLmd1aWQrKztcblx0XHRcdH1cblxuXHRcdFx0dmFyIG1hdGNoID0gZXZlbnQubWF0Y2goIC9eKFtcXHc6LV0qKVxccyooLiopJC8gKTtcblx0XHRcdHZhciBldmVudE5hbWUgPSBtYXRjaFsgMSBdICsgaW5zdGFuY2UuZXZlbnROYW1lc3BhY2U7XG5cdFx0XHR2YXIgc2VsZWN0b3IgPSBtYXRjaFsgMiBdO1xuXG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRkZWxlZ2F0ZUVsZW1lbnQub24oIGV2ZW50TmFtZSwgc2VsZWN0b3IsIGhhbmRsZXJQcm94eSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudC5vbiggZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X29mZjogZnVuY3Rpb24oIGVsZW1lbnQsIGV2ZW50TmFtZSApIHtcblx0XHRldmVudE5hbWUgPSAoIGV2ZW50TmFtZSB8fCBcIlwiICkuc3BsaXQoIFwiIFwiICkuam9pbiggdGhpcy5ldmVudE5hbWVzcGFjZSArIFwiIFwiICkgK1xuXHRcdFx0dGhpcy5ldmVudE5hbWVzcGFjZTtcblx0XHRlbGVtZW50Lm9mZiggZXZlbnROYW1lICkub2ZmKCBldmVudE5hbWUgKTtcblxuXHRcdC8vIENsZWFyIHRoZSBzdGFjayB0byBhdm9pZCBtZW1vcnkgbGVha3MgKCMxMDA1Nilcblx0XHR0aGlzLmJpbmRpbmdzID0gJCggdGhpcy5iaW5kaW5ncy5ub3QoIGVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gJCggdGhpcy5mb2N1c2FibGUubm90KCBlbGVtZW50ICkuZ2V0KCkgKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoIHRoaXMuaG92ZXJhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7XG5cdH0sXG5cblx0X2RlbGF5OiBmdW5jdGlvbiggaGFuZGxlciwgZGVsYXkgKSB7XG5cdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdC5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0XHR2YXIgaW5zdGFuY2UgPSB0aGlzO1xuXHRcdHJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTtcblx0fSxcblxuXHRfaG92ZXJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHtcblx0XHR0aGlzLmhvdmVyYWJsZSA9IHRoaXMuaG92ZXJhYmxlLmFkZCggZWxlbWVudCApO1xuXHRcdHRoaXMuX29uKCBlbGVtZW50LCB7XG5cdFx0XHRtb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHRoaXMuX2FkZENsYXNzKCAkKCBldmVudC5jdXJyZW50VGFyZ2V0ICksIG51bGwsIFwidWktc3RhdGUtaG92ZXJcIiApO1xuXHRcdFx0fSxcblx0XHRcdG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1ob3ZlclwiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF9mb2N1c2FibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGUuYWRkKCBlbGVtZW50ICk7XG5cdFx0dGhpcy5fb24oIGVsZW1lbnQsIHtcblx0XHRcdGZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9LFxuXHRcdFx0Zm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7XG5cdFx0dmFyIHByb3AsIG9yaWc7XG5cdFx0dmFyIGNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07XG5cblx0XHRkYXRhID0gZGF0YSB8fCB7fTtcblx0XHRldmVudCA9ICQuRXZlbnQoIGV2ZW50ICk7XG5cdFx0ZXZlbnQudHlwZSA9ICggdHlwZSA9PT0gdGhpcy53aWRnZXRFdmVudFByZWZpeCA/XG5cdFx0XHR0eXBlIDpcblx0XHRcdHRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTtcblxuXHRcdC8vIFRoZSBvcmlnaW5hbCBldmVudCBtYXkgY29tZSBmcm9tIGFueSBlbGVtZW50XG5cdFx0Ly8gc28gd2UgbmVlZCB0byByZXNldCB0aGUgdGFyZ2V0IG9uIHRoZSBuZXcgZXZlbnRcblx0XHRldmVudC50YXJnZXQgPSB0aGlzLmVsZW1lbnRbIDAgXTtcblxuXHRcdC8vIENvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnRcblx0XHRvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDtcblx0XHRpZiAoIG9yaWcgKSB7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGlmICggISggcHJvcCBpbiBldmVudCApICkge1xuXHRcdFx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmVsZW1lbnQudHJpZ2dlciggZXZlbnQsIGRhdGEgKTtcblx0XHRyZXR1cm4gISggJC5pc0Z1bmN0aW9uKCBjYWxsYmFjayApICYmXG5cdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcy5lbGVtZW50WyAwIF0sIFsgZXZlbnQgXS5jb25jYXQoIGRhdGEgKSApID09PSBmYWxzZSB8fFxuXHRcdFx0ZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKTtcblx0fVxufTtcblxuJC5lYWNoKCB7IHNob3c6IFwiZmFkZUluXCIsIGhpZGU6IFwiZmFkZU91dFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIGRlZmF1bHRFZmZlY3QgKSB7XG5cdCQuV2lkZ2V0LnByb3RvdHlwZVsgXCJfXCIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0dmFyIGhhc09wdGlvbnM7XG5cdFx0dmFyIGVmZmVjdE5hbWUgPSAhb3B0aW9ucyA/XG5cdFx0XHRtZXRob2QgOlxuXHRcdFx0b3B0aW9ucyA9PT0gdHJ1ZSB8fCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiA/XG5cdFx0XHRcdGRlZmF1bHRFZmZlY3QgOlxuXHRcdFx0XHRvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0O1xuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0aWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB7IGR1cmF0aW9uOiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0aGFzT3B0aW9ucyA9ICEkLmlzRW1wdHlPYmplY3QoIG9wdGlvbnMgKTtcblx0XHRvcHRpb25zLmNvbXBsZXRlID0gY2FsbGJhY2s7XG5cblx0XHRpZiAoIG9wdGlvbnMuZGVsYXkgKSB7XG5cdFx0XHRlbGVtZW50LmRlbGF5KCBvcHRpb25zLmRlbGF5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBtZXRob2QgXSggb3B0aW9ucyApO1xuXHRcdH0gZWxzZSBpZiAoIGVmZmVjdE5hbWUgIT09IG1ldGhvZCAmJiBlbGVtZW50WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBlZmZlY3ROYW1lIF0oIG9wdGlvbnMuZHVyYXRpb24sIG9wdGlvbnMuZWFzaW5nLCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50LnF1ZXVlKCBmdW5jdGlvbiggbmV4dCApIHtcblx0XHRcdFx0JCggdGhpcyApWyBtZXRob2QgXSgpO1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGVsZW1lbnRbIDAgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbnJldHVybiAkLndpZGdldDtcblxufSApICk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vanF1ZXJ5LXVpL3VpL3dpZGdldC5qc1xuLy8gbW9kdWxlIGlkID0gMjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 28 */\n/***/ function(module, exports) {\n\neval(\"module.exports = function(module) {\\r\\n\\tif(!module.webpackPolyfill) {\\r\\n\\t\\tmodule.deprecate = function() {};\\r\\n\\t\\tmodule.paths = [];\\r\\n\\t\\t// module.parent = undefined by default\\r\\n\\t\\tif(!module.children) module.children = [];\\r\\n\\t\\tObject.defineProperty(module, \\\"loaded\\\", {\\r\\n\\t\\t\\tenumerable: true,\\r\\n\\t\\t\\tconfigurable: false,\\r\\n\\t\\t\\tget: function() { return module.l; }\\r\\n\\t\\t});\\r\\n\\t\\tObject.defineProperty(module, \\\"id\\\", {\\r\\n\\t\\t\\tenumerable: true,\\r\\n\\t\\t\\tconfigurable: false,\\r\\n\\t\\t\\tget: function() { return module.i; }\\r\\n\\t\\t});\\r\\n\\t\\tmodule.webpackPolyfill = 1;\\r\\n\\t}\\r\\n\\treturn module;\\r\\n}\\r\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0aWYoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGUubDsgfVxyXG5cdFx0fSk7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZS5pOyB9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\\n * @license\\n * Lodash \\n * Copyright JS Foundation and other contributors \\n * Released under MIT license \\n * Based on Underscore.js 1.8.3 \\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\\n */\\n;(function() {\\n\\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\\n var undefined;\\n\\n /** Used as the semantic version number. */\\n var VERSION = '4.17.4';\\n\\n /** Used as the size to enable large array optimizations. */\\n var LARGE_ARRAY_SIZE = 200;\\n\\n /** Error message constants. */\\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\\n FUNC_ERROR_TEXT = 'Expected a function';\\n\\n /** Used to stand-in for `undefined` hash values. */\\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\\n\\n /** Used as the maximum memoize cache size. */\\n var MAX_MEMOIZE_SIZE = 500;\\n\\n /** Used as the internal argument placeholder. */\\n var PLACEHOLDER = '__lodash_placeholder__';\\n\\n /** Used to compose bitmasks for cloning. */\\n var CLONE_DEEP_FLAG = 1,\\n CLONE_FLAT_FLAG = 2,\\n CLONE_SYMBOLS_FLAG = 4;\\n\\n /** Used to compose bitmasks for value comparisons. */\\n var COMPARE_PARTIAL_FLAG = 1,\\n COMPARE_UNORDERED_FLAG = 2;\\n\\n /** Used to compose bitmasks for function metadata. */\\n var WRAP_BIND_FLAG = 1,\\n WRAP_BIND_KEY_FLAG = 2,\\n WRAP_CURRY_BOUND_FLAG = 4,\\n WRAP_CURRY_FLAG = 8,\\n WRAP_CURRY_RIGHT_FLAG = 16,\\n WRAP_PARTIAL_FLAG = 32,\\n WRAP_PARTIAL_RIGHT_FLAG = 64,\\n WRAP_ARY_FLAG = 128,\\n WRAP_REARG_FLAG = 256,\\n WRAP_FLIP_FLAG = 512;\\n\\n /** Used as default options for `_.truncate`. */\\n var DEFAULT_TRUNC_LENGTH = 30,\\n DEFAULT_TRUNC_OMISSION = '...';\\n\\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\\n var HOT_COUNT = 800,\\n HOT_SPAN = 16;\\n\\n /** Used to indicate the type of lazy iteratees. */\\n var LAZY_FILTER_FLAG = 1,\\n LAZY_MAP_FLAG = 2,\\n LAZY_WHILE_FLAG = 3;\\n\\n /** Used as references for various `Number` constants. */\\n var INFINITY = 1 / 0,\\n MAX_SAFE_INTEGER = 9007199254740991,\\n MAX_INTEGER = 1.7976931348623157e+308,\\n NAN = 0 / 0;\\n\\n /** Used as references for the maximum length and index of an array. */\\n var MAX_ARRAY_LENGTH = 4294967295,\\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\\n\\n /** Used to associate wrap methods with their bit flags. */\\n var wrapFlags = [\\n ['ary', WRAP_ARY_FLAG],\\n ['bind', WRAP_BIND_FLAG],\\n ['bindKey', WRAP_BIND_KEY_FLAG],\\n ['curry', WRAP_CURRY_FLAG],\\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\\n ['flip', WRAP_FLIP_FLAG],\\n ['partial', WRAP_PARTIAL_FLAG],\\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\\n ['rearg', WRAP_REARG_FLAG]\\n ];\\n\\n /** `Object#toString` result references. */\\n var argsTag = '[object Arguments]',\\n arrayTag = '[object Array]',\\n asyncTag = '[object AsyncFunction]',\\n boolTag = '[object Boolean]',\\n dateTag = '[object Date]',\\n domExcTag = '[object DOMException]',\\n errorTag = '[object Error]',\\n funcTag = '[object Function]',\\n genTag = '[object GeneratorFunction]',\\n mapTag = '[object Map]',\\n numberTag = '[object Number]',\\n nullTag = '[object Null]',\\n objectTag = '[object Object]',\\n promiseTag = '[object Promise]',\\n proxyTag = '[object Proxy]',\\n regexpTag = '[object RegExp]',\\n setTag = '[object Set]',\\n stringTag = '[object String]',\\n symbolTag = '[object Symbol]',\\n undefinedTag = '[object Undefined]',\\n weakMapTag = '[object WeakMap]',\\n weakSetTag = '[object WeakSet]';\\n\\n var arrayBufferTag = '[object ArrayBuffer]',\\n dataViewTag = '[object DataView]',\\n float32Tag = '[object Float32Array]',\\n float64Tag = '[object Float64Array]',\\n int8Tag = '[object Int8Array]',\\n int16Tag = '[object Int16Array]',\\n int32Tag = '[object Int32Array]',\\n uint8Tag = '[object Uint8Array]',\\n uint8ClampedTag = '[object Uint8ClampedArray]',\\n uint16Tag = '[object Uint16Array]',\\n uint32Tag = '[object Uint32Array]';\\n\\n /** Used to match empty string literals in compiled template source. */\\n var reEmptyStringLeading = /\\\\b__p \\\\+= '';/g,\\n reEmptyStringMiddle = /\\\\b(__p \\\\+=) '' \\\\+/g,\\n reEmptyStringTrailing = /(__e\\\\(.*?\\\\)|\\\\b__t\\\\)) \\\\+\\\\n'';/g;\\n\\n /** Used to match HTML entities and HTML characters. */\\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\\n reUnescapedHtml = /[&<>\\\"']/g,\\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\\n\\n /** Used to match template delimiters. */\\n var reEscape = /<%-([\\\\s\\\\S]+?)%>/g,\\n reEvaluate = /<%([\\\\s\\\\S]+?)%>/g,\\n reInterpolate = /<%=([\\\\s\\\\S]+?)%>/g;\\n\\n /** Used to match property names within property paths. */\\n var reIsDeepProp = /\\\\.|\\\\[(?:[^[\\\\]]*|([\\\"'])(?:(?!\\\\1)[^\\\\\\\\]|\\\\\\\\.)*?\\\\1)\\\\]/,\\n reIsPlainProp = /^\\\\w*$/,\\n reLeadingDot = /^\\\\./,\\n rePropName = /[^.[\\\\]]+|\\\\[(?:(-?\\\\d+(?:\\\\.\\\\d+)?)|([\\\"'])((?:(?!\\\\2)[^\\\\\\\\]|\\\\\\\\.)*?)\\\\2)\\\\]|(?=(?:\\\\.|\\\\[\\\\])(?:\\\\.|\\\\[\\\\]|$))/g;\\n\\n /**\\n * Used to match `RegExp`\\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\\n */\\n var reRegExpChar = /[\\\\\\\\^$.*+?()[\\\\]{}|]/g,\\n reHasRegExpChar = RegExp(reRegExpChar.source);\\n\\n /** Used to match leading and trailing whitespace. */\\n var reTrim = /^\\\\s+|\\\\s+$/g,\\n reTrimStart = /^\\\\s+/,\\n reTrimEnd = /\\\\s+$/;\\n\\n /** Used to match wrap detail comments. */\\n var reWrapComment = /\\\\{(?:\\\\n\\\\/\\\\* \\\\[wrapped with .+\\\\] \\\\*\\\\/)?\\\\n?/,\\n reWrapDetails = /\\\\{\\\\n\\\\/\\\\* \\\\[wrapped with (.+)\\\\] \\\\*/,\\n reSplitDetails = /,? & /;\\n\\n /** Used to match words composed of alphanumeric characters. */\\n var reAsciiWord = /[^\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\x7f]+/g;\\n\\n /** Used to match backslashes in property paths. */\\n var reEscapeChar = /\\\\\\\\(\\\\\\\\)?/g;\\n\\n /**\\n * Used to match\\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\\n */\\n var reEsTemplate = /\\\\$\\\\{([^\\\\\\\\}]*(?:\\\\\\\\.[^\\\\\\\\}]*)*)\\\\}/g;\\n\\n /** Used to match `RegExp` flags from their coerced string values. */\\n var reFlags = /\\\\w*$/;\\n\\n /** Used to detect bad signed hexadecimal string values. */\\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\\n\\n /** Used to detect binary string values. */\\n var reIsBinary = /^0b[01]+$/i;\\n\\n /** Used to detect host constructors (Safari). */\\n var reIsHostCtor = /^\\\\[object .+?Constructor\\\\]$/;\\n\\n /** Used to detect octal string values. */\\n var reIsOctal = /^0o[0-7]+$/i;\\n\\n /** Used to detect unsigned integer values. */\\n var reIsUint = /^(?:0|[1-9]\\\\d*)$/;\\n\\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\\n var reLatin = /[\\\\xc0-\\\\xd6\\\\xd8-\\\\xf6\\\\xf8-\\\\xff\\\\u0100-\\\\u017f]/g;\\n\\n /** Used to ensure capturing order of template delimiters. */\\n var reNoMatch = /($^)/;\\n\\n /** Used to match unescaped characters in compiled string literals. */\\n var reUnescapedString = /['\\\\n\\\\r\\\\u2028\\\\u2029\\\\\\\\]/g;\\n\\n /** Used to compose unicode character classes. */\\n var rsAstralRange = '\\\\\\\\ud800-\\\\\\\\udfff',\\n rsComboMarksRange = '\\\\\\\\u0300-\\\\\\\\u036f',\\n reComboHalfMarksRange = '\\\\\\\\ufe20-\\\\\\\\ufe2f',\\n rsComboSymbolsRange = '\\\\\\\\u20d0-\\\\\\\\u20ff',\\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\\n rsDingbatRange = '\\\\\\\\u2700-\\\\\\\\u27bf',\\n rsLowerRange = 'a-z\\\\\\\\xdf-\\\\\\\\xf6\\\\\\\\xf8-\\\\\\\\xff',\\n rsMathOpRange = '\\\\\\\\xac\\\\\\\\xb1\\\\\\\\xd7\\\\\\\\xf7',\\n rsNonCharRange = '\\\\\\\\x00-\\\\\\\\x2f\\\\\\\\x3a-\\\\\\\\x40\\\\\\\\x5b-\\\\\\\\x60\\\\\\\\x7b-\\\\\\\\xbf',\\n rsPunctuationRange = '\\\\\\\\u2000-\\\\\\\\u206f',\\n rsSpaceRange = ' \\\\\\\\t\\\\\\\\x0b\\\\\\\\f\\\\\\\\xa0\\\\\\\\ufeff\\\\\\\\n\\\\\\\\r\\\\\\\\u2028\\\\\\\\u2029\\\\\\\\u1680\\\\\\\\u180e\\\\\\\\u2000\\\\\\\\u2001\\\\\\\\u2002\\\\\\\\u2003\\\\\\\\u2004\\\\\\\\u2005\\\\\\\\u2006\\\\\\\\u2007\\\\\\\\u2008\\\\\\\\u2009\\\\\\\\u200a\\\\\\\\u202f\\\\\\\\u205f\\\\\\\\u3000',\\n rsUpperRange = 'A-Z\\\\\\\\xc0-\\\\\\\\xd6\\\\\\\\xd8-\\\\\\\\xde',\\n rsVarRange = '\\\\\\\\ufe0e\\\\\\\\ufe0f',\\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\\n\\n /** Used to compose unicode capture groups. */\\n var rsApos = \\\"['\\\\u2019]\\\",\\n rsAstral = '[' + rsAstralRange + ']',\\n rsBreak = '[' + rsBreakRange + ']',\\n rsCombo = '[' + rsComboRange + ']',\\n rsDigits = '\\\\\\\\d+',\\n rsDingbat = '[' + rsDingbatRange + ']',\\n rsLower = '[' + rsLowerRange + ']',\\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\\n rsFitz = '\\\\\\\\ud83c[\\\\\\\\udffb-\\\\\\\\udfff]',\\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\\n rsNonAstral = '[^' + rsAstralRange + ']',\\n rsRegional = '(?:\\\\\\\\ud83c[\\\\\\\\udde6-\\\\\\\\uddff]){2}',\\n rsSurrPair = '[\\\\\\\\ud800-\\\\\\\\udbff][\\\\\\\\udc00-\\\\\\\\udfff]',\\n rsUpper = '[' + rsUpperRange + ']',\\n rsZWJ = '\\\\\\\\u200d';\\n\\n /** Used to compose unicode regexes. */\\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\\n reOptMod = rsModifier + '?',\\n rsOptVar = '[' + rsVarRange + ']?',\\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\\n rsOrdLower = '\\\\\\\\d*(?:(?:1st|2nd|3rd|(?![123])\\\\\\\\dth)\\\\\\\\b)',\\n rsOrdUpper = '\\\\\\\\d*(?:(?:1ST|2ND|3RD|(?![123])\\\\\\\\dTH)\\\\\\\\b)',\\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\\n\\n /** Used to match apostrophes. */\\n var reApos = RegExp(rsApos, 'g');\\n\\n /**\\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\\n */\\n var reComboMark = RegExp(rsCombo, 'g');\\n\\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\\n\\n /** Used to match complex or compound words. */\\n var reUnicodeWord = RegExp([\\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\\n rsUpper + '+' + rsOptContrUpper,\\n rsOrdUpper,\\n rsOrdLower,\\n rsDigits,\\n rsEmoji\\n ].join('|'), 'g');\\n\\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\\n\\n /** Used to detect strings that need a more robust regexp to match words. */\\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\\n\\n /** Used to assign default `context` object properties. */\\n var contextProps = [\\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\\n ];\\n\\n /** Used to make template sourceURLs easier to identify. */\\n var templateCounter = -1;\\n\\n /** Used to identify `toStringTag` values of typed arrays. */\\n var typedArrayTags = {};\\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\\n typedArrayTags[uint32Tag] = true;\\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\\n typedArrayTags[weakMapTag] = false;\\n\\n /** Used to identify `toStringTag` values supported by `_.clone`. */\\n var cloneableTags = {};\\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\\n cloneableTags[boolTag] = cloneableTags[dateTag] =\\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\\n cloneableTags[numberTag] = cloneableTags[objectTag] =\\n cloneableTags[regexpTag] = cloneableTags[setTag] =\\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\\n cloneableTags[errorTag] = cloneableTags[funcTag] =\\n cloneableTags[weakMapTag] = false;\\n\\n /** Used to map Latin Unicode letters to basic Latin letters. */\\n var deburredLetters = {\\n // Latin-1 Supplement block.\\n '\\\\xc0': 'A', '\\\\xc1': 'A', '\\\\xc2': 'A', '\\\\xc3': 'A', '\\\\xc4': 'A', '\\\\xc5': 'A',\\n '\\\\xe0': 'a', '\\\\xe1': 'a', '\\\\xe2': 'a', '\\\\xe3': 'a', '\\\\xe4': 'a', '\\\\xe5': 'a',\\n '\\\\xc7': 'C', '\\\\xe7': 'c',\\n '\\\\xd0': 'D', '\\\\xf0': 'd',\\n '\\\\xc8': 'E', '\\\\xc9': 'E', '\\\\xca': 'E', '\\\\xcb': 'E',\\n '\\\\xe8': 'e', '\\\\xe9': 'e', '\\\\xea': 'e', '\\\\xeb': 'e',\\n '\\\\xcc': 'I', '\\\\xcd': 'I', '\\\\xce': 'I', '\\\\xcf': 'I',\\n '\\\\xec': 'i', '\\\\xed': 'i', '\\\\xee': 'i', '\\\\xef': 'i',\\n '\\\\xd1': 'N', '\\\\xf1': 'n',\\n '\\\\xd2': 'O', '\\\\xd3': 'O', '\\\\xd4': 'O', '\\\\xd5': 'O', '\\\\xd6': 'O', '\\\\xd8': 'O',\\n '\\\\xf2': 'o', '\\\\xf3': 'o', '\\\\xf4': 'o', '\\\\xf5': 'o', '\\\\xf6': 'o', '\\\\xf8': 'o',\\n '\\\\xd9': 'U', '\\\\xda': 'U', '\\\\xdb': 'U', '\\\\xdc': 'U',\\n '\\\\xf9': 'u', '\\\\xfa': 'u', '\\\\xfb': 'u', '\\\\xfc': 'u',\\n '\\\\xdd': 'Y', '\\\\xfd': 'y', '\\\\xff': 'y',\\n '\\\\xc6': 'Ae', '\\\\xe6': 'ae',\\n '\\\\xde': 'Th', '\\\\xfe': 'th',\\n '\\\\xdf': 'ss',\\n // Latin Extended-A block.\\n '\\\\u0100': 'A', '\\\\u0102': 'A', '\\\\u0104': 'A',\\n '\\\\u0101': 'a', '\\\\u0103': 'a', '\\\\u0105': 'a',\\n '\\\\u0106': 'C', '\\\\u0108': 'C', '\\\\u010a': 'C', '\\\\u010c': 'C',\\n '\\\\u0107': 'c', '\\\\u0109': 'c', '\\\\u010b': 'c', '\\\\u010d': 'c',\\n '\\\\u010e': 'D', '\\\\u0110': 'D', '\\\\u010f': 'd', '\\\\u0111': 'd',\\n '\\\\u0112': 'E', '\\\\u0114': 'E', '\\\\u0116': 'E', '\\\\u0118': 'E', '\\\\u011a': 'E',\\n '\\\\u0113': 'e', '\\\\u0115': 'e', '\\\\u0117': 'e', '\\\\u0119': 'e', '\\\\u011b': 'e',\\n '\\\\u011c': 'G', '\\\\u011e': 'G', '\\\\u0120': 'G', '\\\\u0122': 'G',\\n '\\\\u011d': 'g', '\\\\u011f': 'g', '\\\\u0121': 'g', '\\\\u0123': 'g',\\n '\\\\u0124': 'H', '\\\\u0126': 'H', '\\\\u0125': 'h', '\\\\u0127': 'h',\\n '\\\\u0128': 'I', '\\\\u012a': 'I', '\\\\u012c': 'I', '\\\\u012e': 'I', '\\\\u0130': 'I',\\n '\\\\u0129': 'i', '\\\\u012b': 'i', '\\\\u012d': 'i', '\\\\u012f': 'i', '\\\\u0131': 'i',\\n '\\\\u0134': 'J', '\\\\u0135': 'j',\\n '\\\\u0136': 'K', '\\\\u0137': 'k', '\\\\u0138': 'k',\\n '\\\\u0139': 'L', '\\\\u013b': 'L', '\\\\u013d': 'L', '\\\\u013f': 'L', '\\\\u0141': 'L',\\n '\\\\u013a': 'l', '\\\\u013c': 'l', '\\\\u013e': 'l', '\\\\u0140': 'l', '\\\\u0142': 'l',\\n '\\\\u0143': 'N', '\\\\u0145': 'N', '\\\\u0147': 'N', '\\\\u014a': 'N',\\n '\\\\u0144': 'n', '\\\\u0146': 'n', '\\\\u0148': 'n', '\\\\u014b': 'n',\\n '\\\\u014c': 'O', '\\\\u014e': 'O', '\\\\u0150': 'O',\\n '\\\\u014d': 'o', '\\\\u014f': 'o', '\\\\u0151': 'o',\\n '\\\\u0154': 'R', '\\\\u0156': 'R', '\\\\u0158': 'R',\\n '\\\\u0155': 'r', '\\\\u0157': 'r', '\\\\u0159': 'r',\\n '\\\\u015a': 'S', '\\\\u015c': 'S', '\\\\u015e': 'S', '\\\\u0160': 'S',\\n '\\\\u015b': 's', '\\\\u015d': 's', '\\\\u015f': 's', '\\\\u0161': 's',\\n '\\\\u0162': 'T', '\\\\u0164': 'T', '\\\\u0166': 'T',\\n '\\\\u0163': 't', '\\\\u0165': 't', '\\\\u0167': 't',\\n '\\\\u0168': 'U', '\\\\u016a': 'U', '\\\\u016c': 'U', '\\\\u016e': 'U', '\\\\u0170': 'U', '\\\\u0172': 'U',\\n '\\\\u0169': 'u', '\\\\u016b': 'u', '\\\\u016d': 'u', '\\\\u016f': 'u', '\\\\u0171': 'u', '\\\\u0173': 'u',\\n '\\\\u0174': 'W', '\\\\u0175': 'w',\\n '\\\\u0176': 'Y', '\\\\u0177': 'y', '\\\\u0178': 'Y',\\n '\\\\u0179': 'Z', '\\\\u017b': 'Z', '\\\\u017d': 'Z',\\n '\\\\u017a': 'z', '\\\\u017c': 'z', '\\\\u017e': 'z',\\n '\\\\u0132': 'IJ', '\\\\u0133': 'ij',\\n '\\\\u0152': 'Oe', '\\\\u0153': 'oe',\\n '\\\\u0149': \\\"'n\\\", '\\\\u017f': 's'\\n };\\n\\n /** Used to map characters to HTML entities. */\\n var htmlEscapes = {\\n '&': '&',\\n '<': '<',\\n '>': '>',\\n '\\\"': '"',\\n \\\"'\\\": '''\\n };\\n\\n /** Used to map HTML entities to characters. */\\n var htmlUnescapes = {\\n '&': '&',\\n '<': '<',\\n '>': '>',\\n '"': '\\\"',\\n ''': \\\"'\\\"\\n };\\n\\n /** Used to escape characters for inclusion in compiled string literals. */\\n var stringEscapes = {\\n '\\\\\\\\': '\\\\\\\\',\\n \\\"'\\\": \\\"'\\\",\\n '\\\\n': 'n',\\n '\\\\r': 'r',\\n '\\\\u2028': 'u2028',\\n '\\\\u2029': 'u2029'\\n };\\n\\n /** Built-in method references without a dependency on `root`. */\\n var freeParseFloat = parseFloat,\\n freeParseInt = parseInt;\\n\\n /** Detect free variable `global` from Node.js. */\\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\\n\\n /** Detect free variable `self`. */\\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\\n\\n /** Used as a reference to the global object. */\\n var root = freeGlobal || freeSelf || Function('return this')();\\n\\n /** Detect free variable `exports`. */\\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\\n\\n /** Detect free variable `module`. */\\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\\n\\n /** Detect the popular CommonJS extension `module.exports`. */\\n var moduleExports = freeModule && freeModule.exports === freeExports;\\n\\n /** Detect free variable `process` from Node.js. */\\n var freeProcess = moduleExports && freeGlobal.process;\\n\\n /** Used to access faster Node.js helpers. */\\n var nodeUtil = (function() {\\n try {\\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\\n } catch (e) {}\\n }());\\n\\n /* Node.js helper references. */\\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\\n nodeIsDate = nodeUtil && nodeUtil.isDate,\\n nodeIsMap = nodeUtil && nodeUtil.isMap,\\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\\n nodeIsSet = nodeUtil && nodeUtil.isSet,\\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\\n\\n /*--------------------------------------------------------------------------*/\\n\\n /**\\n * Adds the key-value `pair` to `map`.\\n *\\n * @private\\n * @param {Object} map The map to modify.\\n * @param {Array} pair The key-value pair to add.\\n * @returns {Object} Returns `map`.\\n */\\n function addMapEntry(map, pair) {\\n // Don't return `map.set` because it's not chainable in IE 11.\\n map.set(pair[0], pair[1]);\\n return map;\\n }\\n\\n /**\\n * Adds `value` to `set`.\\n *\\n * @private\\n * @param {Object} set The set to modify.\\n * @param {*} value The value to add.\\n * @returns {Object} Returns `set`.\\n */\\n function addSetEntry(set, value) {\\n // Don't return `set.add` because it's not chainable in IE 11.\\n set.add(value);\\n return set;\\n }\\n\\n /**\\n * A faster alternative to `Function#apply`, this function invokes `func`\\n * with the `this` binding of `thisArg` and the arguments of `args`.\\n *\\n * @private\\n * @param {Function} func The function to invoke.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {Array} args The arguments to invoke `func` with.\\n * @returns {*} Returns the result of `func`.\\n */\\n function apply(func, thisArg, args) {\\n switch (args.length) {\\n case 0: return func.call(thisArg);\\n case 1: return func.call(thisArg, args[0]);\\n case 2: return func.call(thisArg, args[0], args[1]);\\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\\n }\\n return func.apply(thisArg, args);\\n }\\n\\n /**\\n * A specialized version of `baseAggregator` for arrays.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform keys.\\n * @param {Object} accumulator The initial aggregated object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function arrayAggregator(array, setter, iteratee, accumulator) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n var value = array[index];\\n setter(accumulator, value, iteratee(value), array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.forEach` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayEach(array, iteratee) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (iteratee(array[index], index, array) === false) {\\n break;\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.forEachRight` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayEachRight(array, iteratee) {\\n var length = array == null ? 0 : array.length;\\n\\n while (length--) {\\n if (iteratee(array[length], length, array) === false) {\\n break;\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.every` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`.\\n */\\n function arrayEvery(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (!predicate(array[index], index, array)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * A specialized version of `_.filter` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n */\\n function arrayFilter(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (predicate(value, index, array)) {\\n result[resIndex++] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.includes` for arrays without support for\\n * specifying an index to search from.\\n *\\n * @private\\n * @param {Array} [array] The array to inspect.\\n * @param {*} target The value to search for.\\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\\n */\\n function arrayIncludes(array, value) {\\n var length = array == null ? 0 : array.length;\\n return !!length && baseIndexOf(array, value, 0) > -1;\\n }\\n\\n /**\\n * This function is like `arrayIncludes` except that it accepts a comparator.\\n *\\n * @private\\n * @param {Array} [array] The array to inspect.\\n * @param {*} target The value to search for.\\n * @param {Function} comparator The comparator invoked per element.\\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\\n */\\n function arrayIncludesWith(array, value, comparator) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (comparator(value, array[index])) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * A specialized version of `_.map` for arrays without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n */\\n function arrayMap(array, iteratee) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n result = Array(length);\\n\\n while (++index < length) {\\n result[index] = iteratee(array[index], index, array);\\n }\\n return result;\\n }\\n\\n /**\\n * Appends the elements of `values` to `array`.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to append.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayPush(array, values) {\\n var index = -1,\\n length = values.length,\\n offset = array.length;\\n\\n while (++index < length) {\\n array[offset + index] = values[index];\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.reduce` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @param {boolean} [initAccum] Specify using the first element of `array` as\\n * the initial value.\\n * @returns {*} Returns the accumulated value.\\n */\\n function arrayReduce(array, iteratee, accumulator, initAccum) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n if (initAccum && length) {\\n accumulator = array[++index];\\n }\\n while (++index < length) {\\n accumulator = iteratee(accumulator, array[index], index, array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.reduceRight` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @param {boolean} [initAccum] Specify using the last element of `array` as\\n * the initial value.\\n * @returns {*} Returns the accumulated value.\\n */\\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\\n var length = array == null ? 0 : array.length;\\n if (initAccum && length) {\\n accumulator = array[--length];\\n }\\n while (length--) {\\n accumulator = iteratee(accumulator, array[length], length, array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.some` for arrays without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n */\\n function arraySome(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (predicate(array[index], index, array)) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * Gets the size of an ASCII `string`.\\n *\\n * @private\\n * @param {string} string The string inspect.\\n * @returns {number} Returns the string size.\\n */\\n var asciiSize = baseProperty('length');\\n\\n /**\\n * Converts an ASCII `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function asciiToArray(string) {\\n return string.split('');\\n }\\n\\n /**\\n * Splits an ASCII `string` into an array of its words.\\n *\\n * @private\\n * @param {string} The string to inspect.\\n * @returns {Array} Returns the words of `string`.\\n */\\n function asciiWords(string) {\\n return string.match(reAsciiWord) || [];\\n }\\n\\n /**\\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\\n * without support for iteratee shorthands, which iterates over `collection`\\n * using `eachFunc`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {Function} eachFunc The function to iterate over `collection`.\\n * @returns {*} Returns the found element or its key, else `undefined`.\\n */\\n function baseFindKey(collection, predicate, eachFunc) {\\n var result;\\n eachFunc(collection, function(value, key, collection) {\\n if (predicate(value, key, collection)) {\\n result = key;\\n return false;\\n }\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\\n * support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {number} fromIndex The index to search from.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\\n var length = array.length,\\n index = fromIndex + (fromRight ? 1 : -1);\\n\\n while ((fromRight ? index-- : ++index < length)) {\\n if (predicate(array[index], index, array)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseIndexOf(array, value, fromIndex) {\\n return value === value\\n ? strictIndexOf(array, value, fromIndex)\\n : baseFindIndex(array, baseIsNaN, fromIndex);\\n }\\n\\n /**\\n * This function is like `baseIndexOf` except that it accepts a comparator.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @param {Function} comparator The comparator invoked per element.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseIndexOfWith(array, value, fromIndex, comparator) {\\n var index = fromIndex - 1,\\n length = array.length;\\n\\n while (++index < length) {\\n if (comparator(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * The base implementation of `_.isNaN` without support for number objects.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\\n */\\n function baseIsNaN(value) {\\n return value !== value;\\n }\\n\\n /**\\n * The base implementation of `_.mean` and `_.meanBy` without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {number} Returns the mean.\\n */\\n function baseMean(array, iteratee) {\\n var length = array == null ? 0 : array.length;\\n return length ? (baseSum(array, iteratee) / length) : NAN;\\n }\\n\\n /**\\n * The base implementation of `_.property` without support for deep paths.\\n *\\n * @private\\n * @param {string} key The key of the property to get.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function baseProperty(key) {\\n return function(object) {\\n return object == null ? undefined : object[key];\\n };\\n }\\n\\n /**\\n * The base implementation of `_.propertyOf` without support for deep paths.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function basePropertyOf(object) {\\n return function(key) {\\n return object == null ? undefined : object[key];\\n };\\n }\\n\\n /**\\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} accumulator The initial value.\\n * @param {boolean} initAccum Specify using the first or last element of\\n * `collection` as the initial value.\\n * @param {Function} eachFunc The function to iterate over `collection`.\\n * @returns {*} Returns the accumulated value.\\n */\\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\\n eachFunc(collection, function(value, index, collection) {\\n accumulator = initAccum\\n ? (initAccum = false, value)\\n : iteratee(accumulator, value, index, collection);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.sortBy` which uses `comparer` to define the\\n * sort order of `array` and replaces criteria objects with their corresponding\\n * values.\\n *\\n * @private\\n * @param {Array} array The array to sort.\\n * @param {Function} comparer The function to define sort order.\\n * @returns {Array} Returns `array`.\\n */\\n function baseSortBy(array, comparer) {\\n var length = array.length;\\n\\n array.sort(comparer);\\n while (length--) {\\n array[length] = array[length].value;\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.sum` and `_.sumBy` without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {number} Returns the sum.\\n */\\n function baseSum(array, iteratee) {\\n var result,\\n index = -1,\\n length = array.length;\\n\\n while (++index < length) {\\n var current = iteratee(array[index]);\\n if (current !== undefined) {\\n result = result === undefined ? current : (result + current);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.times` without support for iteratee shorthands\\n * or max array length checks.\\n *\\n * @private\\n * @param {number} n The number of times to invoke `iteratee`.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the array of results.\\n */\\n function baseTimes(n, iteratee) {\\n var index = -1,\\n result = Array(n);\\n\\n while (++index < n) {\\n result[index] = iteratee(index);\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\\n * of key-value pairs for `object` corresponding to the property names of `props`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} props The property names to get values for.\\n * @returns {Object} Returns the key-value pairs.\\n */\\n function baseToPairs(object, props) {\\n return arrayMap(props, function(key) {\\n return [key, object[key]];\\n });\\n }\\n\\n /**\\n * The base implementation of `_.unary` without support for storing metadata.\\n *\\n * @private\\n * @param {Function} func The function to cap arguments for.\\n * @returns {Function} Returns the new capped function.\\n */\\n function baseUnary(func) {\\n return function(value) {\\n return func(value);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.values` and `_.valuesIn` which creates an\\n * array of `object` property values corresponding to the property names\\n * of `props`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} props The property names to get values for.\\n * @returns {Object} Returns the array of property values.\\n */\\n function baseValues(object, props) {\\n return arrayMap(props, function(key) {\\n return object[key];\\n });\\n }\\n\\n /**\\n * Checks if a `cache` value for `key` exists.\\n *\\n * @private\\n * @param {Object} cache The cache to query.\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function cacheHas(cache, key) {\\n return cache.has(key);\\n }\\n\\n /**\\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\\n * that is not found in the character symbols.\\n *\\n * @private\\n * @param {Array} strSymbols The string symbols to inspect.\\n * @param {Array} chrSymbols The character symbols to find.\\n * @returns {number} Returns the index of the first unmatched string symbol.\\n */\\n function charsStartIndex(strSymbols, chrSymbols) {\\n var index = -1,\\n length = strSymbols.length;\\n\\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\\n return index;\\n }\\n\\n /**\\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\\n * that is not found in the character symbols.\\n *\\n * @private\\n * @param {Array} strSymbols The string symbols to inspect.\\n * @param {Array} chrSymbols The character symbols to find.\\n * @returns {number} Returns the index of the last unmatched string symbol.\\n */\\n function charsEndIndex(strSymbols, chrSymbols) {\\n var index = strSymbols.length;\\n\\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\\n return index;\\n }\\n\\n /**\\n * Gets the number of `placeholder` occurrences in `array`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} placeholder The placeholder to search for.\\n * @returns {number} Returns the placeholder count.\\n */\\n function countHolders(array, placeholder) {\\n var length = array.length,\\n result = 0;\\n\\n while (length--) {\\n if (array[length] === placeholder) {\\n ++result;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\\n * letters to basic Latin letters.\\n *\\n * @private\\n * @param {string} letter The matched letter to deburr.\\n * @returns {string} Returns the deburred letter.\\n */\\n var deburrLetter = basePropertyOf(deburredLetters);\\n\\n /**\\n * Used by `_.escape` to convert characters to HTML entities.\\n *\\n * @private\\n * @param {string} chr The matched character to escape.\\n * @returns {string} Returns the escaped character.\\n */\\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\\n\\n /**\\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\\n *\\n * @private\\n * @param {string} chr The matched character to escape.\\n * @returns {string} Returns the escaped character.\\n */\\n function escapeStringChar(chr) {\\n return '\\\\\\\\' + stringEscapes[chr];\\n }\\n\\n /**\\n * Gets the value at `key` of `object`.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {string} key The key of the property to get.\\n * @returns {*} Returns the property value.\\n */\\n function getValue(object, key) {\\n return object == null ? undefined : object[key];\\n }\\n\\n /**\\n * Checks if `string` contains Unicode symbols.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\\n */\\n function hasUnicode(string) {\\n return reHasUnicode.test(string);\\n }\\n\\n /**\\n * Checks if `string` contains a word composed of Unicode symbols.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {boolean} Returns `true` if a word is found, else `false`.\\n */\\n function hasUnicodeWord(string) {\\n return reHasUnicodeWord.test(string);\\n }\\n\\n /**\\n * Converts `iterator` to an array.\\n *\\n * @private\\n * @param {Object} iterator The iterator to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function iteratorToArray(iterator) {\\n var data,\\n result = [];\\n\\n while (!(data = iterator.next()).done) {\\n result.push(data.value);\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `map` to its key-value pairs.\\n *\\n * @private\\n * @param {Object} map The map to convert.\\n * @returns {Array} Returns the key-value pairs.\\n */\\n function mapToArray(map) {\\n var index = -1,\\n result = Array(map.size);\\n\\n map.forEach(function(value, key) {\\n result[++index] = [key, value];\\n });\\n return result;\\n }\\n\\n /**\\n * Creates a unary function that invokes `func` with its argument transformed.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {Function} transform The argument transform.\\n * @returns {Function} Returns the new function.\\n */\\n function overArg(func, transform) {\\n return function(arg) {\\n return func(transform(arg));\\n };\\n }\\n\\n /**\\n * Replaces all `placeholder` elements in `array` with an internal placeholder\\n * and returns an array of their indexes.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {*} placeholder The placeholder to replace.\\n * @returns {Array} Returns the new array of placeholder indexes.\\n */\\n function replaceHolders(array, placeholder) {\\n var index = -1,\\n length = array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (value === placeholder || value === PLACEHOLDER) {\\n array[index] = PLACEHOLDER;\\n result[resIndex++] = index;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `set` to an array of its values.\\n *\\n * @private\\n * @param {Object} set The set to convert.\\n * @returns {Array} Returns the values.\\n */\\n function setToArray(set) {\\n var index = -1,\\n result = Array(set.size);\\n\\n set.forEach(function(value) {\\n result[++index] = value;\\n });\\n return result;\\n }\\n\\n /**\\n * Converts `set` to its value-value pairs.\\n *\\n * @private\\n * @param {Object} set The set to convert.\\n * @returns {Array} Returns the value-value pairs.\\n */\\n function setToPairs(set) {\\n var index = -1,\\n result = Array(set.size);\\n\\n set.forEach(function(value) {\\n result[++index] = [value, value];\\n });\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.indexOf` which performs strict equality\\n * comparisons of values, i.e. `===`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function strictIndexOf(array, value, fromIndex) {\\n var index = fromIndex - 1,\\n length = array.length;\\n\\n while (++index < length) {\\n if (array[index] === value) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * A specialized version of `_.lastIndexOf` which performs strict equality\\n * comparisons of values, i.e. `===`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function strictLastIndexOf(array, value, fromIndex) {\\n var index = fromIndex + 1;\\n while (index--) {\\n if (array[index] === value) {\\n return index;\\n }\\n }\\n return index;\\n }\\n\\n /**\\n * Gets the number of symbols in `string`.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {number} Returns the string size.\\n */\\n function stringSize(string) {\\n return hasUnicode(string)\\n ? unicodeSize(string)\\n : asciiSize(string);\\n }\\n\\n /**\\n * Converts `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function stringToArray(string) {\\n return hasUnicode(string)\\n ? unicodeToArray(string)\\n : asciiToArray(string);\\n }\\n\\n /**\\n * Used by `_.unescape` to convert HTML entities to characters.\\n *\\n * @private\\n * @param {string} chr The matched character to unescape.\\n * @returns {string} Returns the unescaped character.\\n */\\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\\n\\n /**\\n * Gets the size of a Unicode `string`.\\n *\\n * @private\\n * @param {string} string The string inspect.\\n * @returns {number} Returns the string size.\\n */\\n function unicodeSize(string) {\\n var result = reUnicode.lastIndex = 0;\\n while (reUnicode.test(string)) {\\n ++result;\\n }\\n return result;\\n }\\n\\n /**\\n * Converts a Unicode `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function unicodeToArray(string) {\\n return string.match(reUnicode) || [];\\n }\\n\\n /**\\n * Splits a Unicode `string` into an array of its words.\\n *\\n * @private\\n * @param {string} The string to inspect.\\n * @returns {Array} Returns the words of `string`.\\n */\\n function unicodeWords(string) {\\n return string.match(reUnicodeWord) || [];\\n }\\n\\n /*--------------------------------------------------------------------------*/\\n\\n /**\\n * Create a new pristine `lodash` function using the `context` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Util\\n * @param {Object} [context=root] The context object.\\n * @returns {Function} Returns a new `lodash` function.\\n * @example\\n *\\n * _.mixin({ 'foo': _.constant('foo') });\\n *\\n * var lodash = _.runInContext();\\n * lodash.mixin({ 'bar': lodash.constant('bar') });\\n *\\n * _.isFunction(_.foo);\\n * // => true\\n * _.isFunction(_.bar);\\n * // => false\\n *\\n * lodash.isFunction(lodash.foo);\\n * // => false\\n * lodash.isFunction(lodash.bar);\\n * // => true\\n *\\n * // Create a suped-up `defer` in Node.js.\\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\\n */\\n var runInContext = (function runInContext(context) {\\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\\n\\n /** Built-in constructor references. */\\n var Array = context.Array,\\n Date = context.Date,\\n Error = context.Error,\\n Function = context.Function,\\n Math = context.Math,\\n Object = context.Object,\\n RegExp = context.RegExp,\\n String = context.String,\\n TypeError = context.TypeError;\\n\\n /** Used for built-in method references. */\\n var arrayProto = Array.prototype,\\n funcProto = Function.prototype,\\n objectProto = Object.prototype;\\n\\n /** Used to detect overreaching core-js shims. */\\n var coreJsData = context['__core-js_shared__'];\\n\\n /** Used to resolve the decompiled source of functions. */\\n var funcToString = funcProto.toString;\\n\\n /** Used to check objects for own properties. */\\n var hasOwnProperty = objectProto.hasOwnProperty;\\n\\n /** Used to generate unique IDs. */\\n var idCounter = 0;\\n\\n /** Used to detect methods masquerading as native. */\\n var maskSrcKey = (function() {\\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\\n return uid ? ('Symbol(src)_1.' + uid) : '';\\n }());\\n\\n /**\\n * Used to resolve the\\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\\n * of values.\\n */\\n var nativeObjectToString = objectProto.toString;\\n\\n /** Used to infer the `Object` constructor. */\\n var objectCtorString = funcToString.call(Object);\\n\\n /** Used to restore the original `_` reference in `_.noConflict`. */\\n var oldDash = root._;\\n\\n /** Used to detect if a method is native. */\\n var reIsNative = RegExp('^' +\\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\\\\\$&')\\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\\\\\\\()| for .+?(?=\\\\\\\\\\\\])/g, '$1.*?') + '$'\\n );\\n\\n /** Built-in value references. */\\n var Buffer = moduleExports ? context.Buffer : undefined,\\n Symbol = context.Symbol,\\n Uint8Array = context.Uint8Array,\\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\\n getPrototype = overArg(Object.getPrototypeOf, Object),\\n objectCreate = Object.create,\\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\\n splice = arrayProto.splice,\\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\\n symIterator = Symbol ? Symbol.iterator : undefined,\\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\\n\\n var defineProperty = (function() {\\n try {\\n var func = getNative(Object, 'defineProperty');\\n func({}, '', {});\\n return func;\\n } catch (e) {}\\n }());\\n\\n /** Mocked built-ins. */\\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\\n\\n /* Built-in method references for those with the same name as other `lodash` methods. */\\n var nativeCeil = Math.ceil,\\n nativeFloor = Math.floor,\\n nativeGetSymbols = Object.getOwnPropertySymbols,\\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\\n nativeIsFinite = context.isFinite,\\n nativeJoin = arrayProto.join,\\n nativeKeys = overArg(Object.keys, Object),\\n nativeMax = Math.max,\\n nativeMin = Math.min,\\n nativeNow = Date.now,\\n nativeParseInt = context.parseInt,\\n nativeRandom = Math.random,\\n nativeReverse = arrayProto.reverse;\\n\\n /* Built-in method references that are verified to be native. */\\n var DataView = getNative(context, 'DataView'),\\n Map = getNative(context, 'Map'),\\n Promise = getNative(context, 'Promise'),\\n Set = getNative(context, 'Set'),\\n WeakMap = getNative(context, 'WeakMap'),\\n nativeCreate = getNative(Object, 'create');\\n\\n /** Used to store function metadata. */\\n var metaMap = WeakMap && new WeakMap;\\n\\n /** Used to lookup unminified function names. */\\n var realNames = {};\\n\\n /** Used to detect maps, sets, and weakmaps. */\\n var dataViewCtorString = toSource(DataView),\\n mapCtorString = toSource(Map),\\n promiseCtorString = toSource(Promise),\\n setCtorString = toSource(Set),\\n weakMapCtorString = toSource(WeakMap);\\n\\n /** Used to convert symbols to primitives and strings. */\\n var symbolProto = Symbol ? Symbol.prototype : undefined,\\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\\n symbolToString = symbolProto ? symbolProto.toString : undefined;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a `lodash` object which wraps `value` to enable implicit method\\n * chain sequences. Methods that operate on and return arrays, collections,\\n * and functions can be chained together. Methods that retrieve a single value\\n * or may return a primitive value will automatically end the chain sequence\\n * and return the unwrapped value. Otherwise, the value must be unwrapped\\n * with `_#value`.\\n *\\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\\n * enabled using `_.chain`.\\n *\\n * The execution of chained methods is lazy, that is, it's deferred until\\n * `_#value` is implicitly or explicitly called.\\n *\\n * Lazy evaluation allows several methods to support shortcut fusion.\\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\\n * the creation of intermediate arrays and can greatly reduce the number of\\n * iteratee executions. Sections of a chain sequence qualify for shortcut\\n * fusion if the section is applied to an array and iteratees accept only\\n * one argument. The heuristic for whether a section qualifies for shortcut\\n * fusion is subject to change.\\n *\\n * Chaining is supported in custom builds as long as the `_#value` method is\\n * directly or indirectly included in the build.\\n *\\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\\n *\\n * The wrapper `Array` methods are:\\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\\n *\\n * The wrapper `String` methods are:\\n * `replace` and `split`\\n *\\n * The wrapper methods that support shortcut fusion are:\\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\\n *\\n * The chainable wrapper methods are:\\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\\n * `zipObject`, `zipObjectDeep`, and `zipWith`\\n *\\n * The wrapper methods that are **not** chainable by default are:\\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\\n * `upperFirst`, `value`, and `words`\\n *\\n * @name _\\n * @constructor\\n * @category Seq\\n * @param {*} value The value to wrap in a `lodash` instance.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var wrapped = _([1, 2, 3]);\\n *\\n * // Returns an unwrapped value.\\n * wrapped.reduce(_.add);\\n * // => 6\\n *\\n * // Returns a wrapped value.\\n * var squares = wrapped.map(square);\\n *\\n * _.isArray(squares);\\n * // => false\\n *\\n * _.isArray(squares.value());\\n * // => true\\n */\\n function lodash(value) {\\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\\n if (value instanceof LodashWrapper) {\\n return value;\\n }\\n if (hasOwnProperty.call(value, '__wrapped__')) {\\n return wrapperClone(value);\\n }\\n }\\n return new LodashWrapper(value);\\n }\\n\\n /**\\n * The base implementation of `_.create` without support for assigning\\n * properties to the created object.\\n *\\n * @private\\n * @param {Object} proto The object to inherit from.\\n * @returns {Object} Returns the new object.\\n */\\n var baseCreate = (function() {\\n function object() {}\\n return function(proto) {\\n if (!isObject(proto)) {\\n return {};\\n }\\n if (objectCreate) {\\n return objectCreate(proto);\\n }\\n object.prototype = proto;\\n var result = new object;\\n object.prototype = undefined;\\n return result;\\n };\\n }());\\n\\n /**\\n * The function whose prototype chain sequence wrappers inherit from.\\n *\\n * @private\\n */\\n function baseLodash() {\\n // No operation performed.\\n }\\n\\n /**\\n * The base constructor for creating `lodash` wrapper objects.\\n *\\n * @private\\n * @param {*} value The value to wrap.\\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\\n */\\n function LodashWrapper(value, chainAll) {\\n this.__wrapped__ = value;\\n this.__actions__ = [];\\n this.__chain__ = !!chainAll;\\n this.__index__ = 0;\\n this.__values__ = undefined;\\n }\\n\\n /**\\n * By default, the template delimiters used by lodash are like those in\\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\\n * following template settings to use alternative delimiters.\\n *\\n * @static\\n * @memberOf _\\n * @type {Object}\\n */\\n lodash.templateSettings = {\\n\\n /**\\n * Used to detect `data` property values to be HTML-escaped.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'escape': reEscape,\\n\\n /**\\n * Used to detect code to be evaluated.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'evaluate': reEvaluate,\\n\\n /**\\n * Used to detect `data` property values to inject.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'interpolate': reInterpolate,\\n\\n /**\\n * Used to reference the data object in the template text.\\n *\\n * @memberOf _.templateSettings\\n * @type {string}\\n */\\n 'variable': '',\\n\\n /**\\n * Used to import variables into the compiled template.\\n *\\n * @memberOf _.templateSettings\\n * @type {Object}\\n */\\n 'imports': {\\n\\n /**\\n * A reference to the `lodash` function.\\n *\\n * @memberOf _.templateSettings.imports\\n * @type {Function}\\n */\\n '_': lodash\\n }\\n };\\n\\n // Ensure wrappers are instances of `baseLodash`.\\n lodash.prototype = baseLodash.prototype;\\n lodash.prototype.constructor = lodash;\\n\\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\\n LodashWrapper.prototype.constructor = LodashWrapper;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\\n *\\n * @private\\n * @constructor\\n * @param {*} value The value to wrap.\\n */\\n function LazyWrapper(value) {\\n this.__wrapped__ = value;\\n this.__actions__ = [];\\n this.__dir__ = 1;\\n this.__filtered__ = false;\\n this.__iteratees__ = [];\\n this.__takeCount__ = MAX_ARRAY_LENGTH;\\n this.__views__ = [];\\n }\\n\\n /**\\n * Creates a clone of the lazy wrapper object.\\n *\\n * @private\\n * @name clone\\n * @memberOf LazyWrapper\\n * @returns {Object} Returns the cloned `LazyWrapper` object.\\n */\\n function lazyClone() {\\n var result = new LazyWrapper(this.__wrapped__);\\n result.__actions__ = copyArray(this.__actions__);\\n result.__dir__ = this.__dir__;\\n result.__filtered__ = this.__filtered__;\\n result.__iteratees__ = copyArray(this.__iteratees__);\\n result.__takeCount__ = this.__takeCount__;\\n result.__views__ = copyArray(this.__views__);\\n return result;\\n }\\n\\n /**\\n * Reverses the direction of lazy iteration.\\n *\\n * @private\\n * @name reverse\\n * @memberOf LazyWrapper\\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\\n */\\n function lazyReverse() {\\n if (this.__filtered__) {\\n var result = new LazyWrapper(this);\\n result.__dir__ = -1;\\n result.__filtered__ = true;\\n } else {\\n result = this.clone();\\n result.__dir__ *= -1;\\n }\\n return result;\\n }\\n\\n /**\\n * Extracts the unwrapped value from its lazy wrapper.\\n *\\n * @private\\n * @name value\\n * @memberOf LazyWrapper\\n * @returns {*} Returns the unwrapped value.\\n */\\n function lazyValue() {\\n var array = this.__wrapped__.value(),\\n dir = this.__dir__,\\n isArr = isArray(array),\\n isRight = dir < 0,\\n arrLength = isArr ? array.length : 0,\\n view = getView(0, arrLength, this.__views__),\\n start = view.start,\\n end = view.end,\\n length = end - start,\\n index = isRight ? end : (start - 1),\\n iteratees = this.__iteratees__,\\n iterLength = iteratees.length,\\n resIndex = 0,\\n takeCount = nativeMin(length, this.__takeCount__);\\n\\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\\n return baseWrapperValue(array, this.__actions__);\\n }\\n var result = [];\\n\\n outer:\\n while (length-- && resIndex < takeCount) {\\n index += dir;\\n\\n var iterIndex = -1,\\n value = array[index];\\n\\n while (++iterIndex < iterLength) {\\n var data = iteratees[iterIndex],\\n iteratee = data.iteratee,\\n type = data.type,\\n computed = iteratee(value);\\n\\n if (type == LAZY_MAP_FLAG) {\\n value = computed;\\n } else if (!computed) {\\n if (type == LAZY_FILTER_FLAG) {\\n continue outer;\\n } else {\\n break outer;\\n }\\n }\\n }\\n result[resIndex++] = value;\\n }\\n return result;\\n }\\n\\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\\n LazyWrapper.prototype.constructor = LazyWrapper;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a hash object.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function Hash(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the hash.\\n *\\n * @private\\n * @name clear\\n * @memberOf Hash\\n */\\n function hashClear() {\\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the hash.\\n *\\n * @private\\n * @name delete\\n * @memberOf Hash\\n * @param {Object} hash The hash to modify.\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function hashDelete(key) {\\n var result = this.has(key) && delete this.__data__[key];\\n this.size -= result ? 1 : 0;\\n return result;\\n }\\n\\n /**\\n * Gets the hash value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf Hash\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function hashGet(key) {\\n var data = this.__data__;\\n if (nativeCreate) {\\n var result = data[key];\\n return result === HASH_UNDEFINED ? undefined : result;\\n }\\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\\n }\\n\\n /**\\n * Checks if a hash value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf Hash\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function hashHas(key) {\\n var data = this.__data__;\\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\\n }\\n\\n /**\\n * Sets the hash `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf Hash\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the hash instance.\\n */\\n function hashSet(key, value) {\\n var data = this.__data__;\\n this.size += this.has(key) ? 0 : 1;\\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\\n return this;\\n }\\n\\n // Add methods to `Hash`.\\n Hash.prototype.clear = hashClear;\\n Hash.prototype['delete'] = hashDelete;\\n Hash.prototype.get = hashGet;\\n Hash.prototype.has = hashHas;\\n Hash.prototype.set = hashSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an list cache object.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function ListCache(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the list cache.\\n *\\n * @private\\n * @name clear\\n * @memberOf ListCache\\n */\\n function listCacheClear() {\\n this.__data__ = [];\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the list cache.\\n *\\n * @private\\n * @name delete\\n * @memberOf ListCache\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function listCacheDelete(key) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n if (index < 0) {\\n return false;\\n }\\n var lastIndex = data.length - 1;\\n if (index == lastIndex) {\\n data.pop();\\n } else {\\n splice.call(data, index, 1);\\n }\\n --this.size;\\n return true;\\n }\\n\\n /**\\n * Gets the list cache value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf ListCache\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function listCacheGet(key) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n return index < 0 ? undefined : data[index][1];\\n }\\n\\n /**\\n * Checks if a list cache value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf ListCache\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function listCacheHas(key) {\\n return assocIndexOf(this.__data__, key) > -1;\\n }\\n\\n /**\\n * Sets the list cache `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf ListCache\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the list cache instance.\\n */\\n function listCacheSet(key, value) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n if (index < 0) {\\n ++this.size;\\n data.push([key, value]);\\n } else {\\n data[index][1] = value;\\n }\\n return this;\\n }\\n\\n // Add methods to `ListCache`.\\n ListCache.prototype.clear = listCacheClear;\\n ListCache.prototype['delete'] = listCacheDelete;\\n ListCache.prototype.get = listCacheGet;\\n ListCache.prototype.has = listCacheHas;\\n ListCache.prototype.set = listCacheSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a map cache object to store key-value pairs.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function MapCache(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the map.\\n *\\n * @private\\n * @name clear\\n * @memberOf MapCache\\n */\\n function mapCacheClear() {\\n this.size = 0;\\n this.__data__ = {\\n 'hash': new Hash,\\n 'map': new (Map || ListCache),\\n 'string': new Hash\\n };\\n }\\n\\n /**\\n * Removes `key` and its value from the map.\\n *\\n * @private\\n * @name delete\\n * @memberOf MapCache\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function mapCacheDelete(key) {\\n var result = getMapData(this, key)['delete'](key);\\n this.size -= result ? 1 : 0;\\n return result;\\n }\\n\\n /**\\n * Gets the map value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf MapCache\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function mapCacheGet(key) {\\n return getMapData(this, key).get(key);\\n }\\n\\n /**\\n * Checks if a map value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf MapCache\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function mapCacheHas(key) {\\n return getMapData(this, key).has(key);\\n }\\n\\n /**\\n * Sets the map `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf MapCache\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the map cache instance.\\n */\\n function mapCacheSet(key, value) {\\n var data = getMapData(this, key),\\n size = data.size;\\n\\n data.set(key, value);\\n this.size += data.size == size ? 0 : 1;\\n return this;\\n }\\n\\n // Add methods to `MapCache`.\\n MapCache.prototype.clear = mapCacheClear;\\n MapCache.prototype['delete'] = mapCacheDelete;\\n MapCache.prototype.get = mapCacheGet;\\n MapCache.prototype.has = mapCacheHas;\\n MapCache.prototype.set = mapCacheSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n *\\n * Creates an array cache object to store unique values.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [values] The values to cache.\\n */\\n function SetCache(values) {\\n var index = -1,\\n length = values == null ? 0 : values.length;\\n\\n this.__data__ = new MapCache;\\n while (++index < length) {\\n this.add(values[index]);\\n }\\n }\\n\\n /**\\n * Adds `value` to the array cache.\\n *\\n * @private\\n * @name add\\n * @memberOf SetCache\\n * @alias push\\n * @param {*} value The value to cache.\\n * @returns {Object} Returns the cache instance.\\n */\\n function setCacheAdd(value) {\\n this.__data__.set(value, HASH_UNDEFINED);\\n return this;\\n }\\n\\n /**\\n * Checks if `value` is in the array cache.\\n *\\n * @private\\n * @name has\\n * @memberOf SetCache\\n * @param {*} value The value to search for.\\n * @returns {number} Returns `true` if `value` is found, else `false`.\\n */\\n function setCacheHas(value) {\\n return this.__data__.has(value);\\n }\\n\\n // Add methods to `SetCache`.\\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\\n SetCache.prototype.has = setCacheHas;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a stack cache object to store key-value pairs.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function Stack(entries) {\\n var data = this.__data__ = new ListCache(entries);\\n this.size = data.size;\\n }\\n\\n /**\\n * Removes all key-value entries from the stack.\\n *\\n * @private\\n * @name clear\\n * @memberOf Stack\\n */\\n function stackClear() {\\n this.__data__ = new ListCache;\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the stack.\\n *\\n * @private\\n * @name delete\\n * @memberOf Stack\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function stackDelete(key) {\\n var data = this.__data__,\\n result = data['delete'](key);\\n\\n this.size = data.size;\\n return result;\\n }\\n\\n /**\\n * Gets the stack value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf Stack\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function stackGet(key) {\\n return this.__data__.get(key);\\n }\\n\\n /**\\n * Checks if a stack value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf Stack\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function stackHas(key) {\\n return this.__data__.has(key);\\n }\\n\\n /**\\n * Sets the stack `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf Stack\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the stack cache instance.\\n */\\n function stackSet(key, value) {\\n var data = this.__data__;\\n if (data instanceof ListCache) {\\n var pairs = data.__data__;\\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\\n pairs.push([key, value]);\\n this.size = ++data.size;\\n return this;\\n }\\n data = this.__data__ = new MapCache(pairs);\\n }\\n data.set(key, value);\\n this.size = data.size;\\n return this;\\n }\\n\\n // Add methods to `Stack`.\\n Stack.prototype.clear = stackClear;\\n Stack.prototype['delete'] = stackDelete;\\n Stack.prototype.get = stackGet;\\n Stack.prototype.has = stackHas;\\n Stack.prototype.set = stackSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an array of the enumerable property names of the array-like `value`.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @param {boolean} inherited Specify returning inherited property names.\\n * @returns {Array} Returns the array of property names.\\n */\\n function arrayLikeKeys(value, inherited) {\\n var isArr = isArray(value),\\n isArg = !isArr && isArguments(value),\\n isBuff = !isArr && !isArg && isBuffer(value),\\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\\n skipIndexes = isArr || isArg || isBuff || isType,\\n result = skipIndexes ? baseTimes(value.length, String) : [],\\n length = result.length;\\n\\n for (var key in value) {\\n if ((inherited || hasOwnProperty.call(value, key)) &&\\n !(skipIndexes && (\\n // Safari 9 has enumerable `arguments.length` in strict mode.\\n key == 'length' ||\\n // Node.js 0.10 has enumerable non-index properties on buffers.\\n (isBuff && (key == 'offset' || key == 'parent')) ||\\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\\n // Skip index properties.\\n isIndex(key, length)\\n ))) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.sample` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to sample.\\n * @returns {*} Returns the random element.\\n */\\n function arraySample(array) {\\n var length = array.length;\\n return length ? array[baseRandom(0, length - 1)] : undefined;\\n }\\n\\n /**\\n * A specialized version of `_.sampleSize` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to sample.\\n * @param {number} n The number of elements to sample.\\n * @returns {Array} Returns the random elements.\\n */\\n function arraySampleSize(array, n) {\\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\\n }\\n\\n /**\\n * A specialized version of `_.shuffle` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n */\\n function arrayShuffle(array) {\\n return shuffleSelf(copyArray(array));\\n }\\n\\n /**\\n * This function is like `assignValue` except that it doesn't assign\\n * `undefined` values.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function assignMergeValue(object, key, value) {\\n if ((value !== undefined && !eq(object[key], value)) ||\\n (value === undefined && !(key in object))) {\\n baseAssignValue(object, key, value);\\n }\\n }\\n\\n /**\\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function assignValue(object, key, value) {\\n var objValue = object[key];\\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\\n (value === undefined && !(key in object))) {\\n baseAssignValue(object, key, value);\\n }\\n }\\n\\n /**\\n * Gets the index at which the `key` is found in `array` of key-value pairs.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} key The key to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function assocIndexOf(array, key) {\\n var length = array.length;\\n while (length--) {\\n if (eq(array[length][0], key)) {\\n return length;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * Aggregates elements of `collection` on `accumulator` with keys transformed\\n * by `iteratee` and values set by `setter`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform keys.\\n * @param {Object} accumulator The initial aggregated object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function baseAggregator(collection, setter, iteratee, accumulator) {\\n baseEach(collection, function(value, key, collection) {\\n setter(accumulator, value, iteratee(value), collection);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.assign` without support for multiple sources\\n * or `customizer` functions.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @returns {Object} Returns `object`.\\n */\\n function baseAssign(object, source) {\\n return object && copyObject(source, keys(source), object);\\n }\\n\\n /**\\n * The base implementation of `_.assignIn` without support for multiple sources\\n * or `customizer` functions.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @returns {Object} Returns `object`.\\n */\\n function baseAssignIn(object, source) {\\n return object && copyObject(source, keysIn(source), object);\\n }\\n\\n /**\\n * The base implementation of `assignValue` and `assignMergeValue` without\\n * value checks.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function baseAssignValue(object, key, value) {\\n if (key == '__proto__' && defineProperty) {\\n defineProperty(object, key, {\\n 'configurable': true,\\n 'enumerable': true,\\n 'value': value,\\n 'writable': true\\n });\\n } else {\\n object[key] = value;\\n }\\n }\\n\\n /**\\n * The base implementation of `_.at` without support for individual paths.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {string[]} paths The property paths to pick.\\n * @returns {Array} Returns the picked elements.\\n */\\n function baseAt(object, paths) {\\n var index = -1,\\n length = paths.length,\\n result = Array(length),\\n skip = object == null;\\n\\n while (++index < length) {\\n result[index] = skip ? undefined : get(object, paths[index]);\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.clamp` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {number} number The number to clamp.\\n * @param {number} [lower] The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the clamped number.\\n */\\n function baseClamp(number, lower, upper) {\\n if (number === number) {\\n if (upper !== undefined) {\\n number = number <= upper ? number : upper;\\n }\\n if (lower !== undefined) {\\n number = number >= lower ? number : lower;\\n }\\n }\\n return number;\\n }\\n\\n /**\\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\\n * traversed objects.\\n *\\n * @private\\n * @param {*} value The value to clone.\\n * @param {boolean} bitmask The bitmask flags.\\n * 1 - Deep clone\\n * 2 - Flatten inherited properties\\n * 4 - Clone symbols\\n * @param {Function} [customizer] The function to customize cloning.\\n * @param {string} [key] The key of `value`.\\n * @param {Object} [object] The parent object of `value`.\\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\\n * @returns {*} Returns the cloned value.\\n */\\n function baseClone(value, bitmask, customizer, key, object, stack) {\\n var result,\\n isDeep = bitmask & CLONE_DEEP_FLAG,\\n isFlat = bitmask & CLONE_FLAT_FLAG,\\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\\n\\n if (customizer) {\\n result = object ? customizer(value, key, object, stack) : customizer(value);\\n }\\n if (result !== undefined) {\\n return result;\\n }\\n if (!isObject(value)) {\\n return value;\\n }\\n var isArr = isArray(value);\\n if (isArr) {\\n result = initCloneArray(value);\\n if (!isDeep) {\\n return copyArray(value, result);\\n }\\n } else {\\n var tag = getTag(value),\\n isFunc = tag == funcTag || tag == genTag;\\n\\n if (isBuffer(value)) {\\n return cloneBuffer(value, isDeep);\\n }\\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\\n if (!isDeep) {\\n return isFlat\\n ? copySymbolsIn(value, baseAssignIn(result, value))\\n : copySymbols(value, baseAssign(result, value));\\n }\\n } else {\\n if (!cloneableTags[tag]) {\\n return object ? value : {};\\n }\\n result = initCloneByTag(value, tag, baseClone, isDeep);\\n }\\n }\\n // Check for circular references and return its corresponding clone.\\n stack || (stack = new Stack);\\n var stacked = stack.get(value);\\n if (stacked) {\\n return stacked;\\n }\\n stack.set(value, result);\\n\\n var keysFunc = isFull\\n ? (isFlat ? getAllKeysIn : getAllKeys)\\n : (isFlat ? keysIn : keys);\\n\\n var props = isArr ? undefined : keysFunc(value);\\n arrayEach(props || value, function(subValue, key) {\\n if (props) {\\n key = subValue;\\n subValue = value[key];\\n }\\n // Recursively populate clone (susceptible to call stack limits).\\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.conforms` which doesn't clone `source`.\\n *\\n * @private\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseConforms(source) {\\n var props = keys(source);\\n return function(object) {\\n return baseConformsTo(object, source, props);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.conformsTo` which accepts `props` to check.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\\n */\\n function baseConformsTo(object, source, props) {\\n var length = props.length;\\n if (object == null) {\\n return !length;\\n }\\n object = Object(object);\\n while (length--) {\\n var key = props[length],\\n predicate = source[key],\\n value = object[key];\\n\\n if ((value === undefined && !(key in object)) || !predicate(value)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\\n * to provide to `func`.\\n *\\n * @private\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @param {Array} args The arguments to provide to `func`.\\n * @returns {number|Object} Returns the timer id or timeout object.\\n */\\n function baseDelay(func, wait, args) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n return setTimeout(function() { func.apply(undefined, args); }, wait);\\n }\\n\\n /**\\n * The base implementation of methods like `_.difference` without support\\n * for excluding multiple arrays or iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Array} values The values to exclude.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n */\\n function baseDifference(array, values, iteratee, comparator) {\\n var index = -1,\\n includes = arrayIncludes,\\n isCommon = true,\\n length = array.length,\\n result = [],\\n valuesLength = values.length;\\n\\n if (!length) {\\n return result;\\n }\\n if (iteratee) {\\n values = arrayMap(values, baseUnary(iteratee));\\n }\\n if (comparator) {\\n includes = arrayIncludesWith;\\n isCommon = false;\\n }\\n else if (values.length >= LARGE_ARRAY_SIZE) {\\n includes = cacheHas;\\n isCommon = false;\\n values = new SetCache(values);\\n }\\n outer:\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee == null ? value : iteratee(value);\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (isCommon && computed === computed) {\\n var valuesIndex = valuesLength;\\n while (valuesIndex--) {\\n if (values[valuesIndex] === computed) {\\n continue outer;\\n }\\n }\\n result.push(value);\\n }\\n else if (!includes(values, computed, comparator)) {\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.forEach` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n */\\n var baseEach = createBaseEach(baseForOwn);\\n\\n /**\\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n */\\n var baseEachRight = createBaseEach(baseForOwnRight, true);\\n\\n /**\\n * The base implementation of `_.every` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`\\n */\\n function baseEvery(collection, predicate) {\\n var result = true;\\n baseEach(collection, function(value, index, collection) {\\n result = !!predicate(value, index, collection);\\n return result;\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of methods like `_.max` and `_.min` which accepts a\\n * `comparator` to determine the extremum value.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The iteratee invoked per iteration.\\n * @param {Function} comparator The comparator used to compare values.\\n * @returns {*} Returns the extremum value.\\n */\\n function baseExtremum(array, iteratee, comparator) {\\n var index = -1,\\n length = array.length;\\n\\n while (++index < length) {\\n var value = array[index],\\n current = iteratee(value);\\n\\n if (current != null && (computed === undefined\\n ? (current === current && !isSymbol(current))\\n : comparator(current, computed)\\n )) {\\n var computed = current,\\n result = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.fill` without an iteratee call guard.\\n *\\n * @private\\n * @param {Array} array The array to fill.\\n * @param {*} value The value to fill `array` with.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns `array`.\\n */\\n function baseFill(array, value, start, end) {\\n var length = array.length;\\n\\n start = toInteger(start);\\n if (start < 0) {\\n start = -start > length ? 0 : (length + start);\\n }\\n end = (end === undefined || end > length) ? length : toInteger(end);\\n if (end < 0) {\\n end += length;\\n }\\n end = start > end ? 0 : toLength(end);\\n while (start < end) {\\n array[start++] = value;\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.filter` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n */\\n function baseFilter(collection, predicate) {\\n var result = [];\\n baseEach(collection, function(value, index, collection) {\\n if (predicate(value, index, collection)) {\\n result.push(value);\\n }\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.flatten` with support for restricting flattening.\\n *\\n * @private\\n * @param {Array} array The array to flatten.\\n * @param {number} depth The maximum recursion depth.\\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\\n * @param {Array} [result=[]] The initial result value.\\n * @returns {Array} Returns the new flattened array.\\n */\\n function baseFlatten(array, depth, predicate, isStrict, result) {\\n var index = -1,\\n length = array.length;\\n\\n predicate || (predicate = isFlattenable);\\n result || (result = []);\\n\\n while (++index < length) {\\n var value = array[index];\\n if (depth > 0 && predicate(value)) {\\n if (depth > 1) {\\n // Recursively flatten arrays (susceptible to call stack limits).\\n baseFlatten(value, depth - 1, predicate, isStrict, result);\\n } else {\\n arrayPush(result, value);\\n }\\n } else if (!isStrict) {\\n result[result.length] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `baseForOwn` which iterates over `object`\\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @returns {Object} Returns `object`.\\n */\\n var baseFor = createBaseFor();\\n\\n /**\\n * This function is like `baseFor` except that it iterates over properties\\n * in the opposite order.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @returns {Object} Returns `object`.\\n */\\n var baseForRight = createBaseFor(true);\\n\\n /**\\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n */\\n function baseForOwn(object, iteratee) {\\n return object && baseFor(object, iteratee, keys);\\n }\\n\\n /**\\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n */\\n function baseForOwnRight(object, iteratee) {\\n return object && baseForRight(object, iteratee, keys);\\n }\\n\\n /**\\n * The base implementation of `_.functions` which creates an array of\\n * `object` function property names filtered from `props`.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Array} props The property names to filter.\\n * @returns {Array} Returns the function names.\\n */\\n function baseFunctions(object, props) {\\n return arrayFilter(props, function(key) {\\n return isFunction(object[key]);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.get` without support for default values.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to get.\\n * @returns {*} Returns the resolved value.\\n */\\n function baseGet(object, path) {\\n path = castPath(path, object);\\n\\n var index = 0,\\n length = path.length;\\n\\n while (object != null && index < length) {\\n object = object[toKey(path[index++])];\\n }\\n return (index && index == length) ? object : undefined;\\n }\\n\\n /**\\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\\n * symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\\n var result = keysFunc(object);\\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\\n }\\n\\n /**\\n * The base implementation of `getTag` without fallbacks for buggy environments.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the `toStringTag`.\\n */\\n function baseGetTag(value) {\\n if (value == null) {\\n return value === undefined ? undefinedTag : nullTag;\\n }\\n return (symToStringTag && symToStringTag in Object(value))\\n ? getRawTag(value)\\n : objectToString(value);\\n }\\n\\n /**\\n * The base implementation of `_.gt` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\\n * else `false`.\\n */\\n function baseGt(value, other) {\\n return value > other;\\n }\\n\\n /**\\n * The base implementation of `_.has` without support for deep paths.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {Array|string} key The key to check.\\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\\n */\\n function baseHas(object, key) {\\n return object != null && hasOwnProperty.call(object, key);\\n }\\n\\n /**\\n * The base implementation of `_.hasIn` without support for deep paths.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {Array|string} key The key to check.\\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\\n */\\n function baseHasIn(object, key) {\\n return object != null && key in Object(object);\\n }\\n\\n /**\\n * The base implementation of `_.inRange` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {number} number The number to check.\\n * @param {number} start The start of the range.\\n * @param {number} end The end of the range.\\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\\n */\\n function baseInRange(number, start, end) {\\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\\n }\\n\\n /**\\n * The base implementation of methods like `_.intersection`, without support\\n * for iteratee shorthands, that accepts an array of arrays to inspect.\\n *\\n * @private\\n * @param {Array} arrays The arrays to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of shared values.\\n */\\n function baseIntersection(arrays, iteratee, comparator) {\\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\\n length = arrays[0].length,\\n othLength = arrays.length,\\n othIndex = othLength,\\n caches = Array(othLength),\\n maxLength = Infinity,\\n result = [];\\n\\n while (othIndex--) {\\n var array = arrays[othIndex];\\n if (othIndex && iteratee) {\\n array = arrayMap(array, baseUnary(iteratee));\\n }\\n maxLength = nativeMin(array.length, maxLength);\\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\\n ? new SetCache(othIndex && array)\\n : undefined;\\n }\\n array = arrays[0];\\n\\n var index = -1,\\n seen = caches[0];\\n\\n outer:\\n while (++index < length && result.length < maxLength) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (!(seen\\n ? cacheHas(seen, computed)\\n : includes(result, computed, comparator)\\n )) {\\n othIndex = othLength;\\n while (--othIndex) {\\n var cache = caches[othIndex];\\n if (!(cache\\n ? cacheHas(cache, computed)\\n : includes(arrays[othIndex], computed, comparator))\\n ) {\\n continue outer;\\n }\\n }\\n if (seen) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.invert` and `_.invertBy` which inverts\\n * `object` with values transformed by `iteratee` and set by `setter`.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform values.\\n * @param {Object} accumulator The initial inverted object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function baseInverter(object, setter, iteratee, accumulator) {\\n baseForOwn(object, function(value, key, object) {\\n setter(accumulator, iteratee(value), key, object);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.invoke` without support for individual\\n * method arguments.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the method to invoke.\\n * @param {Array} args The arguments to invoke the method with.\\n * @returns {*} Returns the result of the invoked method.\\n */\\n function baseInvoke(object, path, args) {\\n path = castPath(path, object);\\n object = parent(object, path);\\n var func = object == null ? object : object[toKey(last(path))];\\n return func == null ? undefined : apply(func, object, args);\\n }\\n\\n /**\\n * The base implementation of `_.isArguments`.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\\n */\\n function baseIsArguments(value) {\\n return isObjectLike(value) && baseGetTag(value) == argsTag;\\n }\\n\\n /**\\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\\n */\\n function baseIsArrayBuffer(value) {\\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\\n }\\n\\n /**\\n * The base implementation of `_.isDate` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\\n */\\n function baseIsDate(value) {\\n return isObjectLike(value) && baseGetTag(value) == dateTag;\\n }\\n\\n /**\\n * The base implementation of `_.isEqual` which supports partial comparisons\\n * and tracks traversed objects.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @param {boolean} bitmask The bitmask flags.\\n * 1 - Unordered comparison\\n * 2 - Partial comparison\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n */\\n function baseIsEqual(value, other, bitmask, customizer, stack) {\\n if (value === other) {\\n return true;\\n }\\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\\n return value !== value && other !== other;\\n }\\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\\n }\\n\\n /**\\n * A specialized version of `baseIsEqual` for arrays and objects which performs\\n * deep comparisons and tracks traversed objects enabling objects with circular\\n * references to be compared.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\\n var objIsArr = isArray(object),\\n othIsArr = isArray(other),\\n objTag = objIsArr ? arrayTag : getTag(object),\\n othTag = othIsArr ? arrayTag : getTag(other);\\n\\n objTag = objTag == argsTag ? objectTag : objTag;\\n othTag = othTag == argsTag ? objectTag : othTag;\\n\\n var objIsObj = objTag == objectTag,\\n othIsObj = othTag == objectTag,\\n isSameTag = objTag == othTag;\\n\\n if (isSameTag && isBuffer(object)) {\\n if (!isBuffer(other)) {\\n return false;\\n }\\n objIsArr = true;\\n objIsObj = false;\\n }\\n if (isSameTag && !objIsObj) {\\n stack || (stack = new Stack);\\n return (objIsArr || isTypedArray(object))\\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\\n }\\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\\n\\n if (objIsWrapped || othIsWrapped) {\\n var objUnwrapped = objIsWrapped ? object.value() : object,\\n othUnwrapped = othIsWrapped ? other.value() : other;\\n\\n stack || (stack = new Stack);\\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\\n }\\n }\\n if (!isSameTag) {\\n return false;\\n }\\n stack || (stack = new Stack);\\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\\n }\\n\\n /**\\n * The base implementation of `_.isMap` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\\n */\\n function baseIsMap(value) {\\n return isObjectLike(value) && getTag(value) == mapTag;\\n }\\n\\n /**\\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @param {Array} matchData The property names, values, and compare flags to match.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n */\\n function baseIsMatch(object, source, matchData, customizer) {\\n var index = matchData.length,\\n length = index,\\n noCustomizer = !customizer;\\n\\n if (object == null) {\\n return !length;\\n }\\n object = Object(object);\\n while (index--) {\\n var data = matchData[index];\\n if ((noCustomizer && data[2])\\n ? data[1] !== object[data[0]]\\n : !(data[0] in object)\\n ) {\\n return false;\\n }\\n }\\n while (++index < length) {\\n data = matchData[index];\\n var key = data[0],\\n objValue = object[key],\\n srcValue = data[1];\\n\\n if (noCustomizer && data[2]) {\\n if (objValue === undefined && !(key in object)) {\\n return false;\\n }\\n } else {\\n var stack = new Stack;\\n if (customizer) {\\n var result = customizer(objValue, srcValue, key, object, source, stack);\\n }\\n if (!(result === undefined\\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\\n : result\\n )) {\\n return false;\\n }\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * The base implementation of `_.isNative` without bad shim checks.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a native function,\\n * else `false`.\\n */\\n function baseIsNative(value) {\\n if (!isObject(value) || isMasked(value)) {\\n return false;\\n }\\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\\n return pattern.test(toSource(value));\\n }\\n\\n /**\\n * The base implementation of `_.isRegExp` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\\n */\\n function baseIsRegExp(value) {\\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\\n }\\n\\n /**\\n * The base implementation of `_.isSet` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\\n */\\n function baseIsSet(value) {\\n return isObjectLike(value) && getTag(value) == setTag;\\n }\\n\\n /**\\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\\n */\\n function baseIsTypedArray(value) {\\n return isObjectLike(value) &&\\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\\n }\\n\\n /**\\n * The base implementation of `_.iteratee`.\\n *\\n * @private\\n * @param {*} [value=_.identity] The value to convert to an iteratee.\\n * @returns {Function} Returns the iteratee.\\n */\\n function baseIteratee(value) {\\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\\n if (typeof value == 'function') {\\n return value;\\n }\\n if (value == null) {\\n return identity;\\n }\\n if (typeof value == 'object') {\\n return isArray(value)\\n ? baseMatchesProperty(value[0], value[1])\\n : baseMatches(value);\\n }\\n return property(value);\\n }\\n\\n /**\\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function baseKeys(object) {\\n if (!isPrototype(object)) {\\n return nativeKeys(object);\\n }\\n var result = [];\\n for (var key in Object(object)) {\\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function baseKeysIn(object) {\\n if (!isObject(object)) {\\n return nativeKeysIn(object);\\n }\\n var isProto = isPrototype(object),\\n result = [];\\n\\n for (var key in object) {\\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.lt` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than `other`,\\n * else `false`.\\n */\\n function baseLt(value, other) {\\n return value < other;\\n }\\n\\n /**\\n * The base implementation of `_.map` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n */\\n function baseMap(collection, iteratee) {\\n var index = -1,\\n result = isArrayLike(collection) ? Array(collection.length) : [];\\n\\n baseEach(collection, function(value, key, collection) {\\n result[++index] = iteratee(value, key, collection);\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.matches` which doesn't clone `source`.\\n *\\n * @private\\n * @param {Object} source The object of property values to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseMatches(source) {\\n var matchData = getMatchData(source);\\n if (matchData.length == 1 && matchData[0][2]) {\\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\\n }\\n return function(object) {\\n return object === source || baseIsMatch(object, source, matchData);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\\n *\\n * @private\\n * @param {string} path The path of the property to get.\\n * @param {*} srcValue The value to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseMatchesProperty(path, srcValue) {\\n if (isKey(path) && isStrictComparable(srcValue)) {\\n return matchesStrictComparable(toKey(path), srcValue);\\n }\\n return function(object) {\\n var objValue = get(object, path);\\n return (objValue === undefined && objValue === srcValue)\\n ? hasIn(object, path)\\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.merge` without support for multiple sources.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @param {number} srcIndex The index of `source`.\\n * @param {Function} [customizer] The function to customize merged values.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n */\\n function baseMerge(object, source, srcIndex, customizer, stack) {\\n if (object === source) {\\n return;\\n }\\n baseFor(source, function(srcValue, key) {\\n if (isObject(srcValue)) {\\n stack || (stack = new Stack);\\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\\n }\\n else {\\n var newValue = customizer\\n ? customizer(object[key], srcValue, (key + ''), object, source, stack)\\n : undefined;\\n\\n if (newValue === undefined) {\\n newValue = srcValue;\\n }\\n assignMergeValue(object, key, newValue);\\n }\\n }, keysIn);\\n }\\n\\n /**\\n * A specialized version of `baseMerge` for arrays and objects which performs\\n * deep merges and tracks traversed objects enabling objects with circular\\n * references to be merged.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @param {string} key The key of the value to merge.\\n * @param {number} srcIndex The index of `source`.\\n * @param {Function} mergeFunc The function to merge values.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n */\\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\\n var objValue = object[key],\\n srcValue = source[key],\\n stacked = stack.get(srcValue);\\n\\n if (stacked) {\\n assignMergeValue(object, key, stacked);\\n return;\\n }\\n var newValue = customizer\\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\\n : undefined;\\n\\n var isCommon = newValue === undefined;\\n\\n if (isCommon) {\\n var isArr = isArray(srcValue),\\n isBuff = !isArr && isBuffer(srcValue),\\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\\n\\n newValue = srcValue;\\n if (isArr || isBuff || isTyped) {\\n if (isArray(objValue)) {\\n newValue = objValue;\\n }\\n else if (isArrayLikeObject(objValue)) {\\n newValue = copyArray(objValue);\\n }\\n else if (isBuff) {\\n isCommon = false;\\n newValue = cloneBuffer(srcValue, true);\\n }\\n else if (isTyped) {\\n isCommon = false;\\n newValue = cloneTypedArray(srcValue, true);\\n }\\n else {\\n newValue = [];\\n }\\n }\\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\\n newValue = objValue;\\n if (isArguments(objValue)) {\\n newValue = toPlainObject(objValue);\\n }\\n else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\\n newValue = initCloneObject(srcValue);\\n }\\n }\\n else {\\n isCommon = false;\\n }\\n }\\n if (isCommon) {\\n // Recursively merge objects and arrays (susceptible to call stack limits).\\n stack.set(srcValue, newValue);\\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\\n stack['delete'](srcValue);\\n }\\n assignMergeValue(object, key, newValue);\\n }\\n\\n /**\\n * The base implementation of `_.nth` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {Array} array The array to query.\\n * @param {number} n The index of the element to return.\\n * @returns {*} Returns the nth element of `array`.\\n */\\n function baseNth(array, n) {\\n var length = array.length;\\n if (!length) {\\n return;\\n }\\n n += n < 0 ? length : 0;\\n return isIndex(n, length) ? array[n] : undefined;\\n }\\n\\n /**\\n * The base implementation of `_.orderBy` without param guards.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\\n * @param {string[]} orders The sort orders of `iteratees`.\\n * @returns {Array} Returns the new sorted array.\\n */\\n function baseOrderBy(collection, iteratees, orders) {\\n var index = -1;\\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\\n\\n var result = baseMap(collection, function(value, key, collection) {\\n var criteria = arrayMap(iteratees, function(iteratee) {\\n return iteratee(value);\\n });\\n return { 'criteria': criteria, 'index': ++index, 'value': value };\\n });\\n\\n return baseSortBy(result, function(object, other) {\\n return compareMultiple(object, other, orders);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.pick` without support for individual\\n * property identifiers.\\n *\\n * @private\\n * @param {Object} object The source object.\\n * @param {string[]} paths The property paths to pick.\\n * @returns {Object} Returns the new object.\\n */\\n function basePick(object, paths) {\\n return basePickBy(object, paths, function(value, path) {\\n return hasIn(object, path);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The source object.\\n * @param {string[]} paths The property paths to pick.\\n * @param {Function} predicate The function invoked per property.\\n * @returns {Object} Returns the new object.\\n */\\n function basePickBy(object, paths, predicate) {\\n var index = -1,\\n length = paths.length,\\n result = {};\\n\\n while (++index < length) {\\n var path = paths[index],\\n value = baseGet(object, path);\\n\\n if (predicate(value, path)) {\\n baseSet(result, castPath(path, object), value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseProperty` which supports deep paths.\\n *\\n * @private\\n * @param {Array|string} path The path of the property to get.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function basePropertyDeep(path) {\\n return function(object) {\\n return baseGet(object, path);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.pullAllBy` without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns `array`.\\n */\\n function basePullAll(array, values, iteratee, comparator) {\\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\\n index = -1,\\n length = values.length,\\n seen = array;\\n\\n if (array === values) {\\n values = copyArray(values);\\n }\\n if (iteratee) {\\n seen = arrayMap(array, baseUnary(iteratee));\\n }\\n while (++index < length) {\\n var fromIndex = 0,\\n value = values[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\\n if (seen !== array) {\\n splice.call(seen, fromIndex, 1);\\n }\\n splice.call(array, fromIndex, 1);\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.pullAt` without support for individual\\n * indexes or capturing the removed elements.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {number[]} indexes The indexes of elements to remove.\\n * @returns {Array} Returns `array`.\\n */\\n function basePullAt(array, indexes) {\\n var length = array ? indexes.length : 0,\\n lastIndex = length - 1;\\n\\n while (length--) {\\n var index = indexes[length];\\n if (length == lastIndex || index !== previous) {\\n var previous = index;\\n if (isIndex(index)) {\\n splice.call(array, index, 1);\\n } else {\\n baseUnset(array, index);\\n }\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.random` without support for returning\\n * floating-point numbers.\\n *\\n * @private\\n * @param {number} lower The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the random number.\\n */\\n function baseRandom(lower, upper) {\\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\\n }\\n\\n /**\\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\\n * coerce arguments.\\n *\\n * @private\\n * @param {number} start The start of the range.\\n * @param {number} end The end of the range.\\n * @param {number} step The value to increment or decrement by.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Array} Returns the range of numbers.\\n */\\n function baseRange(start, end, step, fromRight) {\\n var index = -1,\\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\\n result = Array(length);\\n\\n while (length--) {\\n result[fromRight ? length : ++index] = start;\\n start += step;\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.repeat` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {string} string The string to repeat.\\n * @param {number} n The number of times to repeat the string.\\n * @returns {string} Returns the repeated string.\\n */\\n function baseRepeat(string, n) {\\n var result = '';\\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\\n return result;\\n }\\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\\n do {\\n if (n % 2) {\\n result += string;\\n }\\n n = nativeFloor(n / 2);\\n if (n) {\\n string += string;\\n }\\n } while (n);\\n\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @returns {Function} Returns the new function.\\n */\\n function baseRest(func, start) {\\n return setToString(overRest(func, start, identity), func + '');\\n }\\n\\n /**\\n * The base implementation of `_.sample`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to sample.\\n * @returns {*} Returns the random element.\\n */\\n function baseSample(collection) {\\n return arraySample(values(collection));\\n }\\n\\n /**\\n * The base implementation of `_.sampleSize` without param guards.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to sample.\\n * @param {number} n The number of elements to sample.\\n * @returns {Array} Returns the random elements.\\n */\\n function baseSampleSize(collection, n) {\\n var array = values(collection);\\n return shuffleSelf(array, baseClamp(n, 0, array.length));\\n }\\n\\n /**\\n * The base implementation of `_.set`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @param {Function} [customizer] The function to customize path creation.\\n * @returns {Object} Returns `object`.\\n */\\n function baseSet(object, path, value, customizer) {\\n if (!isObject(object)) {\\n return object;\\n }\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length,\\n lastIndex = length - 1,\\n nested = object;\\n\\n while (nested != null && ++index < length) {\\n var key = toKey(path[index]),\\n newValue = value;\\n\\n if (index != lastIndex) {\\n var objValue = nested[key];\\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\\n if (newValue === undefined) {\\n newValue = isObject(objValue)\\n ? objValue\\n : (isIndex(path[index + 1]) ? [] : {});\\n }\\n }\\n assignValue(nested, key, newValue);\\n nested = nested[key];\\n }\\n return object;\\n }\\n\\n /**\\n * The base implementation of `setData` without support for hot loop shorting.\\n *\\n * @private\\n * @param {Function} func The function to associate metadata with.\\n * @param {*} data The metadata.\\n * @returns {Function} Returns `func`.\\n */\\n var baseSetData = !metaMap ? identity : function(func, data) {\\n metaMap.set(func, data);\\n return func;\\n };\\n\\n /**\\n * The base implementation of `setToString` without support for hot loop shorting.\\n *\\n * @private\\n * @param {Function} func The function to modify.\\n * @param {Function} string The `toString` result.\\n * @returns {Function} Returns `func`.\\n */\\n var baseSetToString = !defineProperty ? identity : function(func, string) {\\n return defineProperty(func, 'toString', {\\n 'configurable': true,\\n 'enumerable': false,\\n 'value': constant(string),\\n 'writable': true\\n });\\n };\\n\\n /**\\n * The base implementation of `_.shuffle`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n */\\n function baseShuffle(collection) {\\n return shuffleSelf(values(collection));\\n }\\n\\n /**\\n * The base implementation of `_.slice` without an iteratee call guard.\\n *\\n * @private\\n * @param {Array} array The array to slice.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function baseSlice(array, start, end) {\\n var index = -1,\\n length = array.length;\\n\\n if (start < 0) {\\n start = -start > length ? 0 : (length + start);\\n }\\n end = end > length ? length : end;\\n if (end < 0) {\\n end += length;\\n }\\n length = start > end ? 0 : ((end - start) >>> 0);\\n start >>>= 0;\\n\\n var result = Array(length);\\n while (++index < length) {\\n result[index] = array[index + start];\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.some` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n */\\n function baseSome(collection, predicate) {\\n var result;\\n\\n baseEach(collection, function(value, index, collection) {\\n result = predicate(value, index, collection);\\n return !result;\\n });\\n return !!result;\\n }\\n\\n /**\\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\\n * performs a binary search of `array` to determine the index at which `value`\\n * should be inserted into `array` in order to maintain its sort order.\\n *\\n * @private\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n */\\n function baseSortedIndex(array, value, retHighest) {\\n var low = 0,\\n high = array == null ? low : array.length;\\n\\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\\n while (low < high) {\\n var mid = (low + high) >>> 1,\\n computed = array[mid];\\n\\n if (computed !== null && !isSymbol(computed) &&\\n (retHighest ? (computed <= value) : (computed < value))) {\\n low = mid + 1;\\n } else {\\n high = mid;\\n }\\n }\\n return high;\\n }\\n return baseSortedIndexBy(array, value, identity, retHighest);\\n }\\n\\n /**\\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\\n * which invokes `iteratee` for `value` and each element of `array` to compute\\n * their sort ranking. The iteratee is invoked with one argument; (value).\\n *\\n * @private\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} iteratee The iteratee invoked per element.\\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n */\\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\\n value = iteratee(value);\\n\\n var low = 0,\\n high = array == null ? 0 : array.length,\\n valIsNaN = value !== value,\\n valIsNull = value === null,\\n valIsSymbol = isSymbol(value),\\n valIsUndefined = value === undefined;\\n\\n while (low < high) {\\n var mid = nativeFloor((low + high) / 2),\\n computed = iteratee(array[mid]),\\n othIsDefined = computed !== undefined,\\n othIsNull = computed === null,\\n othIsReflexive = computed === computed,\\n othIsSymbol = isSymbol(computed);\\n\\n if (valIsNaN) {\\n var setLow = retHighest || othIsReflexive;\\n } else if (valIsUndefined) {\\n setLow = othIsReflexive && (retHighest || othIsDefined);\\n } else if (valIsNull) {\\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\\n } else if (valIsSymbol) {\\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\\n } else if (othIsNull || othIsSymbol) {\\n setLow = false;\\n } else {\\n setLow = retHighest ? (computed <= value) : (computed < value);\\n }\\n if (setLow) {\\n low = mid + 1;\\n } else {\\n high = mid;\\n }\\n }\\n return nativeMin(high, MAX_ARRAY_INDEX);\\n }\\n\\n /**\\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\\n * support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n */\\n function baseSortedUniq(array, iteratee) {\\n var index = -1,\\n length = array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n if (!index || !eq(computed, seen)) {\\n var seen = computed;\\n result[resIndex++] = value === 0 ? 0 : value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.toNumber` which doesn't ensure correct\\n * conversions of binary, hexadecimal, or octal string values.\\n *\\n * @private\\n * @param {*} value The value to process.\\n * @returns {number} Returns the number.\\n */\\n function baseToNumber(value) {\\n if (typeof value == 'number') {\\n return value;\\n }\\n if (isSymbol(value)) {\\n return NAN;\\n }\\n return +value;\\n }\\n\\n /**\\n * The base implementation of `_.toString` which doesn't convert nullish\\n * values to empty strings.\\n *\\n * @private\\n * @param {*} value The value to process.\\n * @returns {string} Returns the string.\\n */\\n function baseToString(value) {\\n // Exit early for strings to avoid a performance hit in some environments.\\n if (typeof value == 'string') {\\n return value;\\n }\\n if (isArray(value)) {\\n // Recursively convert values (susceptible to call stack limits).\\n return arrayMap(value, baseToString) + '';\\n }\\n if (isSymbol(value)) {\\n return symbolToString ? symbolToString.call(value) : '';\\n }\\n var result = (value + '');\\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\\n }\\n\\n /**\\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n */\\n function baseUniq(array, iteratee, comparator) {\\n var index = -1,\\n includes = arrayIncludes,\\n length = array.length,\\n isCommon = true,\\n result = [],\\n seen = result;\\n\\n if (comparator) {\\n isCommon = false;\\n includes = arrayIncludesWith;\\n }\\n else if (length >= LARGE_ARRAY_SIZE) {\\n var set = iteratee ? null : createSet(array);\\n if (set) {\\n return setToArray(set);\\n }\\n isCommon = false;\\n includes = cacheHas;\\n seen = new SetCache;\\n }\\n else {\\n seen = iteratee ? [] : result;\\n }\\n outer:\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (isCommon && computed === computed) {\\n var seenIndex = seen.length;\\n while (seenIndex--) {\\n if (seen[seenIndex] === computed) {\\n continue outer;\\n }\\n }\\n if (iteratee) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n else if (!includes(seen, computed, comparator)) {\\n if (seen !== result) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.unset`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The property path to unset.\\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\\n */\\n function baseUnset(object, path) {\\n path = castPath(path, object);\\n object = parent(object, path);\\n return object == null || delete object[toKey(last(path))];\\n }\\n\\n /**\\n * The base implementation of `_.update`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to update.\\n * @param {Function} updater The function to produce the updated value.\\n * @param {Function} [customizer] The function to customize path creation.\\n * @returns {Object} Returns `object`.\\n */\\n function baseUpdate(object, path, updater, customizer) {\\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\\n }\\n\\n /**\\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\\n * without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to query.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function baseWhile(array, predicate, isDrop, fromRight) {\\n var length = array.length,\\n index = fromRight ? length : -1;\\n\\n while ((fromRight ? index-- : ++index < length) &&\\n predicate(array[index], index, array)) {}\\n\\n return isDrop\\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\\n }\\n\\n /**\\n * The base implementation of `wrapperValue` which returns the result of\\n * performing a sequence of actions on the unwrapped `value`, where each\\n * successive action is supplied the return value of the previous.\\n *\\n * @private\\n * @param {*} value The unwrapped value.\\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\\n * @returns {*} Returns the resolved value.\\n */\\n function baseWrapperValue(value, actions) {\\n var result = value;\\n if (result instanceof LazyWrapper) {\\n result = result.value();\\n }\\n return arrayReduce(actions, function(result, action) {\\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\\n }, result);\\n }\\n\\n /**\\n * The base implementation of methods like `_.xor`, without support for\\n * iteratee shorthands, that accepts an array of arrays to inspect.\\n *\\n * @private\\n * @param {Array} arrays The arrays to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of values.\\n */\\n function baseXor(arrays, iteratee, comparator) {\\n var length = arrays.length;\\n if (length < 2) {\\n return length ? baseUniq(arrays[0]) : [];\\n }\\n var index = -1,\\n result = Array(length);\\n\\n while (++index < length) {\\n var array = arrays[index],\\n othIndex = -1;\\n\\n while (++othIndex < length) {\\n if (othIndex != index) {\\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\\n }\\n }\\n }\\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\\n }\\n\\n /**\\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\\n *\\n * @private\\n * @param {Array} props The property identifiers.\\n * @param {Array} values The property values.\\n * @param {Function} assignFunc The function to assign values.\\n * @returns {Object} Returns the new object.\\n */\\n function baseZipObject(props, values, assignFunc) {\\n var index = -1,\\n length = props.length,\\n valsLength = values.length,\\n result = {};\\n\\n while (++index < length) {\\n var value = index < valsLength ? values[index] : undefined;\\n assignFunc(result, props[index], value);\\n }\\n return result;\\n }\\n\\n /**\\n * Casts `value` to an empty array if it's not an array like object.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {Array|Object} Returns the cast array-like object.\\n */\\n function castArrayLikeObject(value) {\\n return isArrayLikeObject(value) ? value : [];\\n }\\n\\n /**\\n * Casts `value` to `identity` if it's not a function.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {Function} Returns cast function.\\n */\\n function castFunction(value) {\\n return typeof value == 'function' ? value : identity;\\n }\\n\\n /**\\n * Casts `value` to a path array if it's not one.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @param {Object} [object] The object to query keys on.\\n * @returns {Array} Returns the cast property path array.\\n */\\n function castPath(value, object) {\\n if (isArray(value)) {\\n return value;\\n }\\n return isKey(value, object) ? [value] : stringToPath(toString(value));\\n }\\n\\n /**\\n * A `baseRest` alias which can be replaced with `identity` by module\\n * replacement plugins.\\n *\\n * @private\\n * @type {Function}\\n * @param {Function} func The function to apply a rest parameter to.\\n * @returns {Function} Returns the new function.\\n */\\n var castRest = baseRest;\\n\\n /**\\n * Casts `array` to a slice if it's needed.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {number} start The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the cast slice.\\n */\\n function castSlice(array, start, end) {\\n var length = array.length;\\n end = end === undefined ? length : end;\\n return (!start && end >= length) ? array : baseSlice(array, start, end);\\n }\\n\\n /**\\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\\n *\\n * @private\\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\\n */\\n var clearTimeout = ctxClearTimeout || function(id) {\\n return root.clearTimeout(id);\\n };\\n\\n /**\\n * Creates a clone of `buffer`.\\n *\\n * @private\\n * @param {Buffer} buffer The buffer to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Buffer} Returns the cloned buffer.\\n */\\n function cloneBuffer(buffer, isDeep) {\\n if (isDeep) {\\n return buffer.slice();\\n }\\n var length = buffer.length,\\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\\n\\n buffer.copy(result);\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `arrayBuffer`.\\n *\\n * @private\\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\\n * @returns {ArrayBuffer} Returns the cloned array buffer.\\n */\\n function cloneArrayBuffer(arrayBuffer) {\\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `dataView`.\\n *\\n * @private\\n * @param {Object} dataView The data view to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned data view.\\n */\\n function cloneDataView(dataView, isDeep) {\\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\\n }\\n\\n /**\\n * Creates a clone of `map`.\\n *\\n * @private\\n * @param {Object} map The map to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned map.\\n */\\n function cloneMap(map, isDeep, cloneFunc) {\\n var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);\\n return arrayReduce(array, addMapEntry, new map.constructor);\\n }\\n\\n /**\\n * Creates a clone of `regexp`.\\n *\\n * @private\\n * @param {Object} regexp The regexp to clone.\\n * @returns {Object} Returns the cloned regexp.\\n */\\n function cloneRegExp(regexp) {\\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\\n result.lastIndex = regexp.lastIndex;\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `set`.\\n *\\n * @private\\n * @param {Object} set The set to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned set.\\n */\\n function cloneSet(set, isDeep, cloneFunc) {\\n var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);\\n return arrayReduce(array, addSetEntry, new set.constructor);\\n }\\n\\n /**\\n * Creates a clone of the `symbol` object.\\n *\\n * @private\\n * @param {Object} symbol The symbol object to clone.\\n * @returns {Object} Returns the cloned symbol object.\\n */\\n function cloneSymbol(symbol) {\\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\\n }\\n\\n /**\\n * Creates a clone of `typedArray`.\\n *\\n * @private\\n * @param {Object} typedArray The typed array to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned typed array.\\n */\\n function cloneTypedArray(typedArray, isDeep) {\\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\\n }\\n\\n /**\\n * Compares values to sort them in ascending order.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {number} Returns the sort order indicator for `value`.\\n */\\n function compareAscending(value, other) {\\n if (value !== other) {\\n var valIsDefined = value !== undefined,\\n valIsNull = value === null,\\n valIsReflexive = value === value,\\n valIsSymbol = isSymbol(value);\\n\\n var othIsDefined = other !== undefined,\\n othIsNull = other === null,\\n othIsReflexive = other === other,\\n othIsSymbol = isSymbol(other);\\n\\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\\n (valIsNull && othIsDefined && othIsReflexive) ||\\n (!valIsDefined && othIsReflexive) ||\\n !valIsReflexive) {\\n return 1;\\n }\\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\\n (othIsNull && valIsDefined && valIsReflexive) ||\\n (!othIsDefined && valIsReflexive) ||\\n !othIsReflexive) {\\n return -1;\\n }\\n }\\n return 0;\\n }\\n\\n /**\\n * Used by `_.orderBy` to compare multiple properties of a value to another\\n * and stable sort them.\\n *\\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\\n * specify an order of \\\"desc\\\" for descending or \\\"asc\\\" for ascending sort order\\n * of corresponding values.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {boolean[]|string[]} orders The order to sort by for each property.\\n * @returns {number} Returns the sort order indicator for `object`.\\n */\\n function compareMultiple(object, other, orders) {\\n var index = -1,\\n objCriteria = object.criteria,\\n othCriteria = other.criteria,\\n length = objCriteria.length,\\n ordersLength = orders.length;\\n\\n while (++index < length) {\\n var result = compareAscending(objCriteria[index], othCriteria[index]);\\n if (result) {\\n if (index >= ordersLength) {\\n return result;\\n }\\n var order = orders[index];\\n return result * (order == 'desc' ? -1 : 1);\\n }\\n }\\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\\n // that causes it, under certain circumstances, to provide the same value for\\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\\n // for more details.\\n //\\n // This also ensures a stable sort in V8 and other engines.\\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\\n return object.index - other.index;\\n }\\n\\n /**\\n * Creates an array that is the composition of partially applied arguments,\\n * placeholders, and provided arguments into a single array of arguments.\\n *\\n * @private\\n * @param {Array} args The provided arguments.\\n * @param {Array} partials The arguments to prepend to those provided.\\n * @param {Array} holders The `partials` placeholder indexes.\\n * @params {boolean} [isCurried] Specify composing for a curried function.\\n * @returns {Array} Returns the new array of composed arguments.\\n */\\n function composeArgs(args, partials, holders, isCurried) {\\n var argsIndex = -1,\\n argsLength = args.length,\\n holdersLength = holders.length,\\n leftIndex = -1,\\n leftLength = partials.length,\\n rangeLength = nativeMax(argsLength - holdersLength, 0),\\n result = Array(leftLength + rangeLength),\\n isUncurried = !isCurried;\\n\\n while (++leftIndex < leftLength) {\\n result[leftIndex] = partials[leftIndex];\\n }\\n while (++argsIndex < holdersLength) {\\n if (isUncurried || argsIndex < argsLength) {\\n result[holders[argsIndex]] = args[argsIndex];\\n }\\n }\\n while (rangeLength--) {\\n result[leftIndex++] = args[argsIndex++];\\n }\\n return result;\\n }\\n\\n /**\\n * This function is like `composeArgs` except that the arguments composition\\n * is tailored for `_.partialRight`.\\n *\\n * @private\\n * @param {Array} args The provided arguments.\\n * @param {Array} partials The arguments to append to those provided.\\n * @param {Array} holders The `partials` placeholder indexes.\\n * @params {boolean} [isCurried] Specify composing for a curried function.\\n * @returns {Array} Returns the new array of composed arguments.\\n */\\n function composeArgsRight(args, partials, holders, isCurried) {\\n var argsIndex = -1,\\n argsLength = args.length,\\n holdersIndex = -1,\\n holdersLength = holders.length,\\n rightIndex = -1,\\n rightLength = partials.length,\\n rangeLength = nativeMax(argsLength - holdersLength, 0),\\n result = Array(rangeLength + rightLength),\\n isUncurried = !isCurried;\\n\\n while (++argsIndex < rangeLength) {\\n result[argsIndex] = args[argsIndex];\\n }\\n var offset = argsIndex;\\n while (++rightIndex < rightLength) {\\n result[offset + rightIndex] = partials[rightIndex];\\n }\\n while (++holdersIndex < holdersLength) {\\n if (isUncurried || argsIndex < argsLength) {\\n result[offset + holders[holdersIndex]] = args[argsIndex++];\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Copies the values of `source` to `array`.\\n *\\n * @private\\n * @param {Array} source The array to copy values from.\\n * @param {Array} [array=[]] The array to copy values to.\\n * @returns {Array} Returns `array`.\\n */\\n function copyArray(source, array) {\\n var index = -1,\\n length = source.length;\\n\\n array || (array = Array(length));\\n while (++index < length) {\\n array[index] = source[index];\\n }\\n return array;\\n }\\n\\n /**\\n * Copies properties of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy properties from.\\n * @param {Array} props The property identifiers to copy.\\n * @param {Object} [object={}] The object to copy properties to.\\n * @param {Function} [customizer] The function to customize copied values.\\n * @returns {Object} Returns `object`.\\n */\\n function copyObject(source, props, object, customizer) {\\n var isNew = !object;\\n object || (object = {});\\n\\n var index = -1,\\n length = props.length;\\n\\n while (++index < length) {\\n var key = props[index];\\n\\n var newValue = customizer\\n ? customizer(object[key], source[key], key, object, source)\\n : undefined;\\n\\n if (newValue === undefined) {\\n newValue = source[key];\\n }\\n if (isNew) {\\n baseAssignValue(object, key, newValue);\\n } else {\\n assignValue(object, key, newValue);\\n }\\n }\\n return object;\\n }\\n\\n /**\\n * Copies own symbols of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy symbols from.\\n * @param {Object} [object={}] The object to copy symbols to.\\n * @returns {Object} Returns `object`.\\n */\\n function copySymbols(source, object) {\\n return copyObject(source, getSymbols(source), object);\\n }\\n\\n /**\\n * Copies own and inherited symbols of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy symbols from.\\n * @param {Object} [object={}] The object to copy symbols to.\\n * @returns {Object} Returns `object`.\\n */\\n function copySymbolsIn(source, object) {\\n return copyObject(source, getSymbolsIn(source), object);\\n }\\n\\n /**\\n * Creates a function like `_.groupBy`.\\n *\\n * @private\\n * @param {Function} setter The function to set accumulator values.\\n * @param {Function} [initializer] The accumulator object initializer.\\n * @returns {Function} Returns the new aggregator function.\\n */\\n function createAggregator(setter, initializer) {\\n return function(collection, iteratee) {\\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\\n accumulator = initializer ? initializer() : {};\\n\\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\\n };\\n }\\n\\n /**\\n * Creates a function like `_.assign`.\\n *\\n * @private\\n * @param {Function} assigner The function to assign values.\\n * @returns {Function} Returns the new assigner function.\\n */\\n function createAssigner(assigner) {\\n return baseRest(function(object, sources) {\\n var index = -1,\\n length = sources.length,\\n customizer = length > 1 ? sources[length - 1] : undefined,\\n guard = length > 2 ? sources[2] : undefined;\\n\\n customizer = (assigner.length > 3 && typeof customizer == 'function')\\n ? (length--, customizer)\\n : undefined;\\n\\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\\n customizer = length < 3 ? undefined : customizer;\\n length = 1;\\n }\\n object = Object(object);\\n while (++index < length) {\\n var source = sources[index];\\n if (source) {\\n assigner(object, source, index, customizer);\\n }\\n }\\n return object;\\n });\\n }\\n\\n /**\\n * Creates a `baseEach` or `baseEachRight` function.\\n *\\n * @private\\n * @param {Function} eachFunc The function to iterate over a collection.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new base function.\\n */\\n function createBaseEach(eachFunc, fromRight) {\\n return function(collection, iteratee) {\\n if (collection == null) {\\n return collection;\\n }\\n if (!isArrayLike(collection)) {\\n return eachFunc(collection, iteratee);\\n }\\n var length = collection.length,\\n index = fromRight ? length : -1,\\n iterable = Object(collection);\\n\\n while ((fromRight ? index-- : ++index < length)) {\\n if (iteratee(iterable[index], index, iterable) === false) {\\n break;\\n }\\n }\\n return collection;\\n };\\n }\\n\\n /**\\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new base function.\\n */\\n function createBaseFor(fromRight) {\\n return function(object, iteratee, keysFunc) {\\n var index = -1,\\n iterable = Object(object),\\n props = keysFunc(object),\\n length = props.length;\\n\\n while (length--) {\\n var key = props[fromRight ? length : ++index];\\n if (iteratee(iterable[key], key, iterable) === false) {\\n break;\\n }\\n }\\n return object;\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with the optional `this`\\n * binding of `thisArg`.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createBind(func, bitmask, thisArg) {\\n var isBind = bitmask & WRAP_BIND_FLAG,\\n Ctor = createCtor(func);\\n\\n function wrapper() {\\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n return fn.apply(isBind ? thisArg : this, arguments);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a function like `_.lowerFirst`.\\n *\\n * @private\\n * @param {string} methodName The name of the `String` case method to use.\\n * @returns {Function} Returns the new case function.\\n */\\n function createCaseFirst(methodName) {\\n return function(string) {\\n string = toString(string);\\n\\n var strSymbols = hasUnicode(string)\\n ? stringToArray(string)\\n : undefined;\\n\\n var chr = strSymbols\\n ? strSymbols[0]\\n : string.charAt(0);\\n\\n var trailing = strSymbols\\n ? castSlice(strSymbols, 1).join('')\\n : string.slice(1);\\n\\n return chr[methodName]() + trailing;\\n };\\n }\\n\\n /**\\n * Creates a function like `_.camelCase`.\\n *\\n * @private\\n * @param {Function} callback The function to combine each word.\\n * @returns {Function} Returns the new compounder function.\\n */\\n function createCompounder(callback) {\\n return function(string) {\\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\\n };\\n }\\n\\n /**\\n * Creates a function that produces an instance of `Ctor` regardless of\\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\\n *\\n * @private\\n * @param {Function} Ctor The constructor to wrap.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createCtor(Ctor) {\\n return function() {\\n // Use a `switch` statement to work with class constructors. See\\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\\n // for more details.\\n var args = arguments;\\n switch (args.length) {\\n case 0: return new Ctor;\\n case 1: return new Ctor(args[0]);\\n case 2: return new Ctor(args[0], args[1]);\\n case 3: return new Ctor(args[0], args[1], args[2]);\\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\\n }\\n var thisBinding = baseCreate(Ctor.prototype),\\n result = Ctor.apply(thisBinding, args);\\n\\n // Mimic the constructor's `return` behavior.\\n // See https://es5.github.io/#x13.2.2 for more details.\\n return isObject(result) ? result : thisBinding;\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to enable currying.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {number} arity The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createCurry(func, bitmask, arity) {\\n var Ctor = createCtor(func);\\n\\n function wrapper() {\\n var length = arguments.length,\\n args = Array(length),\\n index = length,\\n placeholder = getHolder(wrapper);\\n\\n while (index--) {\\n args[index] = arguments[index];\\n }\\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\\n ? []\\n : replaceHolders(args, placeholder);\\n\\n length -= holders.length;\\n if (length < arity) {\\n return createRecurry(\\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\\n args, holders, undefined, undefined, arity - length);\\n }\\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n return apply(fn, this, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a `_.find` or `_.findLast` function.\\n *\\n * @private\\n * @param {Function} findIndexFunc The function to find the collection index.\\n * @returns {Function} Returns the new find function.\\n */\\n function createFind(findIndexFunc) {\\n return function(collection, predicate, fromIndex) {\\n var iterable = Object(collection);\\n if (!isArrayLike(collection)) {\\n var iteratee = getIteratee(predicate, 3);\\n collection = keys(collection);\\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\\n }\\n var index = findIndexFunc(collection, predicate, fromIndex);\\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\\n };\\n }\\n\\n /**\\n * Creates a `_.flow` or `_.flowRight` function.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new flow function.\\n */\\n function createFlow(fromRight) {\\n return flatRest(function(funcs) {\\n var length = funcs.length,\\n index = length,\\n prereq = LodashWrapper.prototype.thru;\\n\\n if (fromRight) {\\n funcs.reverse();\\n }\\n while (index--) {\\n var func = funcs[index];\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\\n var wrapper = new LodashWrapper([], true);\\n }\\n }\\n index = wrapper ? index : length;\\n while (++index < length) {\\n func = funcs[index];\\n\\n var funcName = getFuncName(func),\\n data = funcName == 'wrapper' ? getData(func) : undefined;\\n\\n if (data && isLaziable(data[0]) &&\\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\\n !data[4].length && data[9] == 1\\n ) {\\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\\n } else {\\n wrapper = (func.length == 1 && isLaziable(func))\\n ? wrapper[funcName]()\\n : wrapper.thru(func);\\n }\\n }\\n return function() {\\n var args = arguments,\\n value = args[0];\\n\\n if (wrapper && args.length == 1 && isArray(value)) {\\n return wrapper.plant(value).value();\\n }\\n var index = 0,\\n result = length ? funcs[index].apply(this, args) : value;\\n\\n while (++index < length) {\\n result = funcs[index].call(this, result);\\n }\\n return result;\\n };\\n });\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with optional `this`\\n * binding of `thisArg`, partial application, and currying.\\n *\\n * @private\\n * @param {Function|string} func The function or method name to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to prepend to those provided to\\n * the new function.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [partialsRight] The arguments to append to those provided\\n * to the new function.\\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\\n var isAry = bitmask & WRAP_ARY_FLAG,\\n isBind = bitmask & WRAP_BIND_FLAG,\\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\\n isFlip = bitmask & WRAP_FLIP_FLAG,\\n Ctor = isBindKey ? undefined : createCtor(func);\\n\\n function wrapper() {\\n var length = arguments.length,\\n args = Array(length),\\n index = length;\\n\\n while (index--) {\\n args[index] = arguments[index];\\n }\\n if (isCurried) {\\n var placeholder = getHolder(wrapper),\\n holdersCount = countHolders(args, placeholder);\\n }\\n if (partials) {\\n args = composeArgs(args, partials, holders, isCurried);\\n }\\n if (partialsRight) {\\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\\n }\\n length -= holdersCount;\\n if (isCurried && length < arity) {\\n var newHolders = replaceHolders(args, placeholder);\\n return createRecurry(\\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\\n args, newHolders, argPos, ary, arity - length\\n );\\n }\\n var thisBinding = isBind ? thisArg : this,\\n fn = isBindKey ? thisBinding[func] : func;\\n\\n length = args.length;\\n if (argPos) {\\n args = reorder(args, argPos);\\n } else if (isFlip && length > 1) {\\n args.reverse();\\n }\\n if (isAry && ary < length) {\\n args.length = ary;\\n }\\n if (this && this !== root && this instanceof wrapper) {\\n fn = Ctor || createCtor(fn);\\n }\\n return fn.apply(thisBinding, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a function like `_.invertBy`.\\n *\\n * @private\\n * @param {Function} setter The function to set accumulator values.\\n * @param {Function} toIteratee The function to resolve iteratees.\\n * @returns {Function} Returns the new inverter function.\\n */\\n function createInverter(setter, toIteratee) {\\n return function(object, iteratee) {\\n return baseInverter(object, setter, toIteratee(iteratee), {});\\n };\\n }\\n\\n /**\\n * Creates a function that performs a mathematical operation on two values.\\n *\\n * @private\\n * @param {Function} operator The function to perform the operation.\\n * @param {number} [defaultValue] The value used for `undefined` arguments.\\n * @returns {Function} Returns the new mathematical operation function.\\n */\\n function createMathOperation(operator, defaultValue) {\\n return function(value, other) {\\n var result;\\n if (value === undefined && other === undefined) {\\n return defaultValue;\\n }\\n if (value !== undefined) {\\n result = value;\\n }\\n if (other !== undefined) {\\n if (result === undefined) {\\n return other;\\n }\\n if (typeof value == 'string' || typeof other == 'string') {\\n value = baseToString(value);\\n other = baseToString(other);\\n } else {\\n value = baseToNumber(value);\\n other = baseToNumber(other);\\n }\\n result = operator(value, other);\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Creates a function like `_.over`.\\n *\\n * @private\\n * @param {Function} arrayFunc The function to iterate over iteratees.\\n * @returns {Function} Returns the new over function.\\n */\\n function createOver(arrayFunc) {\\n return flatRest(function(iteratees) {\\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\\n return baseRest(function(args) {\\n var thisArg = this;\\n return arrayFunc(iteratees, function(iteratee) {\\n return apply(iteratee, thisArg, args);\\n });\\n });\\n });\\n }\\n\\n /**\\n * Creates the padding for `string` based on `length`. The `chars` string\\n * is truncated if the number of characters exceeds `length`.\\n *\\n * @private\\n * @param {number} length The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padding for `string`.\\n */\\n function createPadding(length, chars) {\\n chars = chars === undefined ? ' ' : baseToString(chars);\\n\\n var charsLength = chars.length;\\n if (charsLength < 2) {\\n return charsLength ? baseRepeat(chars, length) : chars;\\n }\\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\\n return hasUnicode(chars)\\n ? castSlice(stringToArray(result), 0, length).join('')\\n : result.slice(0, length);\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with the `this` binding\\n * of `thisArg` and `partials` prepended to the arguments it receives.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {Array} partials The arguments to prepend to those provided to\\n * the new function.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createPartial(func, bitmask, thisArg, partials) {\\n var isBind = bitmask & WRAP_BIND_FLAG,\\n Ctor = createCtor(func);\\n\\n function wrapper() {\\n var argsIndex = -1,\\n argsLength = arguments.length,\\n leftIndex = -1,\\n leftLength = partials.length,\\n args = Array(leftLength + argsLength),\\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n\\n while (++leftIndex < leftLength) {\\n args[leftIndex] = partials[leftIndex];\\n }\\n while (argsLength--) {\\n args[leftIndex++] = arguments[++argsIndex];\\n }\\n return apply(fn, isBind ? thisArg : this, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a `_.range` or `_.rangeRight` function.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new range function.\\n */\\n function createRange(fromRight) {\\n return function(start, end, step) {\\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\\n end = step = undefined;\\n }\\n // Ensure the sign of `-0` is preserved.\\n start = toFinite(start);\\n if (end === undefined) {\\n end = start;\\n start = 0;\\n } else {\\n end = toFinite(end);\\n }\\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\\n return baseRange(start, end, step, fromRight);\\n };\\n }\\n\\n /**\\n * Creates a function that performs a relational operation on two values.\\n *\\n * @private\\n * @param {Function} operator The function to perform the operation.\\n * @returns {Function} Returns the new relational operation function.\\n */\\n function createRelationalOperation(operator) {\\n return function(value, other) {\\n if (!(typeof value == 'string' && typeof other == 'string')) {\\n value = toNumber(value);\\n other = toNumber(other);\\n }\\n return operator(value, other);\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to continue currying.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {Function} wrapFunc The function to create the `func` wrapper.\\n * @param {*} placeholder The placeholder value.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to prepend to those provided to\\n * the new function.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\\n var isCurry = bitmask & WRAP_CURRY_FLAG,\\n newHolders = isCurry ? holders : undefined,\\n newHoldersRight = isCurry ? undefined : holders,\\n newPartials = isCurry ? partials : undefined,\\n newPartialsRight = isCurry ? undefined : partials;\\n\\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\\n\\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\\n }\\n var newData = [\\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\\n newHoldersRight, argPos, ary, arity\\n ];\\n\\n var result = wrapFunc.apply(undefined, newData);\\n if (isLaziable(func)) {\\n setData(result, newData);\\n }\\n result.placeholder = placeholder;\\n return setWrapToString(result, func, bitmask);\\n }\\n\\n /**\\n * Creates a function like `_.round`.\\n *\\n * @private\\n * @param {string} methodName The name of the `Math` method to use when rounding.\\n * @returns {Function} Returns the new round function.\\n */\\n function createRound(methodName) {\\n var func = Math[methodName];\\n return function(number, precision) {\\n number = toNumber(number);\\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\\n if (precision) {\\n // Shift with exponential notation to avoid floating-point issues.\\n // See [MDN](https://mdn.io/round#Examples) for more details.\\n var pair = (toString(number) + 'e').split('e'),\\n value = func(pair[0] + 'e' + (+pair[1] + precision));\\n\\n pair = (toString(value) + 'e').split('e');\\n return +(pair[0] + 'e' + (+pair[1] - precision));\\n }\\n return func(number);\\n };\\n }\\n\\n /**\\n * Creates a set object of `values`.\\n *\\n * @private\\n * @param {Array} values The values to add to the set.\\n * @returns {Object} Returns the new set.\\n */\\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\\n return new Set(values);\\n };\\n\\n /**\\n * Creates a `_.toPairs` or `_.toPairsIn` function.\\n *\\n * @private\\n * @param {Function} keysFunc The function to get the keys of a given object.\\n * @returns {Function} Returns the new pairs function.\\n */\\n function createToPairs(keysFunc) {\\n return function(object) {\\n var tag = getTag(object);\\n if (tag == mapTag) {\\n return mapToArray(object);\\n }\\n if (tag == setTag) {\\n return setToPairs(object);\\n }\\n return baseToPairs(object, keysFunc(object));\\n };\\n }\\n\\n /**\\n * Creates a function that either curries or invokes `func` with optional\\n * `this` binding and partially applied arguments.\\n *\\n * @private\\n * @param {Function|string} func The function or method name to wrap.\\n * @param {number} bitmask The bitmask flags.\\n * 1 - `_.bind`\\n * 2 - `_.bindKey`\\n * 4 - `_.curry` or `_.curryRight` of a bound function\\n * 8 - `_.curry`\\n * 16 - `_.curryRight`\\n * 32 - `_.partial`\\n * 64 - `_.partialRight`\\n * 128 - `_.rearg`\\n * 256 - `_.ary`\\n * 512 - `_.flip`\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to be partially applied.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\\n if (!isBindKey && typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n var length = partials ? partials.length : 0;\\n if (!length) {\\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\\n partials = holders = undefined;\\n }\\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\\n arity = arity === undefined ? arity : toInteger(arity);\\n length -= holders ? holders.length : 0;\\n\\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\\n var partialsRight = partials,\\n holdersRight = holders;\\n\\n partials = holders = undefined;\\n }\\n var data = isBindKey ? undefined : getData(func);\\n\\n var newData = [\\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\\n argPos, ary, arity\\n ];\\n\\n if (data) {\\n mergeData(newData, data);\\n }\\n func = newData[0];\\n bitmask = newData[1];\\n thisArg = newData[2];\\n partials = newData[3];\\n holders = newData[4];\\n arity = newData[9] = newData[9] === undefined\\n ? (isBindKey ? 0 : func.length)\\n : nativeMax(newData[9] - length, 0);\\n\\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\\n }\\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\\n var result = createBind(func, bitmask, thisArg);\\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\\n result = createCurry(func, bitmask, arity);\\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\\n result = createPartial(func, bitmask, thisArg, partials);\\n } else {\\n result = createHybrid.apply(undefined, newData);\\n }\\n var setter = data ? baseSetData : setData;\\n return setWrapToString(setter(result, newData), func, bitmask);\\n }\\n\\n /**\\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\\n * of source objects to the destination object for all destination properties\\n * that resolve to `undefined`.\\n *\\n * @private\\n * @param {*} objValue The destination value.\\n * @param {*} srcValue The source value.\\n * @param {string} key The key of the property to assign.\\n * @param {Object} object The parent object of `objValue`.\\n * @returns {*} Returns the value to assign.\\n */\\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\\n if (objValue === undefined ||\\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\\n return srcValue;\\n }\\n return objValue;\\n }\\n\\n /**\\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\\n * objects into destination objects that are passed thru.\\n *\\n * @private\\n * @param {*} objValue The destination value.\\n * @param {*} srcValue The source value.\\n * @param {string} key The key of the property to merge.\\n * @param {Object} object The parent object of `objValue`.\\n * @param {Object} source The parent object of `srcValue`.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n * @returns {*} Returns the value to assign.\\n */\\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\\n if (isObject(objValue) && isObject(srcValue)) {\\n // Recursively merge objects and arrays (susceptible to call stack limits).\\n stack.set(srcValue, objValue);\\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\\n stack['delete'](srcValue);\\n }\\n return objValue;\\n }\\n\\n /**\\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\\n * objects.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @param {string} key The key of the property to inspect.\\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\\n */\\n function customOmitClone(value) {\\n return isPlainObject(value) ? undefined : value;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for arrays with support for\\n * partial deep comparisons.\\n *\\n * @private\\n * @param {Array} array The array to compare.\\n * @param {Array} other The other array to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `array` and `other` objects.\\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\\n */\\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\\n arrLength = array.length,\\n othLength = other.length;\\n\\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\\n return false;\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(array);\\n if (stacked && stack.get(other)) {\\n return stacked == other;\\n }\\n var index = -1,\\n result = true,\\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\\n\\n stack.set(array, other);\\n stack.set(other, array);\\n\\n // Ignore non-index properties.\\n while (++index < arrLength) {\\n var arrValue = array[index],\\n othValue = other[index];\\n\\n if (customizer) {\\n var compared = isPartial\\n ? customizer(othValue, arrValue, index, other, array, stack)\\n : customizer(arrValue, othValue, index, array, other, stack);\\n }\\n if (compared !== undefined) {\\n if (compared) {\\n continue;\\n }\\n result = false;\\n break;\\n }\\n // Recursively compare arrays (susceptible to call stack limits).\\n if (seen) {\\n if (!arraySome(other, function(othValue, othIndex) {\\n if (!cacheHas(seen, othIndex) &&\\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\\n return seen.push(othIndex);\\n }\\n })) {\\n result = false;\\n break;\\n }\\n } else if (!(\\n arrValue === othValue ||\\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\\n )) {\\n result = false;\\n break;\\n }\\n }\\n stack['delete'](array);\\n stack['delete'](other);\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for comparing objects of\\n * the same `toStringTag`.\\n *\\n * **Note:** This function only supports comparing values with tags of\\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {string} tag The `toStringTag` of the objects to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\\n switch (tag) {\\n case dataViewTag:\\n if ((object.byteLength != other.byteLength) ||\\n (object.byteOffset != other.byteOffset)) {\\n return false;\\n }\\n object = object.buffer;\\n other = other.buffer;\\n\\n case arrayBufferTag:\\n if ((object.byteLength != other.byteLength) ||\\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\\n return false;\\n }\\n return true;\\n\\n case boolTag:\\n case dateTag:\\n case numberTag:\\n // Coerce booleans to `1` or `0` and dates to milliseconds.\\n // Invalid dates are coerced to `NaN`.\\n return eq(+object, +other);\\n\\n case errorTag:\\n return object.name == other.name && object.message == other.message;\\n\\n case regexpTag:\\n case stringTag:\\n // Coerce regexes to strings and treat strings, primitives and objects,\\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\\n // for more details.\\n return object == (other + '');\\n\\n case mapTag:\\n var convert = mapToArray;\\n\\n case setTag:\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\\n convert || (convert = setToArray);\\n\\n if (object.size != other.size && !isPartial) {\\n return false;\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(object);\\n if (stacked) {\\n return stacked == other;\\n }\\n bitmask |= COMPARE_UNORDERED_FLAG;\\n\\n // Recursively compare objects (susceptible to call stack limits).\\n stack.set(object, other);\\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\\n stack['delete'](object);\\n return result;\\n\\n case symbolTag:\\n if (symbolValueOf) {\\n return symbolValueOf.call(object) == symbolValueOf.call(other);\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for objects with support for\\n * partial deep comparisons.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\\n objProps = getAllKeys(object),\\n objLength = objProps.length,\\n othProps = getAllKeys(other),\\n othLength = othProps.length;\\n\\n if (objLength != othLength && !isPartial) {\\n return false;\\n }\\n var index = objLength;\\n while (index--) {\\n var key = objProps[index];\\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\\n return false;\\n }\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(object);\\n if (stacked && stack.get(other)) {\\n return stacked == other;\\n }\\n var result = true;\\n stack.set(object, other);\\n stack.set(other, object);\\n\\n var skipCtor = isPartial;\\n while (++index < objLength) {\\n key = objProps[index];\\n var objValue = object[key],\\n othValue = other[key];\\n\\n if (customizer) {\\n var compared = isPartial\\n ? customizer(othValue, objValue, key, other, object, stack)\\n : customizer(objValue, othValue, key, object, other, stack);\\n }\\n // Recursively compare objects (susceptible to call stack limits).\\n if (!(compared === undefined\\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\\n : compared\\n )) {\\n result = false;\\n break;\\n }\\n skipCtor || (skipCtor = key == 'constructor');\\n }\\n if (result && !skipCtor) {\\n var objCtor = object.constructor,\\n othCtor = other.constructor;\\n\\n // Non `Object` object instances with different constructors are not equal.\\n if (objCtor != othCtor &&\\n ('constructor' in object && 'constructor' in other) &&\\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\\n result = false;\\n }\\n }\\n stack['delete'](object);\\n stack['delete'](other);\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseRest` which flattens the rest array.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @returns {Function} Returns the new function.\\n */\\n function flatRest(func) {\\n return setToString(overRest(func, undefined, flatten), func + '');\\n }\\n\\n /**\\n * Creates an array of own enumerable property names and symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function getAllKeys(object) {\\n return baseGetAllKeys(object, keys, getSymbols);\\n }\\n\\n /**\\n * Creates an array of own and inherited enumerable property names and\\n * symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function getAllKeysIn(object) {\\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\\n }\\n\\n /**\\n * Gets metadata for `func`.\\n *\\n * @private\\n * @param {Function} func The function to query.\\n * @returns {*} Returns the metadata for `func`.\\n */\\n var getData = !metaMap ? noop : function(func) {\\n return metaMap.get(func);\\n };\\n\\n /**\\n * Gets the name of `func`.\\n *\\n * @private\\n * @param {Function} func The function to query.\\n * @returns {string} Returns the function name.\\n */\\n function getFuncName(func) {\\n var result = (func.name + ''),\\n array = realNames[result],\\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\\n\\n while (length--) {\\n var data = array[length],\\n otherFunc = data.func;\\n if (otherFunc == null || otherFunc == func) {\\n return data.name;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the argument placeholder value for `func`.\\n *\\n * @private\\n * @param {Function} func The function to inspect.\\n * @returns {*} Returns the placeholder value.\\n */\\n function getHolder(func) {\\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\\n return object.placeholder;\\n }\\n\\n /**\\n * Gets the appropriate \\\"iteratee\\\" function. If `_.iteratee` is customized,\\n * this function returns the custom method, otherwise it returns `baseIteratee`.\\n * If arguments are provided, the chosen function is invoked with them and\\n * its result is returned.\\n *\\n * @private\\n * @param {*} [value] The value to convert to an iteratee.\\n * @param {number} [arity] The arity of the created iteratee.\\n * @returns {Function} Returns the chosen function or its result.\\n */\\n function getIteratee() {\\n var result = lodash.iteratee || iteratee;\\n result = result === iteratee ? baseIteratee : result;\\n return arguments.length ? result(arguments[0], arguments[1]) : result;\\n }\\n\\n /**\\n * Gets the data for `map`.\\n *\\n * @private\\n * @param {Object} map The map to query.\\n * @param {string} key The reference key.\\n * @returns {*} Returns the map data.\\n */\\n function getMapData(map, key) {\\n var data = map.__data__;\\n return isKeyable(key)\\n ? data[typeof key == 'string' ? 'string' : 'hash']\\n : data.map;\\n }\\n\\n /**\\n * Gets the property names, values, and compare flags of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the match data of `object`.\\n */\\n function getMatchData(object) {\\n var result = keys(object),\\n length = result.length;\\n\\n while (length--) {\\n var key = result[length],\\n value = object[key];\\n\\n result[length] = [key, value, isStrictComparable(value)];\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the native function at `key` of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {string} key The key of the method to get.\\n * @returns {*} Returns the function if it's native, else `undefined`.\\n */\\n function getNative(object, key) {\\n var value = getValue(object, key);\\n return baseIsNative(value) ? value : undefined;\\n }\\n\\n /**\\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the raw `toStringTag`.\\n */\\n function getRawTag(value) {\\n var isOwn = hasOwnProperty.call(value, symToStringTag),\\n tag = value[symToStringTag];\\n\\n try {\\n value[symToStringTag] = undefined;\\n var unmasked = true;\\n } catch (e) {}\\n\\n var result = nativeObjectToString.call(value);\\n if (unmasked) {\\n if (isOwn) {\\n value[symToStringTag] = tag;\\n } else {\\n delete value[symToStringTag];\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Creates an array of the own enumerable symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of symbols.\\n */\\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\\n if (object == null) {\\n return [];\\n }\\n object = Object(object);\\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\\n return propertyIsEnumerable.call(object, symbol);\\n });\\n };\\n\\n /**\\n * Creates an array of the own and inherited enumerable symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of symbols.\\n */\\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\\n var result = [];\\n while (object) {\\n arrayPush(result, getSymbols(object));\\n object = getPrototype(object);\\n }\\n return result;\\n };\\n\\n /**\\n * Gets the `toStringTag` of `value`.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the `toStringTag`.\\n */\\n var getTag = baseGetTag;\\n\\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\\n (Map && getTag(new Map) != mapTag) ||\\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\\n (Set && getTag(new Set) != setTag) ||\\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\\n getTag = function(value) {\\n var result = baseGetTag(value),\\n Ctor = result == objectTag ? value.constructor : undefined,\\n ctorString = Ctor ? toSource(Ctor) : '';\\n\\n if (ctorString) {\\n switch (ctorString) {\\n case dataViewCtorString: return dataViewTag;\\n case mapCtorString: return mapTag;\\n case promiseCtorString: return promiseTag;\\n case setCtorString: return setTag;\\n case weakMapCtorString: return weakMapTag;\\n }\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\\n *\\n * @private\\n * @param {number} start The start of the view.\\n * @param {number} end The end of the view.\\n * @param {Array} transforms The transformations to apply to the view.\\n * @returns {Object} Returns an object containing the `start` and `end`\\n * positions of the view.\\n */\\n function getView(start, end, transforms) {\\n var index = -1,\\n length = transforms.length;\\n\\n while (++index < length) {\\n var data = transforms[index],\\n size = data.size;\\n\\n switch (data.type) {\\n case 'drop': start += size; break;\\n case 'dropRight': end -= size; break;\\n case 'take': end = nativeMin(end, start + size); break;\\n case 'takeRight': start = nativeMax(start, end - size); break;\\n }\\n }\\n return { 'start': start, 'end': end };\\n }\\n\\n /**\\n * Extracts wrapper details from the `source` body comment.\\n *\\n * @private\\n * @param {string} source The source to inspect.\\n * @returns {Array} Returns the wrapper details.\\n */\\n function getWrapDetails(source) {\\n var match = source.match(reWrapDetails);\\n return match ? match[1].split(reSplitDetails) : [];\\n }\\n\\n /**\\n * Checks if `path` exists on `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @param {Function} hasFunc The function to check properties.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n */\\n function hasPath(object, path, hasFunc) {\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length,\\n result = false;\\n\\n while (++index < length) {\\n var key = toKey(path[index]);\\n if (!(result = object != null && hasFunc(object, key))) {\\n break;\\n }\\n object = object[key];\\n }\\n if (result || ++index != length) {\\n return result;\\n }\\n length = object == null ? 0 : object.length;\\n return !!length && isLength(length) && isIndex(key, length) &&\\n (isArray(object) || isArguments(object));\\n }\\n\\n /**\\n * Initializes an array clone.\\n *\\n * @private\\n * @param {Array} array The array to clone.\\n * @returns {Array} Returns the initialized clone.\\n */\\n function initCloneArray(array) {\\n var length = array.length,\\n result = array.constructor(length);\\n\\n // Add properties assigned by `RegExp#exec`.\\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\\n result.index = array.index;\\n result.input = array.input;\\n }\\n return result;\\n }\\n\\n /**\\n * Initializes an object clone.\\n *\\n * @private\\n * @param {Object} object The object to clone.\\n * @returns {Object} Returns the initialized clone.\\n */\\n function initCloneObject(object) {\\n return (typeof object.constructor == 'function' && !isPrototype(object))\\n ? baseCreate(getPrototype(object))\\n : {};\\n }\\n\\n /**\\n * Initializes an object clone based on its `toStringTag`.\\n *\\n * **Note:** This function only supports cloning values with tags of\\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\\n *\\n * @private\\n * @param {Object} object The object to clone.\\n * @param {string} tag The `toStringTag` of the object to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the initialized clone.\\n */\\n function initCloneByTag(object, tag, cloneFunc, isDeep) {\\n var Ctor = object.constructor;\\n switch (tag) {\\n case arrayBufferTag:\\n return cloneArrayBuffer(object);\\n\\n case boolTag:\\n case dateTag:\\n return new Ctor(+object);\\n\\n case dataViewTag:\\n return cloneDataView(object, isDeep);\\n\\n case float32Tag: case float64Tag:\\n case int8Tag: case int16Tag: case int32Tag:\\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\\n return cloneTypedArray(object, isDeep);\\n\\n case mapTag:\\n return cloneMap(object, isDeep, cloneFunc);\\n\\n case numberTag:\\n case stringTag:\\n return new Ctor(object);\\n\\n case regexpTag:\\n return cloneRegExp(object);\\n\\n case setTag:\\n return cloneSet(object, isDeep, cloneFunc);\\n\\n case symbolTag:\\n return cloneSymbol(object);\\n }\\n }\\n\\n /**\\n * Inserts wrapper `details` in a comment at the top of the `source` body.\\n *\\n * @private\\n * @param {string} source The source to modify.\\n * @returns {Array} details The details to insert.\\n * @returns {string} Returns the modified source.\\n */\\n function insertWrapDetails(source, details) {\\n var length = details.length;\\n if (!length) {\\n return source;\\n }\\n var lastIndex = length - 1;\\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\\n details = details.join(length > 2 ? ', ' : ' ');\\n return source.replace(reWrapComment, '{\\\\n/* [wrapped with ' + details + '] */\\\\n');\\n }\\n\\n /**\\n * Checks if `value` is a flattenable `arguments` object or array.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\\n */\\n function isFlattenable(value) {\\n return isArray(value) || isArguments(value) ||\\n !!(spreadableSymbol && value && value[spreadableSymbol]);\\n }\\n\\n /**\\n * Checks if `value` is a valid array-like index.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\\n */\\n function isIndex(value, length) {\\n length = length == null ? MAX_SAFE_INTEGER : length;\\n return !!length &&\\n (typeof value == 'number' || reIsUint.test(value)) &&\\n (value > -1 && value % 1 == 0 && value < length);\\n }\\n\\n /**\\n * Checks if the given arguments are from an iteratee call.\\n *\\n * @private\\n * @param {*} value The potential iteratee value argument.\\n * @param {*} index The potential iteratee index or key argument.\\n * @param {*} object The potential iteratee object argument.\\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\\n * else `false`.\\n */\\n function isIterateeCall(value, index, object) {\\n if (!isObject(object)) {\\n return false;\\n }\\n var type = typeof index;\\n if (type == 'number'\\n ? (isArrayLike(object) && isIndex(index, object.length))\\n : (type == 'string' && index in object)\\n ) {\\n return eq(object[index], value);\\n }\\n return false;\\n }\\n\\n /**\\n * Checks if `value` is a property name and not a property path.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @param {Object} [object] The object to query keys on.\\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\\n */\\n function isKey(value, object) {\\n if (isArray(value)) {\\n return false;\\n }\\n var type = typeof value;\\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\\n value == null || isSymbol(value)) {\\n return true;\\n }\\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\\n (object != null && value in Object(object));\\n }\\n\\n /**\\n * Checks if `value` is suitable for use as unique object key.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\\n */\\n function isKeyable(value) {\\n var type = typeof value;\\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\\n ? (value !== '__proto__')\\n : (value === null);\\n }\\n\\n /**\\n * Checks if `func` has a lazy counterpart.\\n *\\n * @private\\n * @param {Function} func The function to check.\\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\\n * else `false`.\\n */\\n function isLaziable(func) {\\n var funcName = getFuncName(func),\\n other = lodash[funcName];\\n\\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\\n return false;\\n }\\n if (func === other) {\\n return true;\\n }\\n var data = getData(other);\\n return !!data && func === data[0];\\n }\\n\\n /**\\n * Checks if `func` has its source masked.\\n *\\n * @private\\n * @param {Function} func The function to check.\\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\\n */\\n function isMasked(func) {\\n return !!maskSrcKey && (maskSrcKey in func);\\n }\\n\\n /**\\n * Checks if `func` is capable of being masked.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\\n */\\n var isMaskable = coreJsData ? isFunction : stubFalse;\\n\\n /**\\n * Checks if `value` is likely a prototype object.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\\n */\\n function isPrototype(value) {\\n var Ctor = value && value.constructor,\\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\\n\\n return value === proto;\\n }\\n\\n /**\\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` if suitable for strict\\n * equality comparisons, else `false`.\\n */\\n function isStrictComparable(value) {\\n return value === value && !isObject(value);\\n }\\n\\n /**\\n * A specialized version of `matchesProperty` for source values suitable\\n * for strict equality comparisons, i.e. `===`.\\n *\\n * @private\\n * @param {string} key The key of the property to get.\\n * @param {*} srcValue The value to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function matchesStrictComparable(key, srcValue) {\\n return function(object) {\\n if (object == null) {\\n return false;\\n }\\n return object[key] === srcValue &&\\n (srcValue !== undefined || (key in Object(object)));\\n };\\n }\\n\\n /**\\n * A specialized version of `_.memoize` which clears the memoized function's\\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\\n *\\n * @private\\n * @param {Function} func The function to have its output memoized.\\n * @returns {Function} Returns the new memoized function.\\n */\\n function memoizeCapped(func) {\\n var result = memoize(func, function(key) {\\n if (cache.size === MAX_MEMOIZE_SIZE) {\\n cache.clear();\\n }\\n return key;\\n });\\n\\n var cache = result.cache;\\n return result;\\n }\\n\\n /**\\n * Merges the function metadata of `source` into `data`.\\n *\\n * Merging metadata reduces the number of wrappers used to invoke a function.\\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\\n * may be applied regardless of execution order. Methods like `_.ary` and\\n * `_.rearg` modify function arguments, making the order in which they are\\n * executed important, preventing the merging of metadata. However, we make\\n * an exception for a safe combined case where curried functions have `_.ary`\\n * and or `_.rearg` applied.\\n *\\n * @private\\n * @param {Array} data The destination metadata.\\n * @param {Array} source The source metadata.\\n * @returns {Array} Returns `data`.\\n */\\n function mergeData(data, source) {\\n var bitmask = data[1],\\n srcBitmask = source[1],\\n newBitmask = bitmask | srcBitmask,\\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\\n\\n var isCombo =\\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\\n\\n // Exit early if metadata can't be merged.\\n if (!(isCommon || isCombo)) {\\n return data;\\n }\\n // Use source `thisArg` if available.\\n if (srcBitmask & WRAP_BIND_FLAG) {\\n data[2] = source[2];\\n // Set when currying a bound function.\\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\\n }\\n // Compose partial arguments.\\n var value = source[3];\\n if (value) {\\n var partials = data[3];\\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\\n }\\n // Compose partial right arguments.\\n value = source[5];\\n if (value) {\\n partials = data[5];\\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\\n }\\n // Use source `argPos` if available.\\n value = source[7];\\n if (value) {\\n data[7] = value;\\n }\\n // Use source `ary` if it's smaller.\\n if (srcBitmask & WRAP_ARY_FLAG) {\\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\\n }\\n // Use source `arity` if one is not provided.\\n if (data[9] == null) {\\n data[9] = source[9];\\n }\\n // Use source `func` and merge bitmasks.\\n data[0] = source[0];\\n data[1] = newBitmask;\\n\\n return data;\\n }\\n\\n /**\\n * This function is like\\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\\n * except that it includes inherited enumerable properties.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function nativeKeysIn(object) {\\n var result = [];\\n if (object != null) {\\n for (var key in Object(object)) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `value` to a string using `Object.prototype.toString`.\\n *\\n * @private\\n * @param {*} value The value to convert.\\n * @returns {string} Returns the converted string.\\n */\\n function objectToString(value) {\\n return nativeObjectToString.call(value);\\n }\\n\\n /**\\n * A specialized version of `baseRest` which transforms the rest array.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @param {Function} transform The rest array transform.\\n * @returns {Function} Returns the new function.\\n */\\n function overRest(func, start, transform) {\\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\\n return function() {\\n var args = arguments,\\n index = -1,\\n length = nativeMax(args.length - start, 0),\\n array = Array(length);\\n\\n while (++index < length) {\\n array[index] = args[start + index];\\n }\\n index = -1;\\n var otherArgs = Array(start + 1);\\n while (++index < start) {\\n otherArgs[index] = args[index];\\n }\\n otherArgs[start] = transform(array);\\n return apply(func, this, otherArgs);\\n };\\n }\\n\\n /**\\n * Gets the parent value at `path` of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} path The path to get the parent value of.\\n * @returns {*} Returns the parent value.\\n */\\n function parent(object, path) {\\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\\n }\\n\\n /**\\n * Reorder `array` according to the specified indexes where the element at\\n * the first index is assigned as the first element, the element at\\n * the second index is assigned as the second element, and so on.\\n *\\n * @private\\n * @param {Array} array The array to reorder.\\n * @param {Array} indexes The arranged array indexes.\\n * @returns {Array} Returns `array`.\\n */\\n function reorder(array, indexes) {\\n var arrLength = array.length,\\n length = nativeMin(indexes.length, arrLength),\\n oldArray = copyArray(array);\\n\\n while (length--) {\\n var index = indexes[length];\\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\\n }\\n return array;\\n }\\n\\n /**\\n * Sets metadata for `func`.\\n *\\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\\n * period of time, it will trip its breaker and transition to an identity\\n * function to avoid garbage collection pauses in V8. See\\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\\n * for more details.\\n *\\n * @private\\n * @param {Function} func The function to associate metadata with.\\n * @param {*} data The metadata.\\n * @returns {Function} Returns `func`.\\n */\\n var setData = shortOut(baseSetData);\\n\\n /**\\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\\n *\\n * @private\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @returns {number|Object} Returns the timer id or timeout object.\\n */\\n var setTimeout = ctxSetTimeout || function(func, wait) {\\n return root.setTimeout(func, wait);\\n };\\n\\n /**\\n * Sets the `toString` method of `func` to return `string`.\\n *\\n * @private\\n * @param {Function} func The function to modify.\\n * @param {Function} string The `toString` result.\\n * @returns {Function} Returns `func`.\\n */\\n var setToString = shortOut(baseSetToString);\\n\\n /**\\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\\n * with wrapper details in a comment at the top of the source body.\\n *\\n * @private\\n * @param {Function} wrapper The function to modify.\\n * @param {Function} reference The reference function.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @returns {Function} Returns `wrapper`.\\n */\\n function setWrapToString(wrapper, reference, bitmask) {\\n var source = (reference + '');\\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\\n }\\n\\n /**\\n * Creates a function that'll short out and invoke `identity` instead\\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\\n * milliseconds.\\n *\\n * @private\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new shortable function.\\n */\\n function shortOut(func) {\\n var count = 0,\\n lastCalled = 0;\\n\\n return function() {\\n var stamp = nativeNow(),\\n remaining = HOT_SPAN - (stamp - lastCalled);\\n\\n lastCalled = stamp;\\n if (remaining > 0) {\\n if (++count >= HOT_COUNT) {\\n return arguments[0];\\n }\\n } else {\\n count = 0;\\n }\\n return func.apply(undefined, arguments);\\n };\\n }\\n\\n /**\\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\\n *\\n * @private\\n * @param {Array} array The array to shuffle.\\n * @param {number} [size=array.length] The size of `array`.\\n * @returns {Array} Returns `array`.\\n */\\n function shuffleSelf(array, size) {\\n var index = -1,\\n length = array.length,\\n lastIndex = length - 1;\\n\\n size = size === undefined ? length : size;\\n while (++index < size) {\\n var rand = baseRandom(index, lastIndex),\\n value = array[rand];\\n\\n array[rand] = array[index];\\n array[index] = value;\\n }\\n array.length = size;\\n return array;\\n }\\n\\n /**\\n * Converts `string` to a property path array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the property path array.\\n */\\n var stringToPath = memoizeCapped(function(string) {\\n var result = [];\\n if (reLeadingDot.test(string)) {\\n result.push('');\\n }\\n string.replace(rePropName, function(match, number, quote, string) {\\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\\n });\\n return result;\\n });\\n\\n /**\\n * Converts `value` to a string key if it's not a string or symbol.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {string|symbol} Returns the key.\\n */\\n function toKey(value) {\\n if (typeof value == 'string' || isSymbol(value)) {\\n return value;\\n }\\n var result = (value + '');\\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\\n }\\n\\n /**\\n * Converts `func` to its source code.\\n *\\n * @private\\n * @param {Function} func The function to convert.\\n * @returns {string} Returns the source code.\\n */\\n function toSource(func) {\\n if (func != null) {\\n try {\\n return funcToString.call(func);\\n } catch (e) {}\\n try {\\n return (func + '');\\n } catch (e) {}\\n }\\n return '';\\n }\\n\\n /**\\n * Updates wrapper `details` based on `bitmask` flags.\\n *\\n * @private\\n * @returns {Array} details The details to modify.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @returns {Array} Returns `details`.\\n */\\n function updateWrapDetails(details, bitmask) {\\n arrayEach(wrapFlags, function(pair) {\\n var value = '_.' + pair[0];\\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\\n details.push(value);\\n }\\n });\\n return details.sort();\\n }\\n\\n /**\\n * Creates a clone of `wrapper`.\\n *\\n * @private\\n * @param {Object} wrapper The wrapper to clone.\\n * @returns {Object} Returns the cloned wrapper.\\n */\\n function wrapperClone(wrapper) {\\n if (wrapper instanceof LazyWrapper) {\\n return wrapper.clone();\\n }\\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\\n result.__actions__ = copyArray(wrapper.__actions__);\\n result.__index__ = wrapper.__index__;\\n result.__values__ = wrapper.__values__;\\n return result;\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an array of elements split into groups the length of `size`.\\n * If `array` can't be split evenly, the final chunk will be the remaining\\n * elements.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to process.\\n * @param {number} [size=1] The length of each chunk\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the new array of chunks.\\n * @example\\n *\\n * _.chunk(['a', 'b', 'c', 'd'], 2);\\n * // => [['a', 'b'], ['c', 'd']]\\n *\\n * _.chunk(['a', 'b', 'c', 'd'], 3);\\n * // => [['a', 'b', 'c'], ['d']]\\n */\\n function chunk(array, size, guard) {\\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\\n size = 1;\\n } else {\\n size = nativeMax(toInteger(size), 0);\\n }\\n var length = array == null ? 0 : array.length;\\n if (!length || size < 1) {\\n return [];\\n }\\n var index = 0,\\n resIndex = 0,\\n result = Array(nativeCeil(length / size));\\n\\n while (index < length) {\\n result[resIndex++] = baseSlice(array, index, (index += size));\\n }\\n return result;\\n }\\n\\n /**\\n * Creates an array with all falsey values removed. The values `false`, `null`,\\n * `0`, `\\\"\\\"`, `undefined`, and `NaN` are falsey.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to compact.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.compact([0, 1, false, 2, '', 3]);\\n * // => [1, 2, 3]\\n */\\n function compact(array) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (value) {\\n result[resIndex++] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Creates a new array concatenating `array` with any additional arrays\\n * and/or values.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to concatenate.\\n * @param {...*} [values] The values to concatenate.\\n * @returns {Array} Returns the new concatenated array.\\n * @example\\n *\\n * var array = [1];\\n * var other = _.concat(array, 2, [3], [[4]]);\\n *\\n * console.log(other);\\n * // => [1, 2, 3, [4]]\\n *\\n * console.log(array);\\n * // => [1]\\n */\\n function concat() {\\n var length = arguments.length;\\n if (!length) {\\n return [];\\n }\\n var args = Array(length - 1),\\n array = arguments[0],\\n index = length;\\n\\n while (index--) {\\n args[index - 1] = arguments[index];\\n }\\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\\n }\\n\\n /**\\n * Creates an array of `array` values not included in the other given arrays\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. The order and references of result values are\\n * determined by the first array.\\n *\\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.without, _.xor\\n * @example\\n *\\n * _.difference([2, 1], [2, 3]);\\n * // => [1]\\n */\\n var difference = baseRest(function(array, values) {\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.difference` except that it accepts `iteratee` which\\n * is invoked for each element of `array` and `values` to generate the criterion\\n * by which they're compared. The order and references of result values are\\n * determined by the first array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\\n * // => [{ 'x': 2 }]\\n */\\n var differenceBy = baseRest(function(array, values) {\\n var iteratee = last(values);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.difference` except that it accepts `comparator`\\n * which is invoked to compare elements of `array` to `values`. The order and\\n * references of result values are determined by the first array. The comparator\\n * is invoked with two arguments: (arrVal, othVal).\\n *\\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n *\\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\\n * // => [{ 'x': 2, 'y': 1 }]\\n */\\n var differenceWith = baseRest(function(array, values) {\\n var comparator = last(values);\\n if (isArrayLikeObject(comparator)) {\\n comparator = undefined;\\n }\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\\n : [];\\n });\\n\\n /**\\n * Creates a slice of `array` with `n` elements dropped from the beginning.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to drop.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.drop([1, 2, 3]);\\n * // => [2, 3]\\n *\\n * _.drop([1, 2, 3], 2);\\n * // => [3]\\n *\\n * _.drop([1, 2, 3], 5);\\n * // => []\\n *\\n * _.drop([1, 2, 3], 0);\\n * // => [1, 2, 3]\\n */\\n function drop(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n return baseSlice(array, n < 0 ? 0 : n, length);\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements dropped from the end.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to drop.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.dropRight([1, 2, 3]);\\n * // => [1, 2]\\n *\\n * _.dropRight([1, 2, 3], 2);\\n * // => [1]\\n *\\n * _.dropRight([1, 2, 3], 5);\\n * // => []\\n *\\n * _.dropRight([1, 2, 3], 0);\\n * // => [1, 2, 3]\\n */\\n function dropRight(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n n = length - n;\\n return baseSlice(array, 0, n < 0 ? 0 : n);\\n }\\n\\n /**\\n * Creates a slice of `array` excluding elements dropped from the end.\\n * Elements are dropped until `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.dropRightWhile(users, function(o) { return !o.active; });\\n * // => objects for ['barney']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.dropRightWhile(users, ['active', false]);\\n * // => objects for ['barney']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.dropRightWhile(users, 'active');\\n * // => objects for ['barney', 'fred', 'pebbles']\\n */\\n function dropRightWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\\n : [];\\n }\\n\\n /**\\n * Creates a slice of `array` excluding elements dropped from the beginning.\\n * Elements are dropped until `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.dropWhile(users, function(o) { return !o.active; });\\n * // => objects for ['pebbles']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.dropWhile(users, ['active', false]);\\n * // => objects for ['pebbles']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.dropWhile(users, 'active');\\n * // => objects for ['barney', 'fred', 'pebbles']\\n */\\n function dropWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), true)\\n : [];\\n }\\n\\n /**\\n * Fills elements of `array` with `value` from `start` up to, but not\\n * including, `end`.\\n *\\n * **Note:** This method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.2.0\\n * @category Array\\n * @param {Array} array The array to fill.\\n * @param {*} value The value to fill `array` with.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _.fill(array, 'a');\\n * console.log(array);\\n * // => ['a', 'a', 'a']\\n *\\n * _.fill(Array(3), 2);\\n * // => [2, 2, 2]\\n *\\n * _.fill([4, 6, 8, 10], '*', 1, 3);\\n * // => [4, '*', '*', 10]\\n */\\n function fill(array, value, start, end) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\\n start = 0;\\n end = length;\\n }\\n return baseFill(array, value, start, end);\\n }\\n\\n /**\\n * This method is like `_.find` except that it returns the index of the first\\n * element `predicate` returns truthy for instead of the element itself.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {number} Returns the index of the found element, else `-1`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\\n * // => 0\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findIndex(users, { 'user': 'fred', 'active': false });\\n * // => 1\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findIndex(users, ['active', false]);\\n * // => 0\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findIndex(users, 'active');\\n * // => 2\\n */\\n function findIndex(array, predicate, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\\n if (index < 0) {\\n index = nativeMax(length + index, 0);\\n }\\n return baseFindIndex(array, getIteratee(predicate, 3), index);\\n }\\n\\n /**\\n * This method is like `_.findIndex` except that it iterates over elements\\n * of `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=array.length-1] The index to search from.\\n * @returns {number} Returns the index of the found element, else `-1`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\\n * // => 2\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\\n * // => 0\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findLastIndex(users, ['active', false]);\\n * // => 2\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findLastIndex(users, 'active');\\n * // => 0\\n */\\n function findLastIndex(array, predicate, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = length - 1;\\n if (fromIndex !== undefined) {\\n index = toInteger(fromIndex);\\n index = fromIndex < 0\\n ? nativeMax(length + index, 0)\\n : nativeMin(index, length - 1);\\n }\\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\\n }\\n\\n /**\\n * Flattens `array` a single level deep.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * _.flatten([1, [2, [3, [4]], 5]]);\\n * // => [1, 2, [3, [4]], 5]\\n */\\n function flatten(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseFlatten(array, 1) : [];\\n }\\n\\n /**\\n * Recursively flattens `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\\n * // => [1, 2, 3, 4, 5]\\n */\\n function flattenDeep(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseFlatten(array, INFINITY) : [];\\n }\\n\\n /**\\n * Recursively flatten `array` up to `depth` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.4.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @param {number} [depth=1] The maximum recursion depth.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * var array = [1, [2, [3, [4]], 5]];\\n *\\n * _.flattenDepth(array, 1);\\n * // => [1, 2, [3, [4]], 5]\\n *\\n * _.flattenDepth(array, 2);\\n * // => [1, 2, 3, [4], 5]\\n */\\n function flattenDepth(array, depth) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n depth = depth === undefined ? 1 : toInteger(depth);\\n return baseFlatten(array, depth);\\n }\\n\\n /**\\n * The inverse of `_.toPairs`; this method returns an object composed\\n * from key-value `pairs`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} pairs The key-value pairs.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.fromPairs([['a', 1], ['b', 2]]);\\n * // => { 'a': 1, 'b': 2 }\\n */\\n function fromPairs(pairs) {\\n var index = -1,\\n length = pairs == null ? 0 : pairs.length,\\n result = {};\\n\\n while (++index < length) {\\n var pair = pairs[index];\\n result[pair[0]] = pair[1];\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the first element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @alias first\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {*} Returns the first element of `array`.\\n * @example\\n *\\n * _.head([1, 2, 3]);\\n * // => 1\\n *\\n * _.head([]);\\n * // => undefined\\n */\\n function head(array) {\\n return (array && array.length) ? array[0] : undefined;\\n }\\n\\n /**\\n * Gets the index at which the first occurrence of `value` is found in `array`\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. If `fromIndex` is negative, it's used as the\\n * offset from the end of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.indexOf([1, 2, 1, 2], 2);\\n * // => 1\\n *\\n * // Search from the `fromIndex`.\\n * _.indexOf([1, 2, 1, 2], 2, 2);\\n * // => 3\\n */\\n function indexOf(array, value, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\\n if (index < 0) {\\n index = nativeMax(length + index, 0);\\n }\\n return baseIndexOf(array, value, index);\\n }\\n\\n /**\\n * Gets all but the last element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.initial([1, 2, 3]);\\n * // => [1, 2]\\n */\\n function initial(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseSlice(array, 0, -1) : [];\\n }\\n\\n /**\\n * Creates an array of unique values that are included in all given arrays\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. The order and references of result values are\\n * determined by the first array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * _.intersection([2, 1], [2, 3]);\\n * // => [2]\\n */\\n var intersection = baseRest(function(arrays) {\\n var mapped = arrayMap(arrays, castArrayLikeObject);\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped)\\n : [];\\n });\\n\\n /**\\n * This method is like `_.intersection` except that it accepts `iteratee`\\n * which is invoked for each element of each `arrays` to generate the criterion\\n * by which they're compared. The order and references of result values are\\n * determined by the first array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [2.1]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }]\\n */\\n var intersectionBy = baseRest(function(arrays) {\\n var iteratee = last(arrays),\\n mapped = arrayMap(arrays, castArrayLikeObject);\\n\\n if (iteratee === last(mapped)) {\\n iteratee = undefined;\\n } else {\\n mapped.pop();\\n }\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.intersection` except that it accepts `comparator`\\n * which is invoked to compare elements of `arrays`. The order and references\\n * of result values are determined by the first array. The comparator is\\n * invoked with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.intersectionWith(objects, others, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }]\\n */\\n var intersectionWith = baseRest(function(arrays) {\\n var comparator = last(arrays),\\n mapped = arrayMap(arrays, castArrayLikeObject);\\n\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n if (comparator) {\\n mapped.pop();\\n }\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped, undefined, comparator)\\n : [];\\n });\\n\\n /**\\n * Converts all elements in `array` into a string separated by `separator`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to convert.\\n * @param {string} [separator=','] The element separator.\\n * @returns {string} Returns the joined string.\\n * @example\\n *\\n * _.join(['a', 'b', 'c'], '~');\\n * // => 'a~b~c'\\n */\\n function join(array, separator) {\\n return array == null ? '' : nativeJoin.call(array, separator);\\n }\\n\\n /**\\n * Gets the last element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {*} Returns the last element of `array`.\\n * @example\\n *\\n * _.last([1, 2, 3]);\\n * // => 3\\n */\\n function last(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? array[length - 1] : undefined;\\n }\\n\\n /**\\n * This method is like `_.indexOf` except that it iterates over elements of\\n * `array` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=array.length-1] The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.lastIndexOf([1, 2, 1, 2], 2);\\n * // => 3\\n *\\n * // Search from the `fromIndex`.\\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\\n * // => 1\\n */\\n function lastIndexOf(array, value, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = length;\\n if (fromIndex !== undefined) {\\n index = toInteger(fromIndex);\\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\\n }\\n return value === value\\n ? strictLastIndexOf(array, value, index)\\n : baseFindIndex(array, baseIsNaN, index, true);\\n }\\n\\n /**\\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\\n * element from the end is returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.11.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=0] The index of the element to return.\\n * @returns {*} Returns the nth element of `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'd'];\\n *\\n * _.nth(array, 1);\\n * // => 'b'\\n *\\n * _.nth(array, -2);\\n * // => 'c';\\n */\\n function nth(array, n) {\\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\\n }\\n\\n /**\\n * Removes all given values from `array` using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\\n * to remove elements from an array by predicate.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {...*} [values] The values to remove.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\\n *\\n * _.pull(array, 'a', 'c');\\n * console.log(array);\\n * // => ['b', 'b']\\n */\\n var pull = baseRest(pullAll);\\n\\n /**\\n * This method is like `_.pull` except that it accepts an array of values to remove.\\n *\\n * **Note:** Unlike `_.difference`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\\n *\\n * _.pullAll(array, ['a', 'c']);\\n * console.log(array);\\n * // => ['b', 'b']\\n */\\n function pullAll(array, values) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values)\\n : array;\\n }\\n\\n /**\\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\\n * invoked for each element of `array` and `values` to generate the criterion\\n * by which they're compared. The iteratee is invoked with one argument: (value).\\n *\\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\\n *\\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\\n * console.log(array);\\n * // => [{ 'x': 2 }]\\n */\\n function pullAllBy(array, values, iteratee) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values, getIteratee(iteratee, 2))\\n : array;\\n }\\n\\n /**\\n * This method is like `_.pullAll` except that it accepts `comparator` which\\n * is invoked to compare elements of `array` to `values`. The comparator is\\n * invoked with two arguments: (arrVal, othVal).\\n *\\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\\n *\\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\\n * console.log(array);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\\n */\\n function pullAllWith(array, values, comparator) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values, undefined, comparator)\\n : array;\\n }\\n\\n /**\\n * Removes elements from `array` corresponding to `indexes` and returns an\\n * array of removed elements.\\n *\\n * **Note:** Unlike `_.at`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\\n * @returns {Array} Returns the new array of removed elements.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'd'];\\n * var pulled = _.pullAt(array, [1, 3]);\\n *\\n * console.log(array);\\n * // => ['a', 'c']\\n *\\n * console.log(pulled);\\n * // => ['b', 'd']\\n */\\n var pullAt = flatRest(function(array, indexes) {\\n var length = array == null ? 0 : array.length,\\n result = baseAt(array, indexes);\\n\\n basePullAt(array, arrayMap(indexes, function(index) {\\n return isIndex(index, length) ? +index : index;\\n }).sort(compareAscending));\\n\\n return result;\\n });\\n\\n /**\\n * Removes all elements from `array` that `predicate` returns truthy for\\n * and returns an array of the removed elements. The predicate is invoked\\n * with three arguments: (value, index, array).\\n *\\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\\n * to pull elements from an array by value.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new array of removed elements.\\n * @example\\n *\\n * var array = [1, 2, 3, 4];\\n * var evens = _.remove(array, function(n) {\\n * return n % 2 == 0;\\n * });\\n *\\n * console.log(array);\\n * // => [1, 3]\\n *\\n * console.log(evens);\\n * // => [2, 4]\\n */\\n function remove(array, predicate) {\\n var result = [];\\n if (!(array && array.length)) {\\n return result;\\n }\\n var index = -1,\\n indexes = [],\\n length = array.length;\\n\\n predicate = getIteratee(predicate, 3);\\n while (++index < length) {\\n var value = array[index];\\n if (predicate(value, index, array)) {\\n result.push(value);\\n indexes.push(index);\\n }\\n }\\n basePullAt(array, indexes);\\n return result;\\n }\\n\\n /**\\n * Reverses `array` so that the first element becomes the last, the second\\n * element becomes the second to last, and so on.\\n *\\n * **Note:** This method mutates `array` and is based on\\n * [`Array#reverse`](https://mdn.io/Array/reverse).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _.reverse(array);\\n * // => [3, 2, 1]\\n *\\n * console.log(array);\\n * // => [3, 2, 1]\\n */\\n function reverse(array) {\\n return array == null ? array : nativeReverse.call(array);\\n }\\n\\n /**\\n * Creates a slice of `array` from `start` up to, but not including, `end`.\\n *\\n * **Note:** This method is used instead of\\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\\n * returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to slice.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function slice(array, start, end) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\\n start = 0;\\n end = length;\\n }\\n else {\\n start = start == null ? 0 : toInteger(start);\\n end = end === undefined ? length : toInteger(end);\\n }\\n return baseSlice(array, start, end);\\n }\\n\\n /**\\n * Uses a binary search to determine the lowest index at which `value`\\n * should be inserted into `array` in order to maintain its sort order.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * _.sortedIndex([30, 50], 40);\\n * // => 1\\n */\\n function sortedIndex(array, value) {\\n return baseSortedIndex(array, value);\\n }\\n\\n /**\\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\\n * which is invoked for `value` and each element of `array` to compute their\\n * sort ranking. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\\n *\\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\\n * // => 0\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\\n * // => 0\\n */\\n function sortedIndexBy(array, value, iteratee) {\\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\\n }\\n\\n /**\\n * This method is like `_.indexOf` except that it performs a binary\\n * search on a sorted `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\\n * // => 1\\n */\\n function sortedIndexOf(array, value) {\\n var length = array == null ? 0 : array.length;\\n if (length) {\\n var index = baseSortedIndex(array, value);\\n if (index < length && eq(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * This method is like `_.sortedIndex` except that it returns the highest\\n * index at which `value` should be inserted into `array` in order to\\n * maintain its sort order.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\\n * // => 4\\n */\\n function sortedLastIndex(array, value) {\\n return baseSortedIndex(array, value, true);\\n }\\n\\n /**\\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\\n * which is invoked for `value` and each element of `array` to compute their\\n * sort ranking. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\\n *\\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\\n * // => 1\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\\n * // => 1\\n */\\n function sortedLastIndexBy(array, value, iteratee) {\\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\\n }\\n\\n /**\\n * This method is like `_.lastIndexOf` except that it performs a binary\\n * search on a sorted `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\\n * // => 3\\n */\\n function sortedLastIndexOf(array, value) {\\n var length = array == null ? 0 : array.length;\\n if (length) {\\n var index = baseSortedIndex(array, value, true) - 1;\\n if (eq(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it's designed and optimized\\n * for sorted arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.sortedUniq([1, 1, 2]);\\n * // => [1, 2]\\n */\\n function sortedUniq(array) {\\n return (array && array.length)\\n ? baseSortedUniq(array)\\n : [];\\n }\\n\\n /**\\n * This method is like `_.uniqBy` except that it's designed and optimized\\n * for sorted arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\\n * // => [1.1, 2.3]\\n */\\n function sortedUniqBy(array, iteratee) {\\n return (array && array.length)\\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\\n : [];\\n }\\n\\n /**\\n * Gets all but the first element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.tail([1, 2, 3]);\\n * // => [2, 3]\\n */\\n function tail(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseSlice(array, 1, length) : [];\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements taken from the beginning.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to take.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.take([1, 2, 3]);\\n * // => [1]\\n *\\n * _.take([1, 2, 3], 2);\\n * // => [1, 2]\\n *\\n * _.take([1, 2, 3], 5);\\n * // => [1, 2, 3]\\n *\\n * _.take([1, 2, 3], 0);\\n * // => []\\n */\\n function take(array, n, guard) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n return baseSlice(array, 0, n < 0 ? 0 : n);\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements taken from the end.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to take.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.takeRight([1, 2, 3]);\\n * // => [3]\\n *\\n * _.takeRight([1, 2, 3], 2);\\n * // => [2, 3]\\n *\\n * _.takeRight([1, 2, 3], 5);\\n * // => [1, 2, 3]\\n *\\n * _.takeRight([1, 2, 3], 0);\\n * // => []\\n */\\n function takeRight(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n n = length - n;\\n return baseSlice(array, n < 0 ? 0 : n, length);\\n }\\n\\n /**\\n * Creates a slice of `array` with elements taken from the end. Elements are\\n * taken until `predicate` returns falsey. The predicate is invoked with\\n * three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.takeRightWhile(users, function(o) { return !o.active; });\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\\n * // => objects for ['pebbles']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.takeRightWhile(users, ['active', false]);\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.takeRightWhile(users, 'active');\\n * // => []\\n */\\n function takeRightWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\\n : [];\\n }\\n\\n /**\\n * Creates a slice of `array` with elements taken from the beginning. Elements\\n * are taken until `predicate` returns falsey. The predicate is invoked with\\n * three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.takeWhile(users, function(o) { return !o.active; });\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.takeWhile(users, ['active', false]);\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.takeWhile(users, 'active');\\n * // => []\\n */\\n function takeWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3))\\n : [];\\n }\\n\\n /**\\n * Creates an array of unique values, in order, from all given arrays using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * _.union([2], [1, 2]);\\n * // => [2, 1]\\n */\\n var union = baseRest(function(arrays) {\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\\n });\\n\\n /**\\n * This method is like `_.union` except that it accepts `iteratee` which is\\n * invoked for each element of each `arrays` to generate the criterion by\\n * which uniqueness is computed. Result values are chosen from the first\\n * array in which the value occurs. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\\n * // => [2.1, 1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }, { 'x': 2 }]\\n */\\n var unionBy = baseRest(function(arrays) {\\n var iteratee = last(arrays);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\\n });\\n\\n /**\\n * This method is like `_.union` except that it accepts `comparator` which\\n * is invoked to compare elements of `arrays`. Result values are chosen from\\n * the first array in which the value occurs. The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.unionWith(objects, others, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\\n */\\n var unionWith = baseRest(function(arrays) {\\n var comparator = last(arrays);\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\\n });\\n\\n /**\\n * Creates a duplicate-free version of an array, using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons, in which only the first occurrence of each element\\n * is kept. The order of result values is determined by the order they occur\\n * in the array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.uniq([2, 1, 2]);\\n * // => [2, 1]\\n */\\n function uniq(array) {\\n return (array && array.length) ? baseUniq(array) : [];\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it accepts `iteratee` which is\\n * invoked for each element in `array` to generate the criterion by which\\n * uniqueness is computed. The order of result values is determined by the\\n * order they occur in the array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\\n * // => [2.1, 1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }, { 'x': 2 }]\\n */\\n function uniqBy(array, iteratee) {\\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it accepts `comparator` which\\n * is invoked to compare elements of `array`. The order of result values is\\n * determined by the order they occur in the array.The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.uniqWith(objects, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\\n */\\n function uniqWith(array, comparator) {\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\\n }\\n\\n /**\\n * This method is like `_.zip` except that it accepts an array of grouped\\n * elements and creates an array regrouping the elements to their pre-zip\\n * configuration.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.2.0\\n * @category Array\\n * @param {Array} array The array of grouped elements to process.\\n * @returns {Array} Returns the new array of regrouped elements.\\n * @example\\n *\\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\\n * // => [['a', 1, true], ['b', 2, false]]\\n *\\n * _.unzip(zipped);\\n * // => [['a', 'b'], [1, 2], [true, false]]\\n */\\n function unzip(array) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n var length = 0;\\n array = arrayFilter(array, function(group) {\\n if (isArrayLikeObject(group)) {\\n length = nativeMax(group.length, length);\\n return true;\\n }\\n });\\n return baseTimes(length, function(index) {\\n return arrayMap(array, baseProperty(index));\\n });\\n }\\n\\n /**\\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\\n * how regrouped values should be combined. The iteratee is invoked with the\\n * elements of each group: (...group).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Array\\n * @param {Array} array The array of grouped elements to process.\\n * @param {Function} [iteratee=_.identity] The function to combine\\n * regrouped values.\\n * @returns {Array} Returns the new array of regrouped elements.\\n * @example\\n *\\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\\n * // => [[1, 10, 100], [2, 20, 200]]\\n *\\n * _.unzipWith(zipped, _.add);\\n * // => [3, 30, 300]\\n */\\n function unzipWith(array, iteratee) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n var result = unzip(array);\\n if (iteratee == null) {\\n return result;\\n }\\n return arrayMap(result, function(group) {\\n return apply(iteratee, undefined, group);\\n });\\n }\\n\\n /**\\n * Creates an array excluding all given values using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * **Note:** Unlike `_.pull`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...*} [values] The values to exclude.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.difference, _.xor\\n * @example\\n *\\n * _.without([2, 1, 2, 3], 1, 2);\\n * // => [3]\\n */\\n var without = baseRest(function(array, values) {\\n return isArrayLikeObject(array)\\n ? baseDifference(array, values)\\n : [];\\n });\\n\\n /**\\n * Creates an array of unique values that is the\\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\\n * of the given arrays. The order of result values is determined by the order\\n * they occur in the arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.difference, _.without\\n * @example\\n *\\n * _.xor([2, 1], [2, 3]);\\n * // => [1, 3]\\n */\\n var xor = baseRest(function(arrays) {\\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\\n });\\n\\n /**\\n * This method is like `_.xor` except that it accepts `iteratee` which is\\n * invoked for each element of each `arrays` to generate the criterion by\\n * which by which they're compared. The order of result values is determined\\n * by the order they occur in the arrays. The iteratee is invoked with one\\n * argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [1.2, 3.4]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 2 }]\\n */\\n var xorBy = baseRest(function(arrays) {\\n var iteratee = last(arrays);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\\n });\\n\\n /**\\n * This method is like `_.xor` except that it accepts `comparator` which is\\n * invoked to compare elements of `arrays`. The order of result values is\\n * determined by the order they occur in the arrays. The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.xorWith(objects, others, _.isEqual);\\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\\n */\\n var xorWith = baseRest(function(arrays) {\\n var comparator = last(arrays);\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\\n });\\n\\n /**\\n * Creates an array of grouped elements, the first of which contains the\\n * first elements of the given arrays, the second of which contains the\\n * second elements of the given arrays, and so on.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to process.\\n * @returns {Array} Returns the new array of grouped elements.\\n * @example\\n *\\n * _.zip(['a', 'b'], [1, 2], [true, false]);\\n * // => [['a', 1, true], ['b', 2, false]]\\n */\\n var zip = baseRest(unzip);\\n\\n /**\\n * This method is like `_.fromPairs` except that it accepts two arrays,\\n * one of property identifiers and one of corresponding values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.4.0\\n * @category Array\\n * @param {Array} [props=[]] The property identifiers.\\n * @param {Array} [values=[]] The property values.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.zipObject(['a', 'b'], [1, 2]);\\n * // => { 'a': 1, 'b': 2 }\\n */\\n function zipObject(props, values) {\\n return baseZipObject(props || [], values || [], assignValue);\\n }\\n\\n /**\\n * This method is like `_.zipObject` except that it supports property paths.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.1.0\\n * @category Array\\n * @param {Array} [props=[]] The property identifiers.\\n * @param {Array} [values=[]] The property values.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\\n */\\n function zipObjectDeep(props, values) {\\n return baseZipObject(props || [], values || [], baseSet);\\n }\\n\\n /**\\n * This method is like `_.zip` except that it accepts `iteratee` to specify\\n * how grouped values should be combined. The iteratee is invoked with the\\n * elements of each group: (...group).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to process.\\n * @param {Function} [iteratee=_.identity] The function to combine\\n * grouped values.\\n * @returns {Array} Returns the new array of grouped elements.\\n * @example\\n *\\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\\n * return a + b + c;\\n * });\\n * // => [111, 222]\\n */\\n var zipWith = baseRest(function(arrays) {\\n var length = arrays.length,\\n iteratee = length > 1 ? arrays[length - 1] : undefined;\\n\\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\\n return unzipWith(arrays, iteratee);\\n });\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\\n * chain sequences enabled. The result of such sequences must be unwrapped\\n * with `_#value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.3.0\\n * @category Seq\\n * @param {*} value The value to wrap.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'pebbles', 'age': 1 }\\n * ];\\n *\\n * var youngest = _\\n * .chain(users)\\n * .sortBy('age')\\n * .map(function(o) {\\n * return o.user + ' is ' + o.age;\\n * })\\n * .head()\\n * .value();\\n * // => 'pebbles is 1'\\n */\\n function chain(value) {\\n var result = lodash(value);\\n result.__chain__ = true;\\n return result;\\n }\\n\\n /**\\n * This method invokes `interceptor` and returns `value`. The interceptor\\n * is invoked with one argument; (value). The purpose of this method is to\\n * \\\"tap into\\\" a method chain sequence in order to modify intermediate results.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @param {*} value The value to provide to `interceptor`.\\n * @param {Function} interceptor The function to invoke.\\n * @returns {*} Returns `value`.\\n * @example\\n *\\n * _([1, 2, 3])\\n * .tap(function(array) {\\n * // Mutate input array.\\n * array.pop();\\n * })\\n * .reverse()\\n * .value();\\n * // => [2, 1]\\n */\\n function tap(value, interceptor) {\\n interceptor(value);\\n return value;\\n }\\n\\n /**\\n * This method is like `_.tap` except that it returns the result of `interceptor`.\\n * The purpose of this method is to \\\"pass thru\\\" values replacing intermediate\\n * results in a method chain sequence.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Seq\\n * @param {*} value The value to provide to `interceptor`.\\n * @param {Function} interceptor The function to invoke.\\n * @returns {*} Returns the result of `interceptor`.\\n * @example\\n *\\n * _(' abc ')\\n * .chain()\\n * .trim()\\n * .thru(function(value) {\\n * return [value];\\n * })\\n * .value();\\n * // => ['abc']\\n */\\n function thru(value, interceptor) {\\n return interceptor(value);\\n }\\n\\n /**\\n * This method is the wrapper version of `_.at`.\\n *\\n * @name at\\n * @memberOf _\\n * @since 1.0.0\\n * @category Seq\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\\n *\\n * _(object).at(['a[0].b.c', 'a[1]']).value();\\n * // => [3, 4]\\n */\\n var wrapperAt = flatRest(function(paths) {\\n var length = paths.length,\\n start = length ? paths[0] : 0,\\n value = this.__wrapped__,\\n interceptor = function(object) { return baseAt(object, paths); };\\n\\n if (length > 1 || this.__actions__.length ||\\n !(value instanceof LazyWrapper) || !isIndex(start)) {\\n return this.thru(interceptor);\\n }\\n value = value.slice(start, +start + (length ? 1 : 0));\\n value.__actions__.push({\\n 'func': thru,\\n 'args': [interceptor],\\n 'thisArg': undefined\\n });\\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\\n if (length && !array.length) {\\n array.push(undefined);\\n }\\n return array;\\n });\\n });\\n\\n /**\\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\\n *\\n * @name chain\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 }\\n * ];\\n *\\n * // A sequence without explicit chaining.\\n * _(users).head();\\n * // => { 'user': 'barney', 'age': 36 }\\n *\\n * // A sequence with explicit chaining.\\n * _(users)\\n * .chain()\\n * .head()\\n * .pick('user')\\n * .value();\\n * // => { 'user': 'barney' }\\n */\\n function wrapperChain() {\\n return chain(this);\\n }\\n\\n /**\\n * Executes the chain sequence and returns the wrapped result.\\n *\\n * @name commit\\n * @memberOf _\\n * @since 3.2.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var array = [1, 2];\\n * var wrapped = _(array).push(3);\\n *\\n * console.log(array);\\n * // => [1, 2]\\n *\\n * wrapped = wrapped.commit();\\n * console.log(array);\\n * // => [1, 2, 3]\\n *\\n * wrapped.last();\\n * // => 3\\n *\\n * console.log(array);\\n * // => [1, 2, 3]\\n */\\n function wrapperCommit() {\\n return new LodashWrapper(this.value(), this.__chain__);\\n }\\n\\n /**\\n * Gets the next value on a wrapped object following the\\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\\n *\\n * @name next\\n * @memberOf _\\n * @since 4.0.0\\n * @category Seq\\n * @returns {Object} Returns the next iterator value.\\n * @example\\n *\\n * var wrapped = _([1, 2]);\\n *\\n * wrapped.next();\\n * // => { 'done': false, 'value': 1 }\\n *\\n * wrapped.next();\\n * // => { 'done': false, 'value': 2 }\\n *\\n * wrapped.next();\\n * // => { 'done': true, 'value': undefined }\\n */\\n function wrapperNext() {\\n if (this.__values__ === undefined) {\\n this.__values__ = toArray(this.value());\\n }\\n var done = this.__index__ >= this.__values__.length,\\n value = done ? undefined : this.__values__[this.__index__++];\\n\\n return { 'done': done, 'value': value };\\n }\\n\\n /**\\n * Enables the wrapper to be iterable.\\n *\\n * @name Symbol.iterator\\n * @memberOf _\\n * @since 4.0.0\\n * @category Seq\\n * @returns {Object} Returns the wrapper object.\\n * @example\\n *\\n * var wrapped = _([1, 2]);\\n *\\n * wrapped[Symbol.iterator]() === wrapped;\\n * // => true\\n *\\n * Array.from(wrapped);\\n * // => [1, 2]\\n */\\n function wrapperToIterator() {\\n return this;\\n }\\n\\n /**\\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\\n *\\n * @name plant\\n * @memberOf _\\n * @since 3.2.0\\n * @category Seq\\n * @param {*} value The value to plant.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var wrapped = _([1, 2]).map(square);\\n * var other = wrapped.plant([3, 4]);\\n *\\n * other.value();\\n * // => [9, 16]\\n *\\n * wrapped.value();\\n * // => [1, 4]\\n */\\n function wrapperPlant(value) {\\n var result,\\n parent = this;\\n\\n while (parent instanceof baseLodash) {\\n var clone = wrapperClone(parent);\\n clone.__index__ = 0;\\n clone.__values__ = undefined;\\n if (result) {\\n previous.__wrapped__ = clone;\\n } else {\\n result = clone;\\n }\\n var previous = clone;\\n parent = parent.__wrapped__;\\n }\\n previous.__wrapped__ = value;\\n return result;\\n }\\n\\n /**\\n * This method is the wrapper version of `_.reverse`.\\n *\\n * **Note:** This method mutates the wrapped array.\\n *\\n * @name reverse\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _(array).reverse().value()\\n * // => [3, 2, 1]\\n *\\n * console.log(array);\\n * // => [3, 2, 1]\\n */\\n function wrapperReverse() {\\n var value = this.__wrapped__;\\n if (value instanceof LazyWrapper) {\\n var wrapped = value;\\n if (this.__actions__.length) {\\n wrapped = new LazyWrapper(this);\\n }\\n wrapped = wrapped.reverse();\\n wrapped.__actions__.push({\\n 'func': thru,\\n 'args': [reverse],\\n 'thisArg': undefined\\n });\\n return new LodashWrapper(wrapped, this.__chain__);\\n }\\n return this.thru(reverse);\\n }\\n\\n /**\\n * Executes the chain sequence to resolve the unwrapped value.\\n *\\n * @name value\\n * @memberOf _\\n * @since 0.1.0\\n * @alias toJSON, valueOf\\n * @category Seq\\n * @returns {*} Returns the resolved unwrapped value.\\n * @example\\n *\\n * _([1, 2, 3]).value();\\n * // => [1, 2, 3]\\n */\\n function wrapperValue() {\\n return baseWrapperValue(this.__wrapped__, this.__actions__);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The corresponding value of\\n * each key is the number of times the key was returned by `iteratee`. The\\n * iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\\n * // => { '4': 1, '6': 2 }\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.countBy(['one', 'two', 'three'], 'length');\\n * // => { '3': 2, '5': 1 }\\n */\\n var countBy = createAggregator(function(result, value, key) {\\n if (hasOwnProperty.call(result, key)) {\\n ++result[key];\\n } else {\\n baseAssignValue(result, key, 1);\\n }\\n });\\n\\n /**\\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\\n * Iteration is stopped once `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index|key, collection).\\n *\\n * **Note:** This method returns `true` for\\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\\n * elements of empty collections.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`.\\n * @example\\n *\\n * _.every([true, 1, null, 'yes'], Boolean);\\n * // => false\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': false }\\n * ];\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.every(users, { 'user': 'barney', 'active': false });\\n * // => false\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.every(users, ['active', false]);\\n * // => true\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.every(users, 'active');\\n * // => false\\n */\\n function every(collection, predicate, guard) {\\n var func = isArray(collection) ? arrayEvery : baseEvery;\\n if (guard && isIterateeCall(collection, predicate, guard)) {\\n predicate = undefined;\\n }\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Iterates over elements of `collection`, returning an array of all elements\\n * `predicate` returns truthy for. The predicate is invoked with three\\n * arguments: (value, index|key, collection).\\n *\\n * **Note:** Unlike `_.remove`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n * @see _.reject\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': true },\\n * { 'user': 'fred', 'age': 40, 'active': false }\\n * ];\\n *\\n * _.filter(users, function(o) { return !o.active; });\\n * // => objects for ['fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.filter(users, { 'age': 36, 'active': true });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.filter(users, ['active', false]);\\n * // => objects for ['fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.filter(users, 'active');\\n * // => objects for ['barney']\\n */\\n function filter(collection, predicate) {\\n var func = isArray(collection) ? arrayFilter : baseFilter;\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Iterates over elements of `collection`, returning the first element\\n * `predicate` returns truthy for. The predicate is invoked with three\\n * arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {*} Returns the matched element, else `undefined`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': true },\\n * { 'user': 'fred', 'age': 40, 'active': false },\\n * { 'user': 'pebbles', 'age': 1, 'active': true }\\n * ];\\n *\\n * _.find(users, function(o) { return o.age < 40; });\\n * // => object for 'barney'\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.find(users, { 'age': 1, 'active': true });\\n * // => object for 'pebbles'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.find(users, ['active', false]);\\n * // => object for 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.find(users, 'active');\\n * // => object for 'barney'\\n */\\n var find = createFind(findIndex);\\n\\n /**\\n * This method is like `_.find` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=collection.length-1] The index to search from.\\n * @returns {*} Returns the matched element, else `undefined`.\\n * @example\\n *\\n * _.findLast([1, 2, 3, 4], function(n) {\\n * return n % 2 == 1;\\n * });\\n * // => 3\\n */\\n var findLast = createFind(findLastIndex);\\n\\n /**\\n * Creates a flattened array of values by running each element in `collection`\\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\\n * with three arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [n, n];\\n * }\\n *\\n * _.flatMap([1, 2], duplicate);\\n * // => [1, 1, 2, 2]\\n */\\n function flatMap(collection, iteratee) {\\n return baseFlatten(map(collection, iteratee), 1);\\n }\\n\\n /**\\n * This method is like `_.flatMap` except that it recursively flattens the\\n * mapped results.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.7.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [[[n, n]]];\\n * }\\n *\\n * _.flatMapDeep([1, 2], duplicate);\\n * // => [1, 1, 2, 2]\\n */\\n function flatMapDeep(collection, iteratee) {\\n return baseFlatten(map(collection, iteratee), INFINITY);\\n }\\n\\n /**\\n * This method is like `_.flatMap` except that it recursively flattens the\\n * mapped results up to `depth` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.7.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {number} [depth=1] The maximum recursion depth.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [[[n, n]]];\\n * }\\n *\\n * _.flatMapDepth([1, 2], duplicate, 2);\\n * // => [[1, 1], [2, 2]]\\n */\\n function flatMapDepth(collection, iteratee, depth) {\\n depth = depth === undefined ? 1 : toInteger(depth);\\n return baseFlatten(map(collection, iteratee), depth);\\n }\\n\\n /**\\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\\n * The iteratee is invoked with three arguments: (value, index|key, collection).\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * **Note:** As with other \\\"Collections\\\" methods, objects with a \\\"length\\\"\\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\\n * or `_.forOwn` for object iteration.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @alias each\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n * @see _.forEachRight\\n * @example\\n *\\n * _.forEach([1, 2], function(value) {\\n * console.log(value);\\n * });\\n * // => Logs `1` then `2`.\\n *\\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\\n */\\n function forEach(collection, iteratee) {\\n var func = isArray(collection) ? arrayEach : baseEach;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.forEach` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @alias eachRight\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n * @see _.forEach\\n * @example\\n *\\n * _.forEachRight([1, 2], function(value) {\\n * console.log(value);\\n * });\\n * // => Logs `2` then `1`.\\n */\\n function forEachRight(collection, iteratee) {\\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The order of grouped values\\n * is determined by the order they occur in `collection`. The corresponding\\n * value of each key is an array of elements responsible for generating the\\n * key. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\\n * // => { '4': [4.2], '6': [6.1, 6.3] }\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.groupBy(['one', 'two', 'three'], 'length');\\n * // => { '3': ['one', 'two'], '5': ['three'] }\\n */\\n var groupBy = createAggregator(function(result, value, key) {\\n if (hasOwnProperty.call(result, key)) {\\n result[key].push(value);\\n } else {\\n baseAssignValue(result, key, [value]);\\n }\\n });\\n\\n /**\\n * Checks if `value` is in `collection`. If `collection` is a string, it's\\n * checked for a substring of `value`, otherwise\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\\n * the offset from the end of `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object|string} collection The collection to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\\n * @example\\n *\\n * _.includes([1, 2, 3], 1);\\n * // => true\\n *\\n * _.includes([1, 2, 3], 1, 2);\\n * // => false\\n *\\n * _.includes({ 'a': 1, 'b': 2 }, 1);\\n * // => true\\n *\\n * _.includes('abcd', 'bc');\\n * // => true\\n */\\n function includes(collection, value, fromIndex, guard) {\\n collection = isArrayLike(collection) ? collection : values(collection);\\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\\n\\n var length = collection.length;\\n if (fromIndex < 0) {\\n fromIndex = nativeMax(length + fromIndex, 0);\\n }\\n return isString(collection)\\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\\n }\\n\\n /**\\n * Invokes the method at `path` of each element in `collection`, returning\\n * an array of the results of each invoked method. Any additional arguments\\n * are provided to each invoked method. If `path` is a function, it's invoked\\n * for, and `this` bound to, each element in `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Array|Function|string} path The path of the method to invoke or\\n * the function invoked per iteration.\\n * @param {...*} [args] The arguments to invoke each method with.\\n * @returns {Array} Returns the array of results.\\n * @example\\n *\\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\\n * // => [[1, 5, 7], [1, 2, 3]]\\n *\\n * _.invokeMap([123, 456], String.prototype.split, '');\\n * // => [['1', '2', '3'], ['4', '5', '6']]\\n */\\n var invokeMap = baseRest(function(collection, path, args) {\\n var index = -1,\\n isFunc = typeof path == 'function',\\n result = isArrayLike(collection) ? Array(collection.length) : [];\\n\\n baseEach(collection, function(value) {\\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\\n });\\n return result;\\n });\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The corresponding value of\\n * each key is the last element responsible for generating the key. The\\n * iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * var array = [\\n * { 'dir': 'left', 'code': 97 },\\n * { 'dir': 'right', 'code': 100 }\\n * ];\\n *\\n * _.keyBy(array, function(o) {\\n * return String.fromCharCode(o.code);\\n * });\\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\\n *\\n * _.keyBy(array, 'dir');\\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\\n */\\n var keyBy = createAggregator(function(result, value, key) {\\n baseAssignValue(result, key, value);\\n });\\n\\n /**\\n * Creates an array of values by running each element in `collection` thru\\n * `iteratee`. The iteratee is invoked with three arguments:\\n * (value, index|key, collection).\\n *\\n * Many lodash methods are guarded to work as iteratees for methods like\\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\\n *\\n * The guarded methods are:\\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * _.map([4, 8], square);\\n * // => [16, 64]\\n *\\n * _.map({ 'a': 4, 'b': 8 }, square);\\n * // => [16, 64] (iteration order is not guaranteed)\\n *\\n * var users = [\\n * { 'user': 'barney' },\\n * { 'user': 'fred' }\\n * ];\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.map(users, 'user');\\n * // => ['barney', 'fred']\\n */\\n function map(collection, iteratee) {\\n var func = isArray(collection) ? arrayMap : baseMap;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.sortBy` except that it allows specifying the sort\\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\\n * are sorted in ascending order. Otherwise, specify an order of \\\"desc\\\" for\\n * descending or \\\"asc\\\" for ascending sort order of corresponding values.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\\n * The iteratees to sort by.\\n * @param {string[]} [orders] The sort orders of `iteratees`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\\n * @returns {Array} Returns the new sorted array.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'fred', 'age': 48 },\\n * { 'user': 'barney', 'age': 34 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'barney', 'age': 36 }\\n * ];\\n *\\n * // Sort by `user` in ascending order and by `age` in descending order.\\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\\n */\\n function orderBy(collection, iteratees, orders, guard) {\\n if (collection == null) {\\n return [];\\n }\\n if (!isArray(iteratees)) {\\n iteratees = iteratees == null ? [] : [iteratees];\\n }\\n orders = guard ? undefined : orders;\\n if (!isArray(orders)) {\\n orders = orders == null ? [] : [orders];\\n }\\n return baseOrderBy(collection, iteratees, orders);\\n }\\n\\n /**\\n * Creates an array of elements split into two groups, the first of which\\n * contains elements `predicate` returns truthy for, the second of which\\n * contains elements `predicate` returns falsey for. The predicate is\\n * invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the array of grouped elements.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': true },\\n * { 'user': 'pebbles', 'age': 1, 'active': false }\\n * ];\\n *\\n * _.partition(users, function(o) { return o.active; });\\n * // => objects for [['fred'], ['barney', 'pebbles']]\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.partition(users, { 'age': 1, 'active': false });\\n * // => objects for [['pebbles'], ['barney', 'fred']]\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.partition(users, ['active', false]);\\n * // => objects for [['barney', 'pebbles'], ['fred']]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.partition(users, 'active');\\n * // => objects for [['fred'], ['barney', 'pebbles']]\\n */\\n var partition = createAggregator(function(result, value, key) {\\n result[key ? 0 : 1].push(value);\\n }, function() { return [[], []]; });\\n\\n /**\\n * Reduces `collection` to a value which is the accumulated result of running\\n * each element in `collection` thru `iteratee`, where each successive\\n * invocation is supplied the return value of the previous. If `accumulator`\\n * is not given, the first element of `collection` is used as the initial\\n * value. The iteratee is invoked with four arguments:\\n * (accumulator, value, index|key, collection).\\n *\\n * Many lodash methods are guarded to work as iteratees for methods like\\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\\n *\\n * The guarded methods are:\\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\\n * and `sortBy`\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @returns {*} Returns the accumulated value.\\n * @see _.reduceRight\\n * @example\\n *\\n * _.reduce([1, 2], function(sum, n) {\\n * return sum + n;\\n * }, 0);\\n * // => 3\\n *\\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\\n * (result[value] || (result[value] = [])).push(key);\\n * return result;\\n * }, {});\\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\\n */\\n function reduce(collection, iteratee, accumulator) {\\n var func = isArray(collection) ? arrayReduce : baseReduce,\\n initAccum = arguments.length < 3;\\n\\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\\n }\\n\\n /**\\n * This method is like `_.reduce` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @returns {*} Returns the accumulated value.\\n * @see _.reduce\\n * @example\\n *\\n * var array = [[0, 1], [2, 3], [4, 5]];\\n *\\n * _.reduceRight(array, function(flattened, other) {\\n * return flattened.concat(other);\\n * }, []);\\n * // => [4, 5, 2, 3, 0, 1]\\n */\\n function reduceRight(collection, iteratee, accumulator) {\\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\\n initAccum = arguments.length < 3;\\n\\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\\n }\\n\\n /**\\n * The opposite of `_.filter`; this method returns the elements of `collection`\\n * that `predicate` does **not** return truthy for.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n * @see _.filter\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': true }\\n * ];\\n *\\n * _.reject(users, function(o) { return !o.active; });\\n * // => objects for ['fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.reject(users, { 'age': 40, 'active': true });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.reject(users, ['active', false]);\\n * // => objects for ['fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.reject(users, 'active');\\n * // => objects for ['barney']\\n */\\n function reject(collection, predicate) {\\n var func = isArray(collection) ? arrayFilter : baseFilter;\\n return func(collection, negate(getIteratee(predicate, 3)));\\n }\\n\\n /**\\n * Gets a random element from `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to sample.\\n * @returns {*} Returns the random element.\\n * @example\\n *\\n * _.sample([1, 2, 3, 4]);\\n * // => 2\\n */\\n function sample(collection) {\\n var func = isArray(collection) ? arraySample : baseSample;\\n return func(collection);\\n }\\n\\n /**\\n * Gets `n` random elements at unique keys from `collection` up to the\\n * size of `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to sample.\\n * @param {number} [n=1] The number of elements to sample.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the random elements.\\n * @example\\n *\\n * _.sampleSize([1, 2, 3], 2);\\n * // => [3, 1]\\n *\\n * _.sampleSize([1, 2, 3], 4);\\n * // => [2, 3, 1]\\n */\\n function sampleSize(collection, n, guard) {\\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\\n n = 1;\\n } else {\\n n = toInteger(n);\\n }\\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\\n return func(collection, n);\\n }\\n\\n /**\\n * Creates an array of shuffled values, using a version of the\\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n * @example\\n *\\n * _.shuffle([1, 2, 3, 4]);\\n * // => [4, 1, 3, 2]\\n */\\n function shuffle(collection) {\\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\\n return func(collection);\\n }\\n\\n /**\\n * Gets the size of `collection` by returning its length for array-like\\n * values or the number of own enumerable string keyed properties for objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object|string} collection The collection to inspect.\\n * @returns {number} Returns the collection size.\\n * @example\\n *\\n * _.size([1, 2, 3]);\\n * // => 3\\n *\\n * _.size({ 'a': 1, 'b': 2 });\\n * // => 2\\n *\\n * _.size('pebbles');\\n * // => 7\\n */\\n function size(collection) {\\n if (collection == null) {\\n return 0;\\n }\\n if (isArrayLike(collection)) {\\n return isString(collection) ? stringSize(collection) : collection.length;\\n }\\n var tag = getTag(collection);\\n if (tag == mapTag || tag == setTag) {\\n return collection.size;\\n }\\n return baseKeys(collection).length;\\n }\\n\\n /**\\n * Checks if `predicate` returns truthy for **any** element of `collection`.\\n * Iteration is stopped once `predicate` returns truthy. The predicate is\\n * invoked with three arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n * @example\\n *\\n * _.some([null, 0, 'yes', false], Boolean);\\n * // => true\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false }\\n * ];\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.some(users, { 'user': 'barney', 'active': false });\\n * // => false\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.some(users, ['active', false]);\\n * // => true\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.some(users, 'active');\\n * // => true\\n */\\n function some(collection, predicate, guard) {\\n var func = isArray(collection) ? arraySome : baseSome;\\n if (guard && isIterateeCall(collection, predicate, guard)) {\\n predicate = undefined;\\n }\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Creates an array of elements, sorted in ascending order by the results of\\n * running each element in a collection thru each iteratee. This method\\n * performs a stable sort, that is, it preserves the original sort order of\\n * equal elements. The iteratees are invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\\n * The iteratees to sort by.\\n * @returns {Array} Returns the new sorted array.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'fred', 'age': 48 },\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'barney', 'age': 34 }\\n * ];\\n *\\n * _.sortBy(users, [function(o) { return o.user; }]);\\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\\n *\\n * _.sortBy(users, ['user', 'age']);\\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\\n */\\n var sortBy = baseRest(function(collection, iteratees) {\\n if (collection == null) {\\n return [];\\n }\\n var length = iteratees.length;\\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\\n iteratees = [];\\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\\n iteratees = [iteratees[0]];\\n }\\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\\n });\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Gets the timestamp of the number of milliseconds that have elapsed since\\n * the Unix epoch (1 January 1970 00:00:00 UTC).\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Date\\n * @returns {number} Returns the timestamp.\\n * @example\\n *\\n * _.defer(function(stamp) {\\n * console.log(_.now() - stamp);\\n * }, _.now());\\n * // => Logs the number of milliseconds it took for the deferred invocation.\\n */\\n var now = ctxNow || function() {\\n return root.Date.now();\\n };\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * The opposite of `_.before`; this method creates a function that invokes\\n * `func` once it's called `n` or more times.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {number} n The number of calls before `func` is invoked.\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * var saves = ['profile', 'settings'];\\n *\\n * var done = _.after(saves.length, function() {\\n * console.log('done saving!');\\n * });\\n *\\n * _.forEach(saves, function(type) {\\n * asyncSave({ 'type': type, 'complete': done });\\n * });\\n * // => Logs 'done saving!' after the two async saves have completed.\\n */\\n function after(n, func) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n n = toInteger(n);\\n return function() {\\n if (--n < 1) {\\n return func.apply(this, arguments);\\n }\\n };\\n }\\n\\n /**\\n * Creates a function that invokes `func`, with up to `n` arguments,\\n * ignoring any additional arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to cap arguments for.\\n * @param {number} [n=func.length] The arity cap.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new capped function.\\n * @example\\n *\\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\\n * // => [6, 8, 10]\\n */\\n function ary(func, n, guard) {\\n n = guard ? undefined : n;\\n n = (func && n == null) ? func.length : n;\\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\\n }\\n\\n /**\\n * Creates a function that invokes `func`, with the `this` binding and arguments\\n * of the created function, while it's called less than `n` times. Subsequent\\n * calls to the created function return the result of the last `func` invocation.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {number} n The number of calls at which `func` is no longer invoked.\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * jQuery(element).on('click', _.before(5, addContactToList));\\n * // => Allows adding up to 4 contacts to the list.\\n */\\n function before(n, func) {\\n var result;\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n n = toInteger(n);\\n return function() {\\n if (--n > 0) {\\n result = func.apply(this, arguments);\\n }\\n if (n <= 1) {\\n func = undefined;\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\\n * and `partials` prepended to the arguments it receives.\\n *\\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\\n * may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \\\"length\\\"\\n * property of bound functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to bind.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new bound function.\\n * @example\\n *\\n * function greet(greeting, punctuation) {\\n * return greeting + ' ' + this.user + punctuation;\\n * }\\n *\\n * var object = { 'user': 'fred' };\\n *\\n * var bound = _.bind(greet, object, 'hi');\\n * bound('!');\\n * // => 'hi fred!'\\n *\\n * // Bound with placeholders.\\n * var bound = _.bind(greet, object, _, '!');\\n * bound('hi');\\n * // => 'hi fred!'\\n */\\n var bind = baseRest(function(func, thisArg, partials) {\\n var bitmask = WRAP_BIND_FLAG;\\n if (partials.length) {\\n var holders = replaceHolders(partials, getHolder(bind));\\n bitmask |= WRAP_PARTIAL_FLAG;\\n }\\n return createWrap(func, bitmask, thisArg, partials, holders);\\n });\\n\\n /**\\n * Creates a function that invokes the method at `object[key]` with `partials`\\n * prepended to the arguments it receives.\\n *\\n * This method differs from `_.bind` by allowing bound functions to reference\\n * methods that may be redefined or don't yet exist. See\\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\\n * for more details.\\n *\\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.10.0\\n * @category Function\\n * @param {Object} object The object to invoke the method on.\\n * @param {string} key The key of the method.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new bound function.\\n * @example\\n *\\n * var object = {\\n * 'user': 'fred',\\n * 'greet': function(greeting, punctuation) {\\n * return greeting + ' ' + this.user + punctuation;\\n * }\\n * };\\n *\\n * var bound = _.bindKey(object, 'greet', 'hi');\\n * bound('!');\\n * // => 'hi fred!'\\n *\\n * object.greet = function(greeting, punctuation) {\\n * return greeting + 'ya ' + this.user + punctuation;\\n * };\\n *\\n * bound('!');\\n * // => 'hiya fred!'\\n *\\n * // Bound with placeholders.\\n * var bound = _.bindKey(object, 'greet', _, '!');\\n * bound('hi');\\n * // => 'hiya fred!'\\n */\\n var bindKey = baseRest(function(object, key, partials) {\\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\\n if (partials.length) {\\n var holders = replaceHolders(partials, getHolder(bindKey));\\n bitmask |= WRAP_PARTIAL_FLAG;\\n }\\n return createWrap(key, bitmask, object, partials, holders);\\n });\\n\\n /**\\n * Creates a function that accepts arguments of `func` and either invokes\\n * `func` returning its result, if at least `arity` number of arguments have\\n * been provided, or returns a function that accepts the remaining `func`\\n * arguments, and so on. The arity of `func` may be specified if `func.length`\\n * is not sufficient.\\n *\\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\\n * may be used as a placeholder for provided arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of curried functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Function\\n * @param {Function} func The function to curry.\\n * @param {number} [arity=func.length] The arity of `func`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new curried function.\\n * @example\\n *\\n * var abc = function(a, b, c) {\\n * return [a, b, c];\\n * };\\n *\\n * var curried = _.curry(abc);\\n *\\n * curried(1)(2)(3);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2)(3);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2, 3);\\n * // => [1, 2, 3]\\n *\\n * // Curried with placeholders.\\n * curried(1)(_, 3)(2);\\n * // => [1, 2, 3]\\n */\\n function curry(func, arity, guard) {\\n arity = guard ? undefined : arity;\\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\\n result.placeholder = curry.placeholder;\\n return result;\\n }\\n\\n /**\\n * This method is like `_.curry` except that arguments are applied to `func`\\n * in the manner of `_.partialRight` instead of `_.partial`.\\n *\\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for provided arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of curried functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to curry.\\n * @param {number} [arity=func.length] The arity of `func`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new curried function.\\n * @example\\n *\\n * var abc = function(a, b, c) {\\n * return [a, b, c];\\n * };\\n *\\n * var curried = _.curryRight(abc);\\n *\\n * curried(3)(2)(1);\\n * // => [1, 2, 3]\\n *\\n * curried(2, 3)(1);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2, 3);\\n * // => [1, 2, 3]\\n *\\n * // Curried with placeholders.\\n * curried(3)(1, _)(2);\\n * // => [1, 2, 3]\\n */\\n function curryRight(func, arity, guard) {\\n arity = guard ? undefined : arity;\\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\\n result.placeholder = curryRight.placeholder;\\n return result;\\n }\\n\\n /**\\n * Creates a debounced function that delays invoking `func` until after `wait`\\n * milliseconds have elapsed since the last time the debounced function was\\n * invoked. The debounced function comes with a `cancel` method to cancel\\n * delayed `func` invocations and a `flush` method to immediately invoke them.\\n * Provide `options` to indicate whether `func` should be invoked on the\\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\\n * with the last arguments provided to the debounced function. Subsequent\\n * calls to the debounced function return the result of the last `func`\\n * invocation.\\n *\\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\\n * invoked on the trailing edge of the timeout only if the debounced function\\n * is invoked more than once during the `wait` timeout.\\n *\\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\\n *\\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\\n * for details over the differences between `_.debounce` and `_.throttle`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to debounce.\\n * @param {number} [wait=0] The number of milliseconds to delay.\\n * @param {Object} [options={}] The options object.\\n * @param {boolean} [options.leading=false]\\n * Specify invoking on the leading edge of the timeout.\\n * @param {number} [options.maxWait]\\n * The maximum time `func` is allowed to be delayed before it's invoked.\\n * @param {boolean} [options.trailing=true]\\n * Specify invoking on the trailing edge of the timeout.\\n * @returns {Function} Returns the new debounced function.\\n * @example\\n *\\n * // Avoid costly calculations while the window size is in flux.\\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\\n *\\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\\n * 'leading': true,\\n * 'trailing': false\\n * }));\\n *\\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\\n * var source = new EventSource('/stream');\\n * jQuery(source).on('message', debounced);\\n *\\n * // Cancel the trailing debounced invocation.\\n * jQuery(window).on('popstate', debounced.cancel);\\n */\\n function debounce(func, wait, options) {\\n var lastArgs,\\n lastThis,\\n maxWait,\\n result,\\n timerId,\\n lastCallTime,\\n lastInvokeTime = 0,\\n leading = false,\\n maxing = false,\\n trailing = true;\\n\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n wait = toNumber(wait) || 0;\\n if (isObject(options)) {\\n leading = !!options.leading;\\n maxing = 'maxWait' in options;\\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\\n trailing = 'trailing' in options ? !!options.trailing : trailing;\\n }\\n\\n function invokeFunc(time) {\\n var args = lastArgs,\\n thisArg = lastThis;\\n\\n lastArgs = lastThis = undefined;\\n lastInvokeTime = time;\\n result = func.apply(thisArg, args);\\n return result;\\n }\\n\\n function leadingEdge(time) {\\n // Reset any `maxWait` timer.\\n lastInvokeTime = time;\\n // Start the timer for the trailing edge.\\n timerId = setTimeout(timerExpired, wait);\\n // Invoke the leading edge.\\n return leading ? invokeFunc(time) : result;\\n }\\n\\n function remainingWait(time) {\\n var timeSinceLastCall = time - lastCallTime,\\n timeSinceLastInvoke = time - lastInvokeTime,\\n result = wait - timeSinceLastCall;\\n\\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\\n }\\n\\n function shouldInvoke(time) {\\n var timeSinceLastCall = time - lastCallTime,\\n timeSinceLastInvoke = time - lastInvokeTime;\\n\\n // Either this is the first call, activity has stopped and we're at the\\n // trailing edge, the system time has gone backwards and we're treating\\n // it as the trailing edge, or we've hit the `maxWait` limit.\\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\\n }\\n\\n function timerExpired() {\\n var time = now();\\n if (shouldInvoke(time)) {\\n return trailingEdge(time);\\n }\\n // Restart the timer.\\n timerId = setTimeout(timerExpired, remainingWait(time));\\n }\\n\\n function trailingEdge(time) {\\n timerId = undefined;\\n\\n // Only invoke if we have `lastArgs` which means `func` has been\\n // debounced at least once.\\n if (trailing && lastArgs) {\\n return invokeFunc(time);\\n }\\n lastArgs = lastThis = undefined;\\n return result;\\n }\\n\\n function cancel() {\\n if (timerId !== undefined) {\\n clearTimeout(timerId);\\n }\\n lastInvokeTime = 0;\\n lastArgs = lastCallTime = lastThis = timerId = undefined;\\n }\\n\\n function flush() {\\n return timerId === undefined ? result : trailingEdge(now());\\n }\\n\\n function debounced() {\\n var time = now(),\\n isInvoking = shouldInvoke(time);\\n\\n lastArgs = arguments;\\n lastThis = this;\\n lastCallTime = time;\\n\\n if (isInvoking) {\\n if (timerId === undefined) {\\n return leadingEdge(lastCallTime);\\n }\\n if (maxing) {\\n // Handle invocations in a tight loop.\\n timerId = setTimeout(timerExpired, wait);\\n return invokeFunc(lastCallTime);\\n }\\n }\\n if (timerId === undefined) {\\n timerId = setTimeout(timerExpired, wait);\\n }\\n return result;\\n }\\n debounced.cancel = cancel;\\n debounced.flush = flush;\\n return debounced;\\n }\\n\\n /**\\n * Defers invoking the `func` until the current call stack has cleared. Any\\n * additional arguments are provided to `func` when it's invoked.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to defer.\\n * @param {...*} [args] The arguments to invoke `func` with.\\n * @returns {number} Returns the timer id.\\n * @example\\n *\\n * _.defer(function(text) {\\n * console.log(text);\\n * }, 'deferred');\\n * // => Logs 'deferred' after one millisecond.\\n */\\n var defer = baseRest(function(func, args) {\\n return baseDelay(func, 1, args);\\n });\\n\\n /**\\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\\n * provided to `func` when it's invoked.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @param {...*} [args] The arguments to invoke `func` with.\\n * @returns {number} Returns the timer id.\\n * @example\\n *\\n * _.delay(function(text) {\\n * console.log(text);\\n * }, 1000, 'later');\\n * // => Logs 'later' after one second.\\n */\\n var delay = baseRest(function(func, wait, args) {\\n return baseDelay(func, toNumber(wait) || 0, args);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with arguments reversed.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to flip arguments for.\\n * @returns {Function} Returns the new flipped function.\\n * @example\\n *\\n * var flipped = _.flip(function() {\\n * return _.toArray(arguments);\\n * });\\n *\\n * flipped('a', 'b', 'c', 'd');\\n * // => ['d', 'c', 'b', 'a']\\n */\\n function flip(func) {\\n return createWrap(func, WRAP_FLIP_FLAG);\\n }\\n\\n /**\\n * Creates a function that memoizes the result of `func`. If `resolver` is\\n * provided, it determines the cache key for storing the result based on the\\n * arguments provided to the memoized function. By default, the first argument\\n * provided to the memoized function is used as the map cache key. The `func`\\n * is invoked with the `this` binding of the memoized function.\\n *\\n * **Note:** The cache is exposed as the `cache` property on the memoized\\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\\n * constructor with one whose instances implement the\\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to have its output memoized.\\n * @param {Function} [resolver] The function to resolve the cache key.\\n * @returns {Function} Returns the new memoized function.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n * var other = { 'c': 3, 'd': 4 };\\n *\\n * var values = _.memoize(_.values);\\n * values(object);\\n * // => [1, 2]\\n *\\n * values(other);\\n * // => [3, 4]\\n *\\n * object.a = 2;\\n * values(object);\\n * // => [1, 2]\\n *\\n * // Modify the result cache.\\n * values.cache.set(object, ['a', 'b']);\\n * values(object);\\n * // => ['a', 'b']\\n *\\n * // Replace `_.memoize.Cache`.\\n * _.memoize.Cache = WeakMap;\\n */\\n function memoize(func, resolver) {\\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n var memoized = function() {\\n var args = arguments,\\n key = resolver ? resolver.apply(this, args) : args[0],\\n cache = memoized.cache;\\n\\n if (cache.has(key)) {\\n return cache.get(key);\\n }\\n var result = func.apply(this, args);\\n memoized.cache = cache.set(key, result) || cache;\\n return result;\\n };\\n memoized.cache = new (memoize.Cache || MapCache);\\n return memoized;\\n }\\n\\n // Expose `MapCache`.\\n memoize.Cache = MapCache;\\n\\n /**\\n * Creates a function that negates the result of the predicate `func`. The\\n * `func` predicate is invoked with the `this` binding and arguments of the\\n * created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} predicate The predicate to negate.\\n * @returns {Function} Returns the new negated function.\\n * @example\\n *\\n * function isEven(n) {\\n * return n % 2 == 0;\\n * }\\n *\\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\\n * // => [1, 3, 5]\\n */\\n function negate(predicate) {\\n if (typeof predicate != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n return function() {\\n var args = arguments;\\n switch (args.length) {\\n case 0: return !predicate.call(this);\\n case 1: return !predicate.call(this, args[0]);\\n case 2: return !predicate.call(this, args[0], args[1]);\\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\\n }\\n return !predicate.apply(this, args);\\n };\\n }\\n\\n /**\\n * Creates a function that is restricted to invoking `func` once. Repeat calls\\n * to the function return the value of the first invocation. The `func` is\\n * invoked with the `this` binding and arguments of the created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * var initialize = _.once(createApplication);\\n * initialize();\\n * initialize();\\n * // => `createApplication` is invoked once\\n */\\n function once(func) {\\n return before(2, func);\\n }\\n\\n /**\\n * Creates a function that invokes `func` with its arguments transformed.\\n *\\n * @static\\n * @since 4.0.0\\n * @memberOf _\\n * @category Function\\n * @param {Function} func The function to wrap.\\n * @param {...(Function|Function[])} [transforms=[_.identity]]\\n * The argument transforms.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * function doubled(n) {\\n * return n * 2;\\n * }\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var func = _.overArgs(function(x, y) {\\n * return [x, y];\\n * }, [square, doubled]);\\n *\\n * func(9, 3);\\n * // => [81, 6]\\n *\\n * func(10, 5);\\n * // => [100, 10]\\n */\\n var overArgs = castRest(function(func, transforms) {\\n transforms = (transforms.length == 1 && isArray(transforms[0]))\\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\\n\\n var funcsLength = transforms.length;\\n return baseRest(function(args) {\\n var index = -1,\\n length = nativeMin(args.length, funcsLength);\\n\\n while (++index < length) {\\n args[index] = transforms[index].call(this, args[index]);\\n }\\n return apply(func, this, args);\\n });\\n });\\n\\n /**\\n * Creates a function that invokes `func` with `partials` prepended to the\\n * arguments it receives. This method is like `_.bind` except it does **not**\\n * alter the `this` binding.\\n *\\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of partially\\n * applied functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.2.0\\n * @category Function\\n * @param {Function} func The function to partially apply arguments to.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new partially applied function.\\n * @example\\n *\\n * function greet(greeting, name) {\\n * return greeting + ' ' + name;\\n * }\\n *\\n * var sayHelloTo = _.partial(greet, 'hello');\\n * sayHelloTo('fred');\\n * // => 'hello fred'\\n *\\n * // Partially applied with placeholders.\\n * var greetFred = _.partial(greet, _, 'fred');\\n * greetFred('hi');\\n * // => 'hi fred'\\n */\\n var partial = baseRest(function(func, partials) {\\n var holders = replaceHolders(partials, getHolder(partial));\\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\\n });\\n\\n /**\\n * This method is like `_.partial` except that partially applied arguments\\n * are appended to the arguments it receives.\\n *\\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of partially\\n * applied functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Function\\n * @param {Function} func The function to partially apply arguments to.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new partially applied function.\\n * @example\\n *\\n * function greet(greeting, name) {\\n * return greeting + ' ' + name;\\n * }\\n *\\n * var greetFred = _.partialRight(greet, 'fred');\\n * greetFred('hi');\\n * // => 'hi fred'\\n *\\n * // Partially applied with placeholders.\\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\\n * sayHelloTo('fred');\\n * // => 'hello fred'\\n */\\n var partialRight = baseRest(function(func, partials) {\\n var holders = replaceHolders(partials, getHolder(partialRight));\\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with arguments arranged according\\n * to the specified `indexes` where the argument value at the first index is\\n * provided as the first argument, the argument value at the second index is\\n * provided as the second argument, and so on.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to rearrange arguments for.\\n * @param {...(number|number[])} indexes The arranged argument indexes.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var rearged = _.rearg(function(a, b, c) {\\n * return [a, b, c];\\n * }, [2, 0, 1]);\\n *\\n * rearged('b', 'c', 'a')\\n * // => ['a', 'b', 'c']\\n */\\n var rearg = flatRest(function(func, indexes) {\\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of the\\n * created function and arguments from `start` and beyond provided as\\n * an array.\\n *\\n * **Note:** This method is based on the\\n * [rest parameter](https://mdn.io/rest_parameters).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var say = _.rest(function(what, names) {\\n * return what + ' ' + _.initial(names).join(', ') +\\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\\n * });\\n *\\n * say('hello', 'fred', 'barney', 'pebbles');\\n * // => 'hello fred, barney, & pebbles'\\n */\\n function rest(func, start) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n start = start === undefined ? start : toInteger(start);\\n return baseRest(func, start);\\n }\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of the\\n * create function and an array of arguments much like\\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\\n *\\n * **Note:** This method is based on the\\n * [spread operator](https://mdn.io/spread_operator).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.2.0\\n * @category Function\\n * @param {Function} func The function to spread arguments over.\\n * @param {number} [start=0] The start position of the spread.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var say = _.spread(function(who, what) {\\n * return who + ' says ' + what;\\n * });\\n *\\n * say(['fred', 'hello']);\\n * // => 'fred says hello'\\n *\\n * var numbers = Promise.all([\\n * Promise.resolve(40),\\n * Promise.resolve(36)\\n * ]);\\n *\\n * numbers.then(_.spread(function(x, y) {\\n * return x + y;\\n * }));\\n * // => a Promise of 76\\n */\\n function spread(func, start) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\\n return baseRest(function(args) {\\n var array = args[start],\\n otherArgs = castSlice(args, 0, start);\\n\\n if (array) {\\n arrayPush(otherArgs, array);\\n }\\n return apply(func, this, otherArgs);\\n });\\n }\\n\\n /**\\n * Creates a throttled function that only invokes `func` at most once per\\n * every `wait` milliseconds. The throttled function comes with a `cancel`\\n * method to cancel delayed `func` invocations and a `flush` method to\\n * immediately invoke them. Provide `options` to indicate whether `func`\\n * should be invoked on the leading and/or trailing edge of the `wait`\\n * timeout. The `func` is invoked with the last arguments provided to the\\n * throttled function. Subsequent calls to the throttled function return the\\n * result of the last `func` invocation.\\n *\\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\\n * invoked on the trailing edge of the timeout only if the throttled function\\n * is invoked more than once during the `wait` timeout.\\n *\\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\\n *\\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\\n * for details over the differences between `_.throttle` and `_.debounce`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to throttle.\\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\\n * @param {Object} [options={}] The options object.\\n * @param {boolean} [options.leading=true]\\n * Specify invoking on the leading edge of the timeout.\\n * @param {boolean} [options.trailing=true]\\n * Specify invoking on the trailing edge of the timeout.\\n * @returns {Function} Returns the new throttled function.\\n * @example\\n *\\n * // Avoid excessively updating the position while scrolling.\\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\\n *\\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\\n * jQuery(element).on('click', throttled);\\n *\\n * // Cancel the trailing throttled invocation.\\n * jQuery(window).on('popstate', throttled.cancel);\\n */\\n function throttle(func, wait, options) {\\n var leading = true,\\n trailing = true;\\n\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n if (isObject(options)) {\\n leading = 'leading' in options ? !!options.leading : leading;\\n trailing = 'trailing' in options ? !!options.trailing : trailing;\\n }\\n return debounce(func, wait, {\\n 'leading': leading,\\n 'maxWait': wait,\\n 'trailing': trailing\\n });\\n }\\n\\n /**\\n * Creates a function that accepts up to one argument, ignoring any\\n * additional arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to cap arguments for.\\n * @returns {Function} Returns the new capped function.\\n * @example\\n *\\n * _.map(['6', '8', '10'], _.unary(parseInt));\\n * // => [6, 8, 10]\\n */\\n function unary(func) {\\n return ary(func, 1);\\n }\\n\\n /**\\n * Creates a function that provides `value` to `wrapper` as its first\\n * argument. Any additional arguments provided to the function are appended\\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\\n * binding of the created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {*} value The value to wrap.\\n * @param {Function} [wrapper=identity] The wrapper function.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var p = _.wrap(_.escape, function(func, text) {\\n * return '

' + func(text) + '

';\\n * });\\n *\\n * p('fred, barney, & pebbles');\\n * // => '

fred, barney, & pebbles

'\\n */\\n function wrap(value, wrapper) {\\n return partial(castFunction(wrapper), value);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Casts `value` as an array if it's not one.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.4.0\\n * @category Lang\\n * @param {*} value The value to inspect.\\n * @returns {Array} Returns the cast array.\\n * @example\\n *\\n * _.castArray(1);\\n * // => [1]\\n *\\n * _.castArray({ 'a': 1 });\\n * // => [{ 'a': 1 }]\\n *\\n * _.castArray('abc');\\n * // => ['abc']\\n *\\n * _.castArray(null);\\n * // => [null]\\n *\\n * _.castArray(undefined);\\n * // => [undefined]\\n *\\n * _.castArray();\\n * // => []\\n *\\n * var array = [1, 2, 3];\\n * console.log(_.castArray(array) === array);\\n * // => true\\n */\\n function castArray() {\\n if (!arguments.length) {\\n return [];\\n }\\n var value = arguments[0];\\n return isArray(value) ? value : [value];\\n }\\n\\n /**\\n * Creates a shallow clone of `value`.\\n *\\n * **Note:** This method is loosely based on the\\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\\n * arrays. The own enumerable properties of `arguments` objects are cloned\\n * as plain objects. An empty object is returned for uncloneable values such\\n * as error objects, functions, DOM nodes, and WeakMaps.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to clone.\\n * @returns {*} Returns the cloned value.\\n * @see _.cloneDeep\\n * @example\\n *\\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\\n *\\n * var shallow = _.clone(objects);\\n * console.log(shallow[0] === objects[0]);\\n * // => true\\n */\\n function clone(value) {\\n return baseClone(value, CLONE_SYMBOLS_FLAG);\\n }\\n\\n /**\\n * This method is like `_.clone` except that it accepts `customizer` which\\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\\n * cloning is handled by the method instead. The `customizer` is invoked with\\n * up to four arguments; (value [, index|key, object, stack]).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to clone.\\n * @param {Function} [customizer] The function to customize cloning.\\n * @returns {*} Returns the cloned value.\\n * @see _.cloneDeepWith\\n * @example\\n *\\n * function customizer(value) {\\n * if (_.isElement(value)) {\\n * return value.cloneNode(false);\\n * }\\n * }\\n *\\n * var el = _.cloneWith(document.body, customizer);\\n *\\n * console.log(el === document.body);\\n * // => false\\n * console.log(el.nodeName);\\n * // => 'BODY'\\n * console.log(el.childNodes.length);\\n * // => 0\\n */\\n function cloneWith(value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\\n }\\n\\n /**\\n * This method is like `_.clone` except that it recursively clones `value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Lang\\n * @param {*} value The value to recursively clone.\\n * @returns {*} Returns the deep cloned value.\\n * @see _.clone\\n * @example\\n *\\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\\n *\\n * var deep = _.cloneDeep(objects);\\n * console.log(deep[0] === objects[0]);\\n * // => false\\n */\\n function cloneDeep(value) {\\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\\n }\\n\\n /**\\n * This method is like `_.cloneWith` except that it recursively clones `value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to recursively clone.\\n * @param {Function} [customizer] The function to customize cloning.\\n * @returns {*} Returns the deep cloned value.\\n * @see _.cloneWith\\n * @example\\n *\\n * function customizer(value) {\\n * if (_.isElement(value)) {\\n * return value.cloneNode(true);\\n * }\\n * }\\n *\\n * var el = _.cloneDeepWith(document.body, customizer);\\n *\\n * console.log(el === document.body);\\n * // => false\\n * console.log(el.nodeName);\\n * // => 'BODY'\\n * console.log(el.childNodes.length);\\n * // => 20\\n */\\n function cloneDeepWith(value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\\n }\\n\\n /**\\n * Checks if `object` conforms to `source` by invoking the predicate\\n * properties of `source` with the corresponding property values of `object`.\\n *\\n * **Note:** This method is equivalent to `_.conforms` when `source` is\\n * partially applied.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.14.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n *\\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\\n * // => true\\n *\\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\\n * // => false\\n */\\n function conformsTo(object, source) {\\n return source == null || baseConformsTo(object, source, keys(source));\\n }\\n\\n /**\\n * Performs a\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * comparison between two values to determine if they are equivalent.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1 };\\n * var other = { 'a': 1 };\\n *\\n * _.eq(object, object);\\n * // => true\\n *\\n * _.eq(object, other);\\n * // => false\\n *\\n * _.eq('a', 'a');\\n * // => true\\n *\\n * _.eq('a', Object('a'));\\n * // => false\\n *\\n * _.eq(NaN, NaN);\\n * // => true\\n */\\n function eq(value, other) {\\n return value === other || (value !== value && other !== other);\\n }\\n\\n /**\\n * Checks if `value` is greater than `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\\n * else `false`.\\n * @see _.lt\\n * @example\\n *\\n * _.gt(3, 1);\\n * // => true\\n *\\n * _.gt(3, 3);\\n * // => false\\n *\\n * _.gt(1, 3);\\n * // => false\\n */\\n var gt = createRelationalOperation(baseGt);\\n\\n /**\\n * Checks if `value` is greater than or equal to `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\\n * `other`, else `false`.\\n * @see _.lte\\n * @example\\n *\\n * _.gte(3, 1);\\n * // => true\\n *\\n * _.gte(3, 3);\\n * // => true\\n *\\n * _.gte(1, 3);\\n * // => false\\n */\\n var gte = createRelationalOperation(function(value, other) {\\n return value >= other;\\n });\\n\\n /**\\n * Checks if `value` is likely an `arguments` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\\n * else `false`.\\n * @example\\n *\\n * _.isArguments(function() { return arguments; }());\\n * // => true\\n *\\n * _.isArguments([1, 2, 3]);\\n * // => false\\n */\\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\\n !propertyIsEnumerable.call(value, 'callee');\\n };\\n\\n /**\\n * Checks if `value` is classified as an `Array` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\\n * @example\\n *\\n * _.isArray([1, 2, 3]);\\n * // => true\\n *\\n * _.isArray(document.body.children);\\n * // => false\\n *\\n * _.isArray('abc');\\n * // => false\\n *\\n * _.isArray(_.noop);\\n * // => false\\n */\\n var isArray = Array.isArray;\\n\\n /**\\n * Checks if `value` is classified as an `ArrayBuffer` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\\n * @example\\n *\\n * _.isArrayBuffer(new ArrayBuffer(2));\\n * // => true\\n *\\n * _.isArrayBuffer(new Array(2));\\n * // => false\\n */\\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\\n\\n /**\\n * Checks if `value` is array-like. A value is considered array-like if it's\\n * not a function and has a `value.length` that's an integer greater than or\\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\\n * @example\\n *\\n * _.isArrayLike([1, 2, 3]);\\n * // => true\\n *\\n * _.isArrayLike(document.body.children);\\n * // => true\\n *\\n * _.isArrayLike('abc');\\n * // => true\\n *\\n * _.isArrayLike(_.noop);\\n * // => false\\n */\\n function isArrayLike(value) {\\n return value != null && isLength(value.length) && !isFunction(value);\\n }\\n\\n /**\\n * This method is like `_.isArrayLike` except that it also checks if `value`\\n * is an object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array-like object,\\n * else `false`.\\n * @example\\n *\\n * _.isArrayLikeObject([1, 2, 3]);\\n * // => true\\n *\\n * _.isArrayLikeObject(document.body.children);\\n * // => true\\n *\\n * _.isArrayLikeObject('abc');\\n * // => false\\n *\\n * _.isArrayLikeObject(_.noop);\\n * // => false\\n */\\n function isArrayLikeObject(value) {\\n return isObjectLike(value) && isArrayLike(value);\\n }\\n\\n /**\\n * Checks if `value` is classified as a boolean primitive or object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\\n * @example\\n *\\n * _.isBoolean(false);\\n * // => true\\n *\\n * _.isBoolean(null);\\n * // => false\\n */\\n function isBoolean(value) {\\n return value === true || value === false ||\\n (isObjectLike(value) && baseGetTag(value) == boolTag);\\n }\\n\\n /**\\n * Checks if `value` is a buffer.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\\n * @example\\n *\\n * _.isBuffer(new Buffer(2));\\n * // => true\\n *\\n * _.isBuffer(new Uint8Array(2));\\n * // => false\\n */\\n var isBuffer = nativeIsBuffer || stubFalse;\\n\\n /**\\n * Checks if `value` is classified as a `Date` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\\n * @example\\n *\\n * _.isDate(new Date);\\n * // => true\\n *\\n * _.isDate('Mon April 23 2012');\\n * // => false\\n */\\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\\n\\n /**\\n * Checks if `value` is likely a DOM element.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\\n * @example\\n *\\n * _.isElement(document.body);\\n * // => true\\n *\\n * _.isElement('');\\n * // => false\\n */\\n function isElement(value) {\\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\\n }\\n\\n /**\\n * Checks if `value` is an empty object, collection, map, or set.\\n *\\n * Objects are considered empty if they have no own enumerable string keyed\\n * properties.\\n *\\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\\n * jQuery-like collections are considered empty if they have a `length` of `0`.\\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\\n * @example\\n *\\n * _.isEmpty(null);\\n * // => true\\n *\\n * _.isEmpty(true);\\n * // => true\\n *\\n * _.isEmpty(1);\\n * // => true\\n *\\n * _.isEmpty([1, 2, 3]);\\n * // => false\\n *\\n * _.isEmpty({ 'a': 1 });\\n * // => false\\n */\\n function isEmpty(value) {\\n if (value == null) {\\n return true;\\n }\\n if (isArrayLike(value) &&\\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\\n return !value.length;\\n }\\n var tag = getTag(value);\\n if (tag == mapTag || tag == setTag) {\\n return !value.size;\\n }\\n if (isPrototype(value)) {\\n return !baseKeys(value).length;\\n }\\n for (var key in value) {\\n if (hasOwnProperty.call(value, key)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * Performs a deep comparison between two values to determine if they are\\n * equivalent.\\n *\\n * **Note:** This method supports comparing arrays, array buffers, booleans,\\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\\n * by their own, not inherited, enumerable properties. Functions and DOM\\n * nodes are compared by strict equality, i.e. `===`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1 };\\n * var other = { 'a': 1 };\\n *\\n * _.isEqual(object, other);\\n * // => true\\n *\\n * object === other;\\n * // => false\\n */\\n function isEqual(value, other) {\\n return baseIsEqual(value, other);\\n }\\n\\n /**\\n * This method is like `_.isEqual` except that it accepts `customizer` which\\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\\n * are handled by the method instead. The `customizer` is invoked with up to\\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * function isGreeting(value) {\\n * return /^h(?:i|ello)$/.test(value);\\n * }\\n *\\n * function customizer(objValue, othValue) {\\n * if (isGreeting(objValue) && isGreeting(othValue)) {\\n * return true;\\n * }\\n * }\\n *\\n * var array = ['hello', 'goodbye'];\\n * var other = ['hi', 'goodbye'];\\n *\\n * _.isEqualWith(array, other, customizer);\\n * // => true\\n */\\n function isEqualWith(value, other, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n var result = customizer ? customizer(value, other) : undefined;\\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\\n }\\n\\n /**\\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\\n * `SyntaxError`, `TypeError`, or `URIError` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\\n * @example\\n *\\n * _.isError(new Error);\\n * // => true\\n *\\n * _.isError(Error);\\n * // => false\\n */\\n function isError(value) {\\n if (!isObjectLike(value)) {\\n return false;\\n }\\n var tag = baseGetTag(value);\\n return tag == errorTag || tag == domExcTag ||\\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\\n }\\n\\n /**\\n * Checks if `value` is a finite primitive number.\\n *\\n * **Note:** This method is based on\\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\\n * @example\\n *\\n * _.isFinite(3);\\n * // => true\\n *\\n * _.isFinite(Number.MIN_VALUE);\\n * // => true\\n *\\n * _.isFinite(Infinity);\\n * // => false\\n *\\n * _.isFinite('3');\\n * // => false\\n */\\n function isFinite(value) {\\n return typeof value == 'number' && nativeIsFinite(value);\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Function` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\\n * @example\\n *\\n * _.isFunction(_);\\n * // => true\\n *\\n * _.isFunction(/abc/);\\n * // => false\\n */\\n function isFunction(value) {\\n if (!isObject(value)) {\\n return false;\\n }\\n // The use of `Object#toString` avoids issues with the `typeof` operator\\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\\n var tag = baseGetTag(value);\\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\\n }\\n\\n /**\\n * Checks if `value` is an integer.\\n *\\n * **Note:** This method is based on\\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\\n * @example\\n *\\n * _.isInteger(3);\\n * // => true\\n *\\n * _.isInteger(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isInteger(Infinity);\\n * // => false\\n *\\n * _.isInteger('3');\\n * // => false\\n */\\n function isInteger(value) {\\n return typeof value == 'number' && value == toInteger(value);\\n }\\n\\n /**\\n * Checks if `value` is a valid array-like length.\\n *\\n * **Note:** This method is loosely based on\\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\\n * @example\\n *\\n * _.isLength(3);\\n * // => true\\n *\\n * _.isLength(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isLength(Infinity);\\n * // => false\\n *\\n * _.isLength('3');\\n * // => false\\n */\\n function isLength(value) {\\n return typeof value == 'number' &&\\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\\n }\\n\\n /**\\n * Checks if `value` is the\\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\\n * @example\\n *\\n * _.isObject({});\\n * // => true\\n *\\n * _.isObject([1, 2, 3]);\\n * // => true\\n *\\n * _.isObject(_.noop);\\n * // => true\\n *\\n * _.isObject(null);\\n * // => false\\n */\\n function isObject(value) {\\n var type = typeof value;\\n return value != null && (type == 'object' || type == 'function');\\n }\\n\\n /**\\n * Checks if `value` is object-like. A value is object-like if it's not `null`\\n * and has a `typeof` result of \\\"object\\\".\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\\n * @example\\n *\\n * _.isObjectLike({});\\n * // => true\\n *\\n * _.isObjectLike([1, 2, 3]);\\n * // => true\\n *\\n * _.isObjectLike(_.noop);\\n * // => false\\n *\\n * _.isObjectLike(null);\\n * // => false\\n */\\n function isObjectLike(value) {\\n return value != null && typeof value == 'object';\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Map` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\\n * @example\\n *\\n * _.isMap(new Map);\\n * // => true\\n *\\n * _.isMap(new WeakMap);\\n * // => false\\n */\\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\\n\\n /**\\n * Performs a partial deep comparison between `object` and `source` to\\n * determine if `object` contains equivalent property values.\\n *\\n * **Note:** This method is equivalent to `_.matches` when `source` is\\n * partially applied.\\n *\\n * Partial comparisons will match empty array and empty object `source`\\n * values against any array or object value, respectively. See `_.isEqual`\\n * for a list of supported value comparisons.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n *\\n * _.isMatch(object, { 'b': 2 });\\n * // => true\\n *\\n * _.isMatch(object, { 'b': 1 });\\n * // => false\\n */\\n function isMatch(object, source) {\\n return object === source || baseIsMatch(object, source, getMatchData(source));\\n }\\n\\n /**\\n * This method is like `_.isMatch` except that it accepts `customizer` which\\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\\n * are handled by the method instead. The `customizer` is invoked with five\\n * arguments: (objValue, srcValue, index|key, object, source).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n * @example\\n *\\n * function isGreeting(value) {\\n * return /^h(?:i|ello)$/.test(value);\\n * }\\n *\\n * function customizer(objValue, srcValue) {\\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\\n * return true;\\n * }\\n * }\\n *\\n * var object = { 'greeting': 'hello' };\\n * var source = { 'greeting': 'hi' };\\n *\\n * _.isMatchWith(object, source, customizer);\\n * // => true\\n */\\n function isMatchWith(object, source, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseIsMatch(object, source, getMatchData(source), customizer);\\n }\\n\\n /**\\n * Checks if `value` is `NaN`.\\n *\\n * **Note:** This method is based on\\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\\n * `undefined` and other non-number values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\\n * @example\\n *\\n * _.isNaN(NaN);\\n * // => true\\n *\\n * _.isNaN(new Number(NaN));\\n * // => true\\n *\\n * isNaN(undefined);\\n * // => true\\n *\\n * _.isNaN(undefined);\\n * // => false\\n */\\n function isNaN(value) {\\n // An `NaN` primitive is the only value that is not equal to itself.\\n // Perform the `toStringTag` check first to avoid errors with some\\n // ActiveX objects in IE.\\n return isNumber(value) && value != +value;\\n }\\n\\n /**\\n * Checks if `value` is a pristine native function.\\n *\\n * **Note:** This method can't reliably detect native functions in the presence\\n * of the core-js package because core-js circumvents this kind of detection.\\n * Despite multiple requests, the core-js maintainer has made it clear: any\\n * attempt to fix the detection will be obstructed. As a result, we're left\\n * with little choice but to throw an error. Unfortunately, this also affects\\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\\n * which rely on core-js.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a native function,\\n * else `false`.\\n * @example\\n *\\n * _.isNative(Array.prototype.push);\\n * // => true\\n *\\n * _.isNative(_);\\n * // => false\\n */\\n function isNative(value) {\\n if (isMaskable(value)) {\\n throw new Error(CORE_ERROR_TEXT);\\n }\\n return baseIsNative(value);\\n }\\n\\n /**\\n * Checks if `value` is `null`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\\n * @example\\n *\\n * _.isNull(null);\\n * // => true\\n *\\n * _.isNull(void 0);\\n * // => false\\n */\\n function isNull(value) {\\n return value === null;\\n }\\n\\n /**\\n * Checks if `value` is `null` or `undefined`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\\n * @example\\n *\\n * _.isNil(null);\\n * // => true\\n *\\n * _.isNil(void 0);\\n * // => true\\n *\\n * _.isNil(NaN);\\n * // => false\\n */\\n function isNil(value) {\\n return value == null;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Number` primitive or object.\\n *\\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\\n * classified as numbers, use the `_.isFinite` method.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\\n * @example\\n *\\n * _.isNumber(3);\\n * // => true\\n *\\n * _.isNumber(Number.MIN_VALUE);\\n * // => true\\n *\\n * _.isNumber(Infinity);\\n * // => true\\n *\\n * _.isNumber('3');\\n * // => false\\n */\\n function isNumber(value) {\\n return typeof value == 'number' ||\\n (isObjectLike(value) && baseGetTag(value) == numberTag);\\n }\\n\\n /**\\n * Checks if `value` is a plain object, that is, an object created by the\\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.8.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * _.isPlainObject(new Foo);\\n * // => false\\n *\\n * _.isPlainObject([1, 2, 3]);\\n * // => false\\n *\\n * _.isPlainObject({ 'x': 0, 'y': 0 });\\n * // => true\\n *\\n * _.isPlainObject(Object.create(null));\\n * // => true\\n */\\n function isPlainObject(value) {\\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\\n return false;\\n }\\n var proto = getPrototype(value);\\n if (proto === null) {\\n return true;\\n }\\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\\n funcToString.call(Ctor) == objectCtorString;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `RegExp` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\\n * @example\\n *\\n * _.isRegExp(/abc/);\\n * // => true\\n *\\n * _.isRegExp('/abc/');\\n * // => false\\n */\\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\\n\\n /**\\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\\n * double precision number which isn't the result of a rounded unsafe integer.\\n *\\n * **Note:** This method is based on\\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\\n * @example\\n *\\n * _.isSafeInteger(3);\\n * // => true\\n *\\n * _.isSafeInteger(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isSafeInteger(Infinity);\\n * // => false\\n *\\n * _.isSafeInteger('3');\\n * // => false\\n */\\n function isSafeInteger(value) {\\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Set` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\\n * @example\\n *\\n * _.isSet(new Set);\\n * // => true\\n *\\n * _.isSet(new WeakSet);\\n * // => false\\n */\\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\\n\\n /**\\n * Checks if `value` is classified as a `String` primitive or object.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\\n * @example\\n *\\n * _.isString('abc');\\n * // => true\\n *\\n * _.isString(1);\\n * // => false\\n */\\n function isString(value) {\\n return typeof value == 'string' ||\\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Symbol` primitive or object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\\n * @example\\n *\\n * _.isSymbol(Symbol.iterator);\\n * // => true\\n *\\n * _.isSymbol('abc');\\n * // => false\\n */\\n function isSymbol(value) {\\n return typeof value == 'symbol' ||\\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\\n }\\n\\n /**\\n * Checks if `value` is classified as a typed array.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\\n * @example\\n *\\n * _.isTypedArray(new Uint8Array);\\n * // => true\\n *\\n * _.isTypedArray([]);\\n * // => false\\n */\\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\\n\\n /**\\n * Checks if `value` is `undefined`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\\n * @example\\n *\\n * _.isUndefined(void 0);\\n * // => true\\n *\\n * _.isUndefined(null);\\n * // => false\\n */\\n function isUndefined(value) {\\n return value === undefined;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `WeakMap` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\\n * @example\\n *\\n * _.isWeakMap(new WeakMap);\\n * // => true\\n *\\n * _.isWeakMap(new Map);\\n * // => false\\n */\\n function isWeakMap(value) {\\n return isObjectLike(value) && getTag(value) == weakMapTag;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `WeakSet` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\\n * @example\\n *\\n * _.isWeakSet(new WeakSet);\\n * // => true\\n *\\n * _.isWeakSet(new Set);\\n * // => false\\n */\\n function isWeakSet(value) {\\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\\n }\\n\\n /**\\n * Checks if `value` is less than `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than `other`,\\n * else `false`.\\n * @see _.gt\\n * @example\\n *\\n * _.lt(1, 3);\\n * // => true\\n *\\n * _.lt(3, 3);\\n * // => false\\n *\\n * _.lt(3, 1);\\n * // => false\\n */\\n var lt = createRelationalOperation(baseLt);\\n\\n /**\\n * Checks if `value` is less than or equal to `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than or equal to\\n * `other`, else `false`.\\n * @see _.gte\\n * @example\\n *\\n * _.lte(1, 3);\\n * // => true\\n *\\n * _.lte(3, 3);\\n * // => true\\n *\\n * _.lte(3, 1);\\n * // => false\\n */\\n var lte = createRelationalOperation(function(value, other) {\\n return value <= other;\\n });\\n\\n /**\\n * Converts `value` to an array.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {Array} Returns the converted array.\\n * @example\\n *\\n * _.toArray({ 'a': 1, 'b': 2 });\\n * // => [1, 2]\\n *\\n * _.toArray('abc');\\n * // => ['a', 'b', 'c']\\n *\\n * _.toArray(1);\\n * // => []\\n *\\n * _.toArray(null);\\n * // => []\\n */\\n function toArray(value) {\\n if (!value) {\\n return [];\\n }\\n if (isArrayLike(value)) {\\n return isString(value) ? stringToArray(value) : copyArray(value);\\n }\\n if (symIterator && value[symIterator]) {\\n return iteratorToArray(value[symIterator]());\\n }\\n var tag = getTag(value),\\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\\n\\n return func(value);\\n }\\n\\n /**\\n * Converts `value` to a finite number.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.12.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted number.\\n * @example\\n *\\n * _.toFinite(3.2);\\n * // => 3.2\\n *\\n * _.toFinite(Number.MIN_VALUE);\\n * // => 5e-324\\n *\\n * _.toFinite(Infinity);\\n * // => 1.7976931348623157e+308\\n *\\n * _.toFinite('3.2');\\n * // => 3.2\\n */\\n function toFinite(value) {\\n if (!value) {\\n return value === 0 ? value : 0;\\n }\\n value = toNumber(value);\\n if (value === INFINITY || value === -INFINITY) {\\n var sign = (value < 0 ? -1 : 1);\\n return sign * MAX_INTEGER;\\n }\\n return value === value ? value : 0;\\n }\\n\\n /**\\n * Converts `value` to an integer.\\n *\\n * **Note:** This method is loosely based on\\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toInteger(3.2);\\n * // => 3\\n *\\n * _.toInteger(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toInteger(Infinity);\\n * // => 1.7976931348623157e+308\\n *\\n * _.toInteger('3.2');\\n * // => 3\\n */\\n function toInteger(value) {\\n var result = toFinite(value),\\n remainder = result % 1;\\n\\n return result === result ? (remainder ? result - remainder : result) : 0;\\n }\\n\\n /**\\n * Converts `value` to an integer suitable for use as the length of an\\n * array-like object.\\n *\\n * **Note:** This method is based on\\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toLength(3.2);\\n * // => 3\\n *\\n * _.toLength(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toLength(Infinity);\\n * // => 4294967295\\n *\\n * _.toLength('3.2');\\n * // => 3\\n */\\n function toLength(value) {\\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\\n }\\n\\n /**\\n * Converts `value` to a number.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to process.\\n * @returns {number} Returns the number.\\n * @example\\n *\\n * _.toNumber(3.2);\\n * // => 3.2\\n *\\n * _.toNumber(Number.MIN_VALUE);\\n * // => 5e-324\\n *\\n * _.toNumber(Infinity);\\n * // => Infinity\\n *\\n * _.toNumber('3.2');\\n * // => 3.2\\n */\\n function toNumber(value) {\\n if (typeof value == 'number') {\\n return value;\\n }\\n if (isSymbol(value)) {\\n return NAN;\\n }\\n if (isObject(value)) {\\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\\n value = isObject(other) ? (other + '') : other;\\n }\\n if (typeof value != 'string') {\\n return value === 0 ? value : +value;\\n }\\n value = value.replace(reTrim, '');\\n var isBinary = reIsBinary.test(value);\\n return (isBinary || reIsOctal.test(value))\\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\\n : (reIsBadHex.test(value) ? NAN : +value);\\n }\\n\\n /**\\n * Converts `value` to a plain object flattening inherited enumerable string\\n * keyed properties of `value` to own properties of the plain object.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {Object} Returns the converted plain object.\\n * @example\\n *\\n * function Foo() {\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.assign({ 'a': 1 }, new Foo);\\n * // => { 'a': 1, 'b': 2 }\\n *\\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\\n * // => { 'a': 1, 'b': 2, 'c': 3 }\\n */\\n function toPlainObject(value) {\\n return copyObject(value, keysIn(value));\\n }\\n\\n /**\\n * Converts `value` to a safe integer. A safe integer can be compared and\\n * represented correctly.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toSafeInteger(3.2);\\n * // => 3\\n *\\n * _.toSafeInteger(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toSafeInteger(Infinity);\\n * // => 9007199254740991\\n *\\n * _.toSafeInteger('3.2');\\n * // => 3\\n */\\n function toSafeInteger(value) {\\n return value\\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\\n : (value === 0 ? value : 0);\\n }\\n\\n /**\\n * Converts `value` to a string. An empty string is returned for `null`\\n * and `undefined` values. The sign of `-0` is preserved.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {string} Returns the converted string.\\n * @example\\n *\\n * _.toString(null);\\n * // => ''\\n *\\n * _.toString(-0);\\n * // => '-0'\\n *\\n * _.toString([1, 2, 3]);\\n * // => '1,2,3'\\n */\\n function toString(value) {\\n return value == null ? '' : baseToString(value);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Assigns own enumerable string keyed properties of source objects to the\\n * destination object. Source objects are applied from left to right.\\n * Subsequent sources overwrite property assignments of previous sources.\\n *\\n * **Note:** This method mutates `object` and is loosely based on\\n * [`Object.assign`](https://mdn.io/Object/assign).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.10.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.assignIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * function Bar() {\\n * this.c = 3;\\n * }\\n *\\n * Foo.prototype.b = 2;\\n * Bar.prototype.d = 4;\\n *\\n * _.assign({ 'a': 0 }, new Foo, new Bar);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n var assign = createAssigner(function(object, source) {\\n if (isPrototype(source) || isArrayLike(source)) {\\n copyObject(source, keys(source), object);\\n return;\\n }\\n for (var key in source) {\\n if (hasOwnProperty.call(source, key)) {\\n assignValue(object, key, source[key]);\\n }\\n }\\n });\\n\\n /**\\n * This method is like `_.assign` except that it iterates over own and\\n * inherited source properties.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias extend\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.assign\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * function Bar() {\\n * this.c = 3;\\n * }\\n *\\n * Foo.prototype.b = 2;\\n * Bar.prototype.d = 4;\\n *\\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\\n */\\n var assignIn = createAssigner(function(object, source) {\\n copyObject(source, keysIn(source), object);\\n });\\n\\n /**\\n * This method is like `_.assignIn` except that it accepts `customizer`\\n * which is invoked to produce the assigned values. If `customizer` returns\\n * `undefined`, assignment is handled by the method instead. The `customizer`\\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias extendWith\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @see _.assignWith\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * return _.isUndefined(objValue) ? srcValue : objValue;\\n * }\\n *\\n * var defaults = _.partialRight(_.assignInWith, customizer);\\n *\\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\\n copyObject(source, keysIn(source), object, customizer);\\n });\\n\\n /**\\n * This method is like `_.assign` except that it accepts `customizer`\\n * which is invoked to produce the assigned values. If `customizer` returns\\n * `undefined`, assignment is handled by the method instead. The `customizer`\\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @see _.assignInWith\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * return _.isUndefined(objValue) ? srcValue : objValue;\\n * }\\n *\\n * var defaults = _.partialRight(_.assignWith, customizer);\\n *\\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\\n copyObject(source, keys(source), object, customizer);\\n });\\n\\n /**\\n * Creates an array of values corresponding to `paths` of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Array} Returns the picked values.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\\n *\\n * _.at(object, ['a[0].b.c', 'a[1]']);\\n * // => [3, 4]\\n */\\n var at = flatRest(baseAt);\\n\\n /**\\n * Creates an object that inherits from the `prototype` object. If a\\n * `properties` object is given, its own enumerable string keyed properties\\n * are assigned to the created object.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.3.0\\n * @category Object\\n * @param {Object} prototype The object to inherit from.\\n * @param {Object} [properties] The properties to assign to the object.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * function Shape() {\\n * this.x = 0;\\n * this.y = 0;\\n * }\\n *\\n * function Circle() {\\n * Shape.call(this);\\n * }\\n *\\n * Circle.prototype = _.create(Shape.prototype, {\\n * 'constructor': Circle\\n * });\\n *\\n * var circle = new Circle;\\n * circle instanceof Circle;\\n * // => true\\n *\\n * circle instanceof Shape;\\n * // => true\\n */\\n function create(prototype, properties) {\\n var result = baseCreate(prototype);\\n return properties == null ? result : baseAssign(result, properties);\\n }\\n\\n /**\\n * Assigns own and inherited enumerable string keyed properties of source\\n * objects to the destination object for all destination properties that\\n * resolve to `undefined`. Source objects are applied from left to right.\\n * Once a property is set, additional values of the same property are ignored.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.defaultsDeep\\n * @example\\n *\\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var defaults = baseRest(function(args) {\\n args.push(undefined, customDefaultsAssignIn);\\n return apply(assignInWith, undefined, args);\\n });\\n\\n /**\\n * This method is like `_.defaults` except that it recursively assigns\\n * default properties.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.10.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.defaults\\n * @example\\n *\\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\\n * // => { 'a': { 'b': 2, 'c': 3 } }\\n */\\n var defaultsDeep = baseRest(function(args) {\\n args.push(undefined, customDefaultsMerge);\\n return apply(mergeWith, undefined, args);\\n });\\n\\n /**\\n * This method is like `_.find` except that it returns the key of the first\\n * element `predicate` returns truthy for instead of the element itself.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {string|undefined} Returns the key of the matched element,\\n * else `undefined`.\\n * @example\\n *\\n * var users = {\\n * 'barney': { 'age': 36, 'active': true },\\n * 'fred': { 'age': 40, 'active': false },\\n * 'pebbles': { 'age': 1, 'active': true }\\n * };\\n *\\n * _.findKey(users, function(o) { return o.age < 40; });\\n * // => 'barney' (iteration order is not guaranteed)\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findKey(users, { 'age': 1, 'active': true });\\n * // => 'pebbles'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findKey(users, ['active', false]);\\n * // => 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findKey(users, 'active');\\n * // => 'barney'\\n */\\n function findKey(object, predicate) {\\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\\n }\\n\\n /**\\n * This method is like `_.findKey` except that it iterates over elements of\\n * a collection in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {string|undefined} Returns the key of the matched element,\\n * else `undefined`.\\n * @example\\n *\\n * var users = {\\n * 'barney': { 'age': 36, 'active': true },\\n * 'fred': { 'age': 40, 'active': false },\\n * 'pebbles': { 'age': 1, 'active': true }\\n * };\\n *\\n * _.findLastKey(users, function(o) { return o.age < 40; });\\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findLastKey(users, { 'age': 36, 'active': true });\\n * // => 'barney'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findLastKey(users, ['active', false]);\\n * // => 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findLastKey(users, 'active');\\n * // => 'pebbles'\\n */\\n function findLastKey(object, predicate) {\\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\\n }\\n\\n /**\\n * Iterates over own and inherited enumerable string keyed properties of an\\n * object and invokes `iteratee` for each property. The iteratee is invoked\\n * with three arguments: (value, key, object). Iteratee functions may exit\\n * iteration early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forInRight\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forIn(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\\n */\\n function forIn(object, iteratee) {\\n return object == null\\n ? object\\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\\n }\\n\\n /**\\n * This method is like `_.forIn` except that it iterates over properties of\\n * `object` in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forInRight(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\\n */\\n function forInRight(object, iteratee) {\\n return object == null\\n ? object\\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\\n }\\n\\n /**\\n * Iterates over own enumerable string keyed properties of an object and\\n * invokes `iteratee` for each property. The iteratee is invoked with three\\n * arguments: (value, key, object). Iteratee functions may exit iteration\\n * early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forOwnRight\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forOwn(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\\n */\\n function forOwn(object, iteratee) {\\n return object && baseForOwn(object, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.forOwn` except that it iterates over properties of\\n * `object` in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forOwn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forOwnRight(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\\n */\\n function forOwnRight(object, iteratee) {\\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * Creates an array of function property names from own enumerable properties\\n * of `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @returns {Array} Returns the function names.\\n * @see _.functionsIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = _.constant('a');\\n * this.b = _.constant('b');\\n * }\\n *\\n * Foo.prototype.c = _.constant('c');\\n *\\n * _.functions(new Foo);\\n * // => ['a', 'b']\\n */\\n function functions(object) {\\n return object == null ? [] : baseFunctions(object, keys(object));\\n }\\n\\n /**\\n * Creates an array of function property names from own and inherited\\n * enumerable properties of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @returns {Array} Returns the function names.\\n * @see _.functions\\n * @example\\n *\\n * function Foo() {\\n * this.a = _.constant('a');\\n * this.b = _.constant('b');\\n * }\\n *\\n * Foo.prototype.c = _.constant('c');\\n *\\n * _.functionsIn(new Foo);\\n * // => ['a', 'b', 'c']\\n */\\n function functionsIn(object) {\\n return object == null ? [] : baseFunctions(object, keysIn(object));\\n }\\n\\n /**\\n * Gets the value at `path` of `object`. If the resolved value is\\n * `undefined`, the `defaultValue` is returned in its place.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.7.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to get.\\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\\n * @returns {*} Returns the resolved value.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.get(object, 'a[0].b.c');\\n * // => 3\\n *\\n * _.get(object, ['a', '0', 'b', 'c']);\\n * // => 3\\n *\\n * _.get(object, 'a.b.c', 'default');\\n * // => 'default'\\n */\\n function get(object, path, defaultValue) {\\n var result = object == null ? undefined : baseGet(object, path);\\n return result === undefined ? defaultValue : result;\\n }\\n\\n /**\\n * Checks if `path` is a direct property of `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n * @example\\n *\\n * var object = { 'a': { 'b': 2 } };\\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\\n *\\n * _.has(object, 'a');\\n * // => true\\n *\\n * _.has(object, 'a.b');\\n * // => true\\n *\\n * _.has(object, ['a', 'b']);\\n * // => true\\n *\\n * _.has(other, 'a');\\n * // => false\\n */\\n function has(object, path) {\\n return object != null && hasPath(object, path, baseHas);\\n }\\n\\n /**\\n * Checks if `path` is a direct or inherited property of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n * @example\\n *\\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\\n *\\n * _.hasIn(object, 'a');\\n * // => true\\n *\\n * _.hasIn(object, 'a.b');\\n * // => true\\n *\\n * _.hasIn(object, ['a', 'b']);\\n * // => true\\n *\\n * _.hasIn(object, 'b');\\n * // => false\\n */\\n function hasIn(object, path) {\\n return object != null && hasPath(object, path, baseHasIn);\\n }\\n\\n /**\\n * Creates an object composed of the inverted keys and values of `object`.\\n * If `object` contains duplicate values, subsequent values overwrite\\n * property assignments of previous values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.7.0\\n * @category Object\\n * @param {Object} object The object to invert.\\n * @returns {Object} Returns the new inverted object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\\n *\\n * _.invert(object);\\n * // => { '1': 'c', '2': 'b' }\\n */\\n var invert = createInverter(function(result, value, key) {\\n result[value] = key;\\n }, constant(identity));\\n\\n /**\\n * This method is like `_.invert` except that the inverted object is generated\\n * from the results of running each element of `object` thru `iteratee`. The\\n * corresponding inverted value of each inverted key is an array of keys\\n * responsible for generating the inverted value. The iteratee is invoked\\n * with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.1.0\\n * @category Object\\n * @param {Object} object The object to invert.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Object} Returns the new inverted object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\\n *\\n * _.invertBy(object);\\n * // => { '1': ['a', 'c'], '2': ['b'] }\\n *\\n * _.invertBy(object, function(value) {\\n * return 'group' + value;\\n * });\\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\\n */\\n var invertBy = createInverter(function(result, value, key) {\\n if (hasOwnProperty.call(result, value)) {\\n result[value].push(key);\\n } else {\\n result[value] = [key];\\n }\\n }, getIteratee);\\n\\n /**\\n * Invokes the method at `path` of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the method to invoke.\\n * @param {...*} [args] The arguments to invoke the method with.\\n * @returns {*} Returns the result of the invoked method.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\\n *\\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\\n * // => [2, 3]\\n */\\n var invoke = baseRest(baseInvoke);\\n\\n /**\\n * Creates an array of the own enumerable property names of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects. See the\\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\\n * for more details.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.keys(new Foo);\\n * // => ['a', 'b'] (iteration order is not guaranteed)\\n *\\n * _.keys('hi');\\n * // => ['0', '1']\\n */\\n function keys(object) {\\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\\n }\\n\\n /**\\n * Creates an array of the own and inherited enumerable property names of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.keysIn(new Foo);\\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\\n */\\n function keysIn(object) {\\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\\n }\\n\\n /**\\n * The opposite of `_.mapValues`; this method creates an object with the\\n * same values as `object` and keys generated by running each own enumerable\\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\\n * with three arguments: (value, key, object).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns the new mapped object.\\n * @see _.mapValues\\n * @example\\n *\\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\\n * return key + value;\\n * });\\n * // => { 'a1': 1, 'b2': 2 }\\n */\\n function mapKeys(object, iteratee) {\\n var result = {};\\n iteratee = getIteratee(iteratee, 3);\\n\\n baseForOwn(object, function(value, key, object) {\\n baseAssignValue(result, iteratee(value, key, object), value);\\n });\\n return result;\\n }\\n\\n /**\\n * Creates an object with the same keys as `object` and values generated\\n * by running each own enumerable string keyed property of `object` thru\\n * `iteratee`. The iteratee is invoked with three arguments:\\n * (value, key, object).\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns the new mapped object.\\n * @see _.mapKeys\\n * @example\\n *\\n * var users = {\\n * 'fred': { 'user': 'fred', 'age': 40 },\\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\\n * };\\n *\\n * _.mapValues(users, function(o) { return o.age; });\\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.mapValues(users, 'age');\\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\\n */\\n function mapValues(object, iteratee) {\\n var result = {};\\n iteratee = getIteratee(iteratee, 3);\\n\\n baseForOwn(object, function(value, key, object) {\\n baseAssignValue(result, key, iteratee(value, key, object));\\n });\\n return result;\\n }\\n\\n /**\\n * This method is like `_.assign` except that it recursively merges own and\\n * inherited enumerable string keyed properties of source objects into the\\n * destination object. Source properties that resolve to `undefined` are\\n * skipped if a destination value exists. Array and plain object properties\\n * are merged recursively. Other objects and value types are overridden by\\n * assignment. Source objects are applied from left to right. Subsequent\\n * sources overwrite property assignments of previous sources.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {\\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\\n * };\\n *\\n * var other = {\\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\\n * };\\n *\\n * _.merge(object, other);\\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\\n */\\n var merge = createAssigner(function(object, source, srcIndex) {\\n baseMerge(object, source, srcIndex);\\n });\\n\\n /**\\n * This method is like `_.merge` except that it accepts `customizer` which\\n * is invoked to produce the merged values of the destination and source\\n * properties. If `customizer` returns `undefined`, merging is handled by the\\n * method instead. The `customizer` is invoked with six arguments:\\n * (objValue, srcValue, key, object, source, stack).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} customizer The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * if (_.isArray(objValue)) {\\n * return objValue.concat(srcValue);\\n * }\\n * }\\n *\\n * var object = { 'a': [1], 'b': [2] };\\n * var other = { 'a': [3], 'b': [4] };\\n *\\n * _.mergeWith(object, other, customizer);\\n * // => { 'a': [1, 3], 'b': [2, 4] }\\n */\\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\\n baseMerge(object, source, srcIndex, customizer);\\n });\\n\\n /**\\n * The opposite of `_.pick`; this method creates an object composed of the\\n * own and inherited enumerable property paths of `object` that are not omitted.\\n *\\n * **Note:** This method is considerably slower than `_.pick`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {...(string|string[])} [paths] The property paths to omit.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.omit(object, ['a', 'c']);\\n * // => { 'b': '2' }\\n */\\n var omit = flatRest(function(object, paths) {\\n var result = {};\\n if (object == null) {\\n return result;\\n }\\n var isDeep = false;\\n paths = arrayMap(paths, function(path) {\\n path = castPath(path, object);\\n isDeep || (isDeep = path.length > 1);\\n return path;\\n });\\n copyObject(object, getAllKeysIn(object), result);\\n if (isDeep) {\\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\\n }\\n var length = paths.length;\\n while (length--) {\\n baseUnset(result, paths[length]);\\n }\\n return result;\\n });\\n\\n /**\\n * The opposite of `_.pickBy`; this method creates an object composed of\\n * the own and inherited enumerable string keyed properties of `object` that\\n * `predicate` doesn't return truthy for. The predicate is invoked with two\\n * arguments: (value, key).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {Function} [predicate=_.identity] The function invoked per property.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.omitBy(object, _.isNumber);\\n * // => { 'b': '2' }\\n */\\n function omitBy(object, predicate) {\\n return pickBy(object, negate(getIteratee(predicate)));\\n }\\n\\n /**\\n * Creates an object composed of the picked `object` properties.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.pick(object, ['a', 'c']);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n var pick = flatRest(function(object, paths) {\\n return object == null ? {} : basePick(object, paths);\\n });\\n\\n /**\\n * Creates an object composed of the `object` properties `predicate` returns\\n * truthy for. The predicate is invoked with two arguments: (value, key).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {Function} [predicate=_.identity] The function invoked per property.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.pickBy(object, _.isNumber);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n function pickBy(object, predicate) {\\n if (object == null) {\\n return {};\\n }\\n var props = arrayMap(getAllKeysIn(object), function(prop) {\\n return [prop];\\n });\\n predicate = getIteratee(predicate);\\n return basePickBy(object, props, function(value, path) {\\n return predicate(value, path[0]);\\n });\\n }\\n\\n /**\\n * This method is like `_.get` except that if the resolved value is a\\n * function it's invoked with the `this` binding of its parent object and\\n * its result is returned.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to resolve.\\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\\n * @returns {*} Returns the resolved value.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\\n *\\n * _.result(object, 'a[0].b.c1');\\n * // => 3\\n *\\n * _.result(object, 'a[0].b.c2');\\n * // => 4\\n *\\n * _.result(object, 'a[0].b.c3', 'default');\\n * // => 'default'\\n *\\n * _.result(object, 'a[0].b.c3', _.constant('default'));\\n * // => 'default'\\n */\\n function result(object, path, defaultValue) {\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length;\\n\\n // Ensure the loop is entered when path is empty.\\n if (!length) {\\n length = 1;\\n object = undefined;\\n }\\n while (++index < length) {\\n var value = object == null ? undefined : object[toKey(path[index])];\\n if (value === undefined) {\\n index = length;\\n value = defaultValue;\\n }\\n object = isFunction(value) ? value.call(object) : value;\\n }\\n return object;\\n }\\n\\n /**\\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\\n * it's created. Arrays are created for missing index properties while objects\\n * are created for all other missing properties. Use `_.setWith` to customize\\n * `path` creation.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.7.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.set(object, 'a[0].b.c', 4);\\n * console.log(object.a[0].b.c);\\n * // => 4\\n *\\n * _.set(object, ['x', '0', 'y', 'z'], 5);\\n * console.log(object.x[0].y.z);\\n * // => 5\\n */\\n function set(object, path, value) {\\n return object == null ? object : baseSet(object, path, value);\\n }\\n\\n /**\\n * This method is like `_.set` except that it accepts `customizer` which is\\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\\n * path creation is handled by the method instead. The `customizer` is invoked\\n * with three arguments: (nsValue, key, nsObject).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {};\\n *\\n * _.setWith(object, '[0][1]', 'a', Object);\\n * // => { '0': { '1': 'a' } }\\n */\\n function setWith(object, path, value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return object == null ? object : baseSet(object, path, value, customizer);\\n }\\n\\n /**\\n * Creates an array of own enumerable string keyed-value pairs for `object`\\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\\n * entries are returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias entries\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the key-value pairs.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.toPairs(new Foo);\\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\\n */\\n var toPairs = createToPairs(keys);\\n\\n /**\\n * Creates an array of own and inherited enumerable string keyed-value pairs\\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\\n * or set, its entries are returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias entriesIn\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the key-value pairs.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.toPairsIn(new Foo);\\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\\n */\\n var toPairsIn = createToPairs(keysIn);\\n\\n /**\\n * An alternative to `_.reduce`; this method transforms `object` to a new\\n * `accumulator` object which is the result of running each of its own\\n * enumerable string keyed properties thru `iteratee`, with each invocation\\n * potentially mutating the `accumulator` object. If `accumulator` is not\\n * provided, a new object with the same `[[Prototype]]` will be used. The\\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The custom accumulator value.\\n * @returns {*} Returns the accumulated value.\\n * @example\\n *\\n * _.transform([2, 3, 4], function(result, n) {\\n * result.push(n *= n);\\n * return n % 2 == 0;\\n * }, []);\\n * // => [4, 9]\\n *\\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\\n * (result[value] || (result[value] = [])).push(key);\\n * }, {});\\n * // => { '1': ['a', 'c'], '2': ['b'] }\\n */\\n function transform(object, iteratee, accumulator) {\\n var isArr = isArray(object),\\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\\n\\n iteratee = getIteratee(iteratee, 4);\\n if (accumulator == null) {\\n var Ctor = object && object.constructor;\\n if (isArrLike) {\\n accumulator = isArr ? new Ctor : [];\\n }\\n else if (isObject(object)) {\\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\\n }\\n else {\\n accumulator = {};\\n }\\n }\\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\\n return iteratee(accumulator, value, index, object);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * Removes the property at `path` of `object`.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to unset.\\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\\n * _.unset(object, 'a[0].b.c');\\n * // => true\\n *\\n * console.log(object);\\n * // => { 'a': [{ 'b': {} }] };\\n *\\n * _.unset(object, ['a', '0', 'b', 'c']);\\n * // => true\\n *\\n * console.log(object);\\n * // => { 'a': [{ 'b': {} }] };\\n */\\n function unset(object, path) {\\n return object == null ? true : baseUnset(object, path);\\n }\\n\\n /**\\n * This method is like `_.set` except that accepts `updater` to produce the\\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\\n * is invoked with one argument: (value).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {Function} updater The function to produce the updated value.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\\n * console.log(object.a[0].b.c);\\n * // => 9\\n *\\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\\n * console.log(object.x[0].y.z);\\n * // => 0\\n */\\n function update(object, path, updater) {\\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\\n }\\n\\n /**\\n * This method is like `_.update` except that it accepts `customizer` which is\\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\\n * path creation is handled by the method instead. The `customizer` is invoked\\n * with three arguments: (nsValue, key, nsObject).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {Function} updater The function to produce the updated value.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {};\\n *\\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\\n * // => { '0': { '1': 'a' } }\\n */\\n function updateWith(object, path, updater, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\\n }\\n\\n /**\\n * Creates an array of the own enumerable string keyed property values of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property values.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.values(new Foo);\\n * // => [1, 2] (iteration order is not guaranteed)\\n *\\n * _.values('hi');\\n * // => ['h', 'i']\\n */\\n function values(object) {\\n return object == null ? [] : baseValues(object, keys(object));\\n }\\n\\n /**\\n * Creates an array of the own and inherited enumerable string keyed property\\n * values of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property values.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.valuesIn(new Foo);\\n * // => [1, 2, 3] (iteration order is not guaranteed)\\n */\\n function valuesIn(object) {\\n return object == null ? [] : baseValues(object, keysIn(object));\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Number\\n * @param {number} number The number to clamp.\\n * @param {number} [lower] The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the clamped number.\\n * @example\\n *\\n * _.clamp(-10, -5, 5);\\n * // => -5\\n *\\n * _.clamp(10, -5, 5);\\n * // => 5\\n */\\n function clamp(number, lower, upper) {\\n if (upper === undefined) {\\n upper = lower;\\n lower = undefined;\\n }\\n if (upper !== undefined) {\\n upper = toNumber(upper);\\n upper = upper === upper ? upper : 0;\\n }\\n if (lower !== undefined) {\\n lower = toNumber(lower);\\n lower = lower === lower ? lower : 0;\\n }\\n return baseClamp(toNumber(number), lower, upper);\\n }\\n\\n /**\\n * Checks if `n` is between `start` and up to, but not including, `end`. If\\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\\n * If `start` is greater than `end` the params are swapped to support\\n * negative ranges.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.3.0\\n * @category Number\\n * @param {number} number The number to check.\\n * @param {number} [start=0] The start of the range.\\n * @param {number} end The end of the range.\\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\\n * @see _.range, _.rangeRight\\n * @example\\n *\\n * _.inRange(3, 2, 4);\\n * // => true\\n *\\n * _.inRange(4, 8);\\n * // => true\\n *\\n * _.inRange(4, 2);\\n * // => false\\n *\\n * _.inRange(2, 2);\\n * // => false\\n *\\n * _.inRange(1.2, 2);\\n * // => true\\n *\\n * _.inRange(5.2, 4);\\n * // => false\\n *\\n * _.inRange(-3, -2, -6);\\n * // => true\\n */\\n function inRange(number, start, end) {\\n start = toFinite(start);\\n if (end === undefined) {\\n end = start;\\n start = 0;\\n } else {\\n end = toFinite(end);\\n }\\n number = toNumber(number);\\n return baseInRange(number, start, end);\\n }\\n\\n /**\\n * Produces a random number between the inclusive `lower` and `upper` bounds.\\n * If only one argument is provided a number between `0` and the given number\\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\\n * floats, a floating-point number is returned instead of an integer.\\n *\\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\\n * floating-point values which can produce unexpected results.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.7.0\\n * @category Number\\n * @param {number} [lower=0] The lower bound.\\n * @param {number} [upper=1] The upper bound.\\n * @param {boolean} [floating] Specify returning a floating-point number.\\n * @returns {number} Returns the random number.\\n * @example\\n *\\n * _.random(0, 5);\\n * // => an integer between 0 and 5\\n *\\n * _.random(5);\\n * // => also an integer between 0 and 5\\n *\\n * _.random(5, true);\\n * // => a floating-point number between 0 and 5\\n *\\n * _.random(1.2, 5.2);\\n * // => a floating-point number between 1.2 and 5.2\\n */\\n function random(lower, upper, floating) {\\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\\n upper = floating = undefined;\\n }\\n if (floating === undefined) {\\n if (typeof upper == 'boolean') {\\n floating = upper;\\n upper = undefined;\\n }\\n else if (typeof lower == 'boolean') {\\n floating = lower;\\n lower = undefined;\\n }\\n }\\n if (lower === undefined && upper === undefined) {\\n lower = 0;\\n upper = 1;\\n }\\n else {\\n lower = toFinite(lower);\\n if (upper === undefined) {\\n upper = lower;\\n lower = 0;\\n } else {\\n upper = toFinite(upper);\\n }\\n }\\n if (lower > upper) {\\n var temp = lower;\\n lower = upper;\\n upper = temp;\\n }\\n if (floating || lower % 1 || upper % 1) {\\n var rand = nativeRandom();\\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\\n }\\n return baseRandom(lower, upper);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the camel cased string.\\n * @example\\n *\\n * _.camelCase('Foo Bar');\\n * // => 'fooBar'\\n *\\n * _.camelCase('--foo-bar--');\\n * // => 'fooBar'\\n *\\n * _.camelCase('__FOO_BAR__');\\n * // => 'fooBar'\\n */\\n var camelCase = createCompounder(function(result, word, index) {\\n word = word.toLowerCase();\\n return result + (index ? capitalize(word) : word);\\n });\\n\\n /**\\n * Converts the first character of `string` to upper case and the remaining\\n * to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to capitalize.\\n * @returns {string} Returns the capitalized string.\\n * @example\\n *\\n * _.capitalize('FRED');\\n * // => 'Fred'\\n */\\n function capitalize(string) {\\n return upperFirst(toString(string).toLowerCase());\\n }\\n\\n /**\\n * Deburrs `string` by converting\\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\\n * letters to basic Latin letters and removing\\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to deburr.\\n * @returns {string} Returns the deburred string.\\n * @example\\n *\\n * _.deburr('déjà vu');\\n * // => 'deja vu'\\n */\\n function deburr(string) {\\n string = toString(string);\\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\\n }\\n\\n /**\\n * Checks if `string` ends with the given target string.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to inspect.\\n * @param {string} [target] The string to search for.\\n * @param {number} [position=string.length] The position to search up to.\\n * @returns {boolean} Returns `true` if `string` ends with `target`,\\n * else `false`.\\n * @example\\n *\\n * _.endsWith('abc', 'c');\\n * // => true\\n *\\n * _.endsWith('abc', 'b');\\n * // => false\\n *\\n * _.endsWith('abc', 'b', 2);\\n * // => true\\n */\\n function endsWith(string, target, position) {\\n string = toString(string);\\n target = baseToString(target);\\n\\n var length = string.length;\\n position = position === undefined\\n ? length\\n : baseClamp(toInteger(position), 0, length);\\n\\n var end = position;\\n position -= target.length;\\n return position >= 0 && string.slice(position, end) == target;\\n }\\n\\n /**\\n * Converts the characters \\\"&\\\", \\\"<\\\", \\\">\\\", '\\\"', and \\\"'\\\" in `string` to their\\n * corresponding HTML entities.\\n *\\n * **Note:** No other characters are escaped. To escape additional\\n * characters use a third-party library like [_he_](https://mths.be/he).\\n *\\n * Though the \\\">\\\" character is escaped for symmetry, characters like\\n * \\\">\\\" and \\\"/\\\" don't need escaping in HTML and have no special meaning\\n * unless they're part of a tag or unquoted attribute value. See\\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\\n * (under \\\"semi-related fun fact\\\") for more details.\\n *\\n * When working with HTML you should always\\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\\n * XSS vectors.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category String\\n * @param {string} [string=''] The string to escape.\\n * @returns {string} Returns the escaped string.\\n * @example\\n *\\n * _.escape('fred, barney, & pebbles');\\n * // => 'fred, barney, & pebbles'\\n */\\n function escape(string) {\\n string = toString(string);\\n return (string && reHasUnescapedHtml.test(string))\\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\\n : string;\\n }\\n\\n /**\\n * Escapes the `RegExp` special characters \\\"^\\\", \\\"$\\\", \\\"\\\\\\\", \\\".\\\", \\\"*\\\", \\\"+\\\",\\n * \\\"?\\\", \\\"(\\\", \\\")\\\", \\\"[\\\", \\\"]\\\", \\\"{\\\", \\\"}\\\", and \\\"|\\\" in `string`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to escape.\\n * @returns {string} Returns the escaped string.\\n * @example\\n *\\n * _.escapeRegExp('[lodash](https://lodash.com/)');\\n * // => '\\\\[lodash\\\\]\\\\(https://lodash\\\\.com/\\\\)'\\n */\\n function escapeRegExp(string) {\\n string = toString(string);\\n return (string && reHasRegExpChar.test(string))\\n ? string.replace(reRegExpChar, '\\\\\\\\$&')\\n : string;\\n }\\n\\n /**\\n * Converts `string` to\\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the kebab cased string.\\n * @example\\n *\\n * _.kebabCase('Foo Bar');\\n * // => 'foo-bar'\\n *\\n * _.kebabCase('fooBar');\\n * // => 'foo-bar'\\n *\\n * _.kebabCase('__FOO_BAR__');\\n * // => 'foo-bar'\\n */\\n var kebabCase = createCompounder(function(result, word, index) {\\n return result + (index ? '-' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Converts `string`, as space separated words, to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the lower cased string.\\n * @example\\n *\\n * _.lowerCase('--Foo-Bar--');\\n * // => 'foo bar'\\n *\\n * _.lowerCase('fooBar');\\n * // => 'foo bar'\\n *\\n * _.lowerCase('__FOO_BAR__');\\n * // => 'foo bar'\\n */\\n var lowerCase = createCompounder(function(result, word, index) {\\n return result + (index ? ' ' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Converts the first character of `string` to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the converted string.\\n * @example\\n *\\n * _.lowerFirst('Fred');\\n * // => 'fred'\\n *\\n * _.lowerFirst('FRED');\\n * // => 'fRED'\\n */\\n var lowerFirst = createCaseFirst('toLowerCase');\\n\\n /**\\n * Pads `string` on the left and right sides if it's shorter than `length`.\\n * Padding characters are truncated if they can't be evenly divided by `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.pad('abc', 8);\\n * // => ' abc '\\n *\\n * _.pad('abc', 8, '_-');\\n * // => '_-abc_-_'\\n *\\n * _.pad('abc', 3);\\n * // => 'abc'\\n */\\n function pad(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n if (!length || strLength >= length) {\\n return string;\\n }\\n var mid = (length - strLength) / 2;\\n return (\\n createPadding(nativeFloor(mid), chars) +\\n string +\\n createPadding(nativeCeil(mid), chars)\\n );\\n }\\n\\n /**\\n * Pads `string` on the right side if it's shorter than `length`. Padding\\n * characters are truncated if they exceed `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.padEnd('abc', 6);\\n * // => 'abc '\\n *\\n * _.padEnd('abc', 6, '_-');\\n * // => 'abc_-_'\\n *\\n * _.padEnd('abc', 3);\\n * // => 'abc'\\n */\\n function padEnd(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n return (length && strLength < length)\\n ? (string + createPadding(length - strLength, chars))\\n : string;\\n }\\n\\n /**\\n * Pads `string` on the left side if it's shorter than `length`. Padding\\n * characters are truncated if they exceed `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.padStart('abc', 6);\\n * // => ' abc'\\n *\\n * _.padStart('abc', 6, '_-');\\n * // => '_-_abc'\\n *\\n * _.padStart('abc', 3);\\n * // => 'abc'\\n */\\n function padStart(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n return (length && strLength < length)\\n ? (createPadding(length - strLength, chars) + string)\\n : string;\\n }\\n\\n /**\\n * Converts `string` to an integer of the specified radix. If `radix` is\\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\\n * hexadecimal, in which case a `radix` of `16` is used.\\n *\\n * **Note:** This method aligns with the\\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category String\\n * @param {string} string The string to convert.\\n * @param {number} [radix=10] The radix to interpret `value` by.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.parseInt('08');\\n * // => 8\\n *\\n * _.map(['6', '08', '10'], _.parseInt);\\n * // => [6, 8, 10]\\n */\\n function parseInt(string, radix, guard) {\\n if (guard || radix == null) {\\n radix = 0;\\n } else if (radix) {\\n radix = +radix;\\n }\\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\\n }\\n\\n /**\\n * Repeats the given string `n` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to repeat.\\n * @param {number} [n=1] The number of times to repeat the string.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {string} Returns the repeated string.\\n * @example\\n *\\n * _.repeat('*', 3);\\n * // => '***'\\n *\\n * _.repeat('abc', 2);\\n * // => 'abcabc'\\n *\\n * _.repeat('abc', 0);\\n * // => ''\\n */\\n function repeat(string, n, guard) {\\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\\n n = 1;\\n } else {\\n n = toInteger(n);\\n }\\n return baseRepeat(toString(string), n);\\n }\\n\\n /**\\n * Replaces matches for `pattern` in `string` with `replacement`.\\n *\\n * **Note:** This method is based on\\n * [`String#replace`](https://mdn.io/String/replace).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to modify.\\n * @param {RegExp|string} pattern The pattern to replace.\\n * @param {Function|string} replacement The match replacement.\\n * @returns {string} Returns the modified string.\\n * @example\\n *\\n * _.replace('Hi Fred', 'Fred', 'Barney');\\n * // => 'Hi Barney'\\n */\\n function replace() {\\n var args = arguments,\\n string = toString(args[0]);\\n\\n return args.length < 3 ? string : string.replace(args[1], args[2]);\\n }\\n\\n /**\\n * Converts `string` to\\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the snake cased string.\\n * @example\\n *\\n * _.snakeCase('Foo Bar');\\n * // => 'foo_bar'\\n *\\n * _.snakeCase('fooBar');\\n * // => 'foo_bar'\\n *\\n * _.snakeCase('--FOO-BAR--');\\n * // => 'foo_bar'\\n */\\n var snakeCase = createCompounder(function(result, word, index) {\\n return result + (index ? '_' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Splits `string` by `separator`.\\n *\\n * **Note:** This method is based on\\n * [`String#split`](https://mdn.io/String/split).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to split.\\n * @param {RegExp|string} separator The separator pattern to split by.\\n * @param {number} [limit] The length to truncate results to.\\n * @returns {Array} Returns the string segments.\\n * @example\\n *\\n * _.split('a-b-c', '-', 2);\\n * // => ['a', 'b']\\n */\\n function split(string, separator, limit) {\\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\\n separator = limit = undefined;\\n }\\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\\n if (!limit) {\\n return [];\\n }\\n string = toString(string);\\n if (string && (\\n typeof separator == 'string' ||\\n (separator != null && !isRegExp(separator))\\n )) {\\n separator = baseToString(separator);\\n if (!separator && hasUnicode(string)) {\\n return castSlice(stringToArray(string), 0, limit);\\n }\\n }\\n return string.split(separator, limit);\\n }\\n\\n /**\\n * Converts `string` to\\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.1.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the start cased string.\\n * @example\\n *\\n * _.startCase('--foo-bar--');\\n * // => 'Foo Bar'\\n *\\n * _.startCase('fooBar');\\n * // => 'Foo Bar'\\n *\\n * _.startCase('__FOO_BAR__');\\n * // => 'FOO BAR'\\n */\\n var startCase = createCompounder(function(result, word, index) {\\n return result + (index ? ' ' : '') + upperFirst(word);\\n });\\n\\n /**\\n * Checks if `string` starts with the given target string.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to inspect.\\n * @param {string} [target] The string to search for.\\n * @param {number} [position=0] The position to search from.\\n * @returns {boolean} Returns `true` if `string` starts with `target`,\\n * else `false`.\\n * @example\\n *\\n * _.startsWith('abc', 'a');\\n * // => true\\n *\\n * _.startsWith('abc', 'b');\\n * // => false\\n *\\n * _.startsWith('abc', 'b', 1);\\n * // => true\\n */\\n function startsWith(string, target, position) {\\n string = toString(string);\\n position = position == null\\n ? 0\\n : baseClamp(toInteger(position), 0, string.length);\\n\\n target = baseToString(target);\\n return string.slice(position, position + target.length) == target;\\n }\\n\\n /**\\n * Creates a compiled template function that can interpolate data properties\\n * in \\\"interpolate\\\" delimiters, HTML-escape interpolated data properties in\\n * \\\"escape\\\" delimiters, and execute JavaScript in \\\"evaluate\\\" delimiters. Data\\n * properties may be accessed as free variables in the template. If a setting\\n * object is given, it takes precedence over `_.templateSettings` values.\\n *\\n * **Note:** In the development build `_.template` utilizes\\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\\n * for easier debugging.\\n *\\n * For more information on precompiling templates see\\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\\n *\\n * For more information on Chrome extension sandboxes see\\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category String\\n * @param {string} [string=''] The template string.\\n * @param {Object} [options={}] The options object.\\n * @param {RegExp} [options.escape=_.templateSettings.escape]\\n * The HTML \\\"escape\\\" delimiter.\\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\\n * The \\\"evaluate\\\" delimiter.\\n * @param {Object} [options.imports=_.templateSettings.imports]\\n * An object to import into the template as free variables.\\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\\n * The \\\"interpolate\\\" delimiter.\\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\\n * The sourceURL of the compiled template.\\n * @param {string} [options.variable='obj']\\n * The data object variable name.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the compiled template function.\\n * @example\\n *\\n * // Use the \\\"interpolate\\\" delimiter to create a compiled template.\\n * var compiled = _.template('hello <%= user %>!');\\n * compiled({ 'user': 'fred' });\\n * // => 'hello fred!'\\n *\\n * // Use the HTML \\\"escape\\\" delimiter to escape data property values.\\n * var compiled = _.template('<%- value %>');\\n * compiled({ 'value': '\\\\r\\\\n\\\\r\\\\n\\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 78 */\\n/***/ function(module, exports) {\\n\\n\\t/*\\r\\n\\t\\tMIT License http://www.opensource.org/licenses/mit-license.php\\r\\n\\t\\tAuthor Tobias Koppers @sokra\\r\\n\\t*/\\r\\n\\t// css base code, injected by the css-loader\\r\\n\\tmodule.exports = function() {\\r\\n\\t\\tvar list = [];\\r\\n\\t\\r\\n\\t\\t// return the list of modules as css string\\r\\n\\t\\tlist.toString = function toString() {\\r\\n\\t\\t\\tvar result = [];\\r\\n\\t\\t\\tfor(var i = 0; i < this.length; i++) {\\r\\n\\t\\t\\t\\tvar item = this[i];\\r\\n\\t\\t\\t\\tif(item[2]) {\\r\\n\\t\\t\\t\\t\\tresult.push(\\\"@media \\\" + item[2] + \\\"{\\\" + item[1] + \\\"}\\\");\\r\\n\\t\\t\\t\\t} else {\\r\\n\\t\\t\\t\\t\\tresult.push(item[1]);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\treturn result.join(\\\"\\\");\\r\\n\\t\\t};\\r\\n\\t\\r\\n\\t\\t// import a list of modules into the list\\r\\n\\t\\tlist.i = function(modules, mediaQuery) {\\r\\n\\t\\t\\tif(typeof modules === \\\"string\\\")\\r\\n\\t\\t\\t\\tmodules = [[null, modules, \\\"\\\"]];\\r\\n\\t\\t\\tvar alreadyImportedModules = {};\\r\\n\\t\\t\\tfor(var i = 0; i < this.length; i++) {\\r\\n\\t\\t\\t\\tvar id = this[i][0];\\r\\n\\t\\t\\t\\tif(typeof id === \\\"number\\\")\\r\\n\\t\\t\\t\\t\\talreadyImportedModules[id] = true;\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tfor(i = 0; i < modules.length; i++) {\\r\\n\\t\\t\\t\\tvar item = modules[i];\\r\\n\\t\\t\\t\\t// skip already imported module\\r\\n\\t\\t\\t\\t// this implementation is not 100% perfect for weird media query combinations\\r\\n\\t\\t\\t\\t// when a module is imported multiple times with different media queries.\\r\\n\\t\\t\\t\\t// I hope this will never occur (Hey this way we have smaller bundles)\\r\\n\\t\\t\\t\\tif(typeof item[0] !== \\\"number\\\" || !alreadyImportedModules[item[0]]) {\\r\\n\\t\\t\\t\\t\\tif(mediaQuery && !item[2]) {\\r\\n\\t\\t\\t\\t\\t\\titem[2] = mediaQuery;\\r\\n\\t\\t\\t\\t\\t} else if(mediaQuery) {\\r\\n\\t\\t\\t\\t\\t\\titem[2] = \\\"(\\\" + item[2] + \\\") and (\\\" + mediaQuery + \\\")\\\";\\r\\n\\t\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t\\tlist.push(item);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t};\\r\\n\\t\\treturn list;\\r\\n\\t};\\r\\n\\n\\n/***/ },\\n/* 79 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t/*\\n\\t\\tMIT License http://www.opensource.org/licenses/mit-license.php\\n\\t\\tAuthor Tobias Koppers @sokra\\n\\t*/\\n\\tvar stylesInDom = {},\\n\\t\\tmemoize = function(fn) {\\n\\t\\t\\tvar memo;\\n\\t\\t\\treturn function () {\\n\\t\\t\\t\\tif (typeof memo === \\\"undefined\\\") memo = fn.apply(this, arguments);\\n\\t\\t\\t\\treturn memo;\\n\\t\\t\\t};\\n\\t\\t},\\n\\t\\tisOldIE = memoize(function() {\\n\\t\\t\\treturn /msie [6-9]\\\\b/.test(window.navigator.userAgent.toLowerCase());\\n\\t\\t}),\\n\\t\\tgetHeadElement = memoize(function () {\\n\\t\\t\\treturn document.head || document.getElementsByTagName(\\\"head\\\")[0];\\n\\t\\t}),\\n\\t\\tsingletonElement = null,\\n\\t\\tsingletonCounter = 0,\\n\\t\\tstyleElementsInsertedAtTop = [];\\n\\t\\n\\tmodule.exports = function(list, options) {\\n\\t\\tif(false) {\\n\\t\\t\\tif(typeof document !== \\\"object\\\") throw new Error(\\\"The style-loader cannot be used in a non-browser environment\\\");\\n\\t\\t}\\n\\t\\n\\t\\toptions = options || {};\\n\\t\\t// Force single-tag solution on IE6-9, which has a hard limit on the # of \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 85 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t header: { type: String },\\n\\t placement: { type: String, default: 'right' },\\n\\t show: { type: Boolean, required: true },\\n\\t width: { type: Number, default: 320 }\\n\\t },\\n\\t watch: {\\n\\t show: function show(val, old) {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('input', val);\\n\\t this.$emit(this.show ? 'open' : 'close');\\n\\t var body = document.body;\\n\\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\\n\\t if (val) {\\n\\t if (!this._backdrop) {\\n\\t this._backdrop = document.createElement('div');\\n\\t }\\n\\t this._backdrop.className = 'aside-backdrop';\\n\\t body.appendChild(this._backdrop);\\n\\t body.classList.add('modal-open');\\n\\t if (scrollBarWidth !== 0) {\\n\\t body.style.paddingRight = scrollBarWidth + 'px';\\n\\t }\\n\\t // request property that requires layout to force a layout\\n\\t var x = this._backdrop.clientHeight;\\n\\t this._backdrop.classList.add('in');\\n\\t (0, _NodeList2.default)(this._backdrop).on('click', function () {\\n\\t return _this.trigger_close();\\n\\t });\\n\\t } else {\\n\\t (0, _NodeList2.default)(this._backdrop).on('transitionend', function () {\\n\\t (0, _NodeList2.default)(_this._backdrop).off();\\n\\t try {\\n\\t body.classList.remove('modal-open');\\n\\t body.style.paddingRight = '0';\\n\\t body.removeChild(_this._backdrop);\\n\\t _this._backdrop = null;\\n\\t } catch (e) {}\\n\\t });\\n\\t this._backdrop.className = 'aside-backdrop';\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t trigger: function trigger() {\\n\\t var _this2 = this;\\n\\t\\n\\t return {\\n\\t close: function close() {\\n\\t return _this2.trigger_close();\\n\\t },\\n\\t open: function open() {\\n\\t return _this2.trigger_open();\\n\\t }\\n\\t };\\n\\t },\\n\\t trigger_close: function trigger_close() {\\n\\t this.$emit('close');\\n\\t },\\n\\t trigger_open: function trigger_open() {\\n\\t this.$emit('open');\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this3 = this;\\n\\t\\n\\t this.$emit('trigger', function () {\\n\\t return _this3.trigger;\\n\\t });\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 86 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": 'slide' + _vm.placement\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t staticClass: \\\"aside\\\",\\n\\t class: _vm.placement,\\n\\t style: ({\\n\\t width: _vm.width + 'px'\\n\\t })\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-dialog\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-content\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-header\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.trigger_close\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]), _vm._v(\\\" \\\"), _vm._c('h4', {\\n\\t staticClass: \\\"aside-title\\\"\\n\\t }, [_vm._t(\\\"header\\\", [_vm._v(_vm._s(_vm.header))])], 2)]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"aside-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])])]) : _vm._e()])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-3a4bde27\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 87 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(88)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(89)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\ButtonGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-125eb0c8\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-125eb0c8\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] ButtonGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 88 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t buttons: { type: Boolean, default: true },\\n\\t disabled: { type: Boolean, default: false },\\n\\t justified: { type: Boolean, default: false },\\n\\t type: { type: String, default: 'default' },\\n\\t value: { default: null },\\n\\t vertical: { type: Boolean, default: false }\\n\\t },\\n\\t computed: {\\n\\t btnGroup: function btnGroup() {\\n\\t return !this.disabled;\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t // this will update EXTERNAL v-model when our val changes\\n\\t val: function val(_val) {\\n\\t this.$emit('input', _val);\\n\\t },\\n\\t\\n\\t // this will update our INTERNAL val, when something external changes our v-model\\n\\t value: function value(val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 89 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: {\\n\\t 'btn-group': _vm.buttons, 'btn-group-justified': _vm.justified, 'btn-group-vertical': _vm.vertical\\n\\t },\\n\\t attrs: {\\n\\t \\\"data-toggle\\\": _vm.buttons && 'buttons'\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-125eb0c8\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 90 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(91)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(93)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(94)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Carousel.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-322dee41\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-322dee41\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-322dee41\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Carousel.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 91 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 93 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t// let coerce = {\\n\\t// interval: 'number'\\n\\t// }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t indicators: {\\n\\t type: Boolean,\\n\\t default: true\\n\\t },\\n\\t controls: {\\n\\t type: Boolean,\\n\\t default: true\\n\\t },\\n\\t interval: {\\n\\t type: Number,\\n\\t default: 5000\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t indicator_list: [],\\n\\t index: 0,\\n\\t isAnimating: false\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t index: function index(newVal, oldVal) {\\n\\t this.slide(newVal > oldVal ? 'left' : 'right', newVal, oldVal);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t indicatorClick: function indicatorClick(index) {\\n\\t if (this.isAnimating || this.index === index) return false;\\n\\t this.isAnimating = true;\\n\\t this.index = index;\\n\\t },\\n\\t slide: function slide(direction, next, prev) {\\n\\t var _this = this;\\n\\t\\n\\t if (!this.$el) {\\n\\t return;\\n\\t }\\n\\t var $slider = (0, _NodeList2.default)('.item', this.$el);\\n\\t if (!$slider.length) {\\n\\t return;\\n\\t }\\n\\t var selected = $slider[next] || $slider[0];\\n\\t (0, _NodeList2.default)(selected).addClass(direction === 'left' ? 'next' : 'prev');\\n\\t // request property that requires layout to force a layout\\n\\t var x = selected.clientHeight;\\n\\t (0, _NodeList2.default)([$slider[prev], selected]).addClass(direction).on('transitionend', function () {\\n\\t $slider.off('transitionend').className = 'item';\\n\\t (0, _NodeList2.default)(selected).addClass('active');\\n\\t _this.isAnimating = false;\\n\\t });\\n\\t },\\n\\t next: function next() {\\n\\t if (!this.$el || this.isAnimating) {\\n\\t return false;\\n\\t }\\n\\t this.isAnimating = true;\\n\\t this.index + 1 < (0, _NodeList2.default)('.item', this.$el).length ? this.index += 1 : this.index = 0;\\n\\t },\\n\\t prev: function prev() {\\n\\t if (!this.$el || this.isAnimating) {\\n\\t return false;\\n\\t }\\n\\t this.isAnimating = true;\\n\\t this.index === 0 ? this.index = (0, _NodeList2.default)('.item', this.$el).length - 1 : this.index -= 1;\\n\\t },\\n\\t toggleInterval: function toggleInterval(val) {\\n\\t if (val === undefined) {\\n\\t val = this._intervalID;\\n\\t }\\n\\t if (this._intervalID) {\\n\\t clearInterval(this._intervalID);\\n\\t delete this._intervalID;\\n\\t }\\n\\t if (val && this.interval > 0) {\\n\\t this._intervalID = setInterval(this.next, this.interval);\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this2 = this;\\n\\t\\n\\t this.toggleInterval(true);\\n\\t (0, _NodeList2.default)(this.$el).on('mouseenter', function () {\\n\\t return _this2.toggleInterval(false);\\n\\t }).on('mouseleave', function () {\\n\\t return _this2.toggleInterval(true);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t this.toggleInterval(false);\\n\\t (0, _NodeList2.default)(this.$el).off('mouseenter mouseleave');\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 94 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"carousel slide\\\",\\n\\t attrs: {\\n\\t \\\"data-ride\\\": \\\"carousel\\\"\\n\\t }\\n\\t }, [_vm._c('ol', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.indicators),\\n\\t expression: \\\"indicators\\\"\\n\\t }],\\n\\t staticClass: \\\"carousel-indicators\\\"\\n\\t }, _vm._l((_vm.indicator_list), function(indicator, i) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t active: i === _vm.index\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.indicatorClick(i)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span')])\\n\\t })), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"carousel-inner\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"listbox\\\"\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.controls),\\n\\t expression: \\\"controls\\\"\\n\\t }],\\n\\t staticClass: \\\"carousel-controls hidden-xs\\\"\\n\\t }, [_vm._c('a', {\\n\\t staticClass: \\\"left carousel-control\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.prev\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"glyphicon glyphicon-chevron-left\\\",\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t })]), _vm._v(\\\" \\\"), _vm._c('a', {\\n\\t staticClass: \\\"right carousel-control\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.next\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"glyphicon glyphicon-chevron-right\\\",\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t })])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-322dee41\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 95 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(96)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(98)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(99)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Checkbox.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-6922bf24\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-6922bf24\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-6922bf24\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Checkbox.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 96 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 98 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t button: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t falseValue: { default: false },\\n\\t name: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t trueValue: { default: true },\\n\\t type: { type: String, default: null },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t checked: this.value === this.trueValue\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t inGroup: function inGroup() {\\n\\t return this.$parent && this.$parent.btnGroup && !this.$parent._radioGroup;\\n\\t },\\n\\t isButton: function isButton() {\\n\\t return this.button || this.$parent && this.$parent.btnGroup && this.$parent.buttons;\\n\\t },\\n\\t isFalse: function isFalse() {\\n\\t return this.value === this.falseValue;\\n\\t },\\n\\t isTrue: function isTrue() {\\n\\t return this.value === this.trueValue;\\n\\t },\\n\\t parentValue: function parentValue() {\\n\\t return this.$parent.val;\\n\\t },\\n\\t typeColor: function typeColor() {\\n\\t return this.type || this.$parent && this.$parent.type || 'default';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t checked: function checked(val, old) {\\n\\t var value = val ? this.trueValue : this.falseValue;\\n\\t this.$emit('checked', val);\\n\\t this.$emit('input', value);\\n\\t this.updateParent();\\n\\t },\\n\\t parentValue: function parentValue(val) {\\n\\t this.updateFromParent();\\n\\t },\\n\\t value: function value(val, old) {\\n\\t var checked = val === this.trueValue;\\n\\t if (this.checked !== checked) {\\n\\t this.checked = checked;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.inGroup) {\\n\\t var parent = this.$parent;\\n\\t parent._checkboxGroup = true;\\n\\t if (!(parent.val instanceof Array)) {\\n\\t parent.val = [];\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.updateFromParent();\\n\\t },\\n\\t\\n\\t methods: {\\n\\t // called @ mounted(), or whenever $parent.val changes\\n\\t // sync our state with the $parent.val\\n\\t updateFromParent: function updateFromParent() {\\n\\t if (this.inGroup) {\\n\\t var index = this.$parent.val.indexOf(this.trueValue);\\n\\t this.checked = ~index;\\n\\t }\\n\\t },\\n\\t\\n\\t // called when our checked state changes\\n\\t updateParent: function updateParent() {\\n\\t if (this.inGroup) {\\n\\t var index = this.$parent.val.indexOf(this.trueValue);\\n\\t if (this.checked && !~index) this.$parent.val.push(this.trueValue);\\n\\t if (!this.checked && ~index) this.$parent.val.splice(index, 1);\\n\\t }\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled || this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.checked = !this.checked;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 99 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.isButton ? 'a' : 'label', {\\n\\t tag: \\\"a\\\",\\n\\t class: [_vm.isButton ? 'btn btn-' + _vm.typeColor : 'open checkbox ' + _vm.typeColor, {\\n\\t active: _vm.checked,\\n\\t disabled: _vm.disabled,\\n\\t readonly: _vm.readonly\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggle\\n\\t }\\n\\t }, [(_vm.name) ? _vm._c('input', {\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"hidden\\\",\\n\\t \\\"name\\\": _vm.name\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.checked ? _vm.trueValue : _vm.falseValue\\n\\t }\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), (!_vm.isButton) ? _vm._c('span', {\\n\\t staticClass: \\\"icon dropdown-toggle\\\",\\n\\t class: [_vm.checked ? 'btn-' + _vm.typeColor : '', {\\n\\t bg: _vm.typeColor === 'default'\\n\\t }]\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), (!_vm.isButton && _vm.checked && _vm.typeColor === 'default') ? _vm._c('span', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-6922bf24\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 100 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(101)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(103)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(104)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Datepicker.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-477b8e5d\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-477b8e5d\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Datepicker.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 101 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 103 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\t// import $ from './utils/NodeList.js'\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t value: { type: String },\\n\\t format: { default: 'MM/dd/yyyy' },\\n\\t disabledDaysOfWeek: { type: Array, default: function _default() {\\n\\t return [];\\n\\t }\\n\\t },\\n\\t width: { type: String },\\n\\t clearButton: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t placeholder: { type: String },\\n\\t iconsFont: { type: String, default: 'glyphicon' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t currDate: new Date(),\\n\\t dateRange: [],\\n\\t decadeRange: [],\\n\\t displayDayView: false,\\n\\t displayMonthView: false,\\n\\t displayYearView: false,\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t currDate: function currDate() {\\n\\t this.getDateRange();\\n\\t },\\n\\t format: function format() {\\n\\t this.val = this.stringify(this.currDate);\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t preBtnClasses: function preBtnClasses() {\\n\\t return 'datepicker-preBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-left';\\n\\t },\\n\\t nextBtnClasses: function nextBtnClasses() {\\n\\t return 'datepicker-nextBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-right';\\n\\t },\\n\\t disabledDaysArray: function disabledDaysArray() {\\n\\t return this.disabledDaysOfWeek.map(function (d) {\\n\\t return parseInt(d, 10);\\n\\t });\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t close: function close() {\\n\\t this.displayDayView = this.displayMonthView = this.displayYearView = false;\\n\\t },\\n\\t inputClick: function inputClick() {\\n\\t this.currDate = this.parse(this.val) || this.parse(new Date());\\n\\t if (this.displayMonthView || this.displayYearView) {\\n\\t this.displayDayView = false;\\n\\t } else {\\n\\t this.displayDayView = !this.displayDayView;\\n\\t }\\n\\t },\\n\\t preNextDecadeClick: function preNextDecadeClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var months = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t this.currDate = new Date(year - 10, months, date);\\n\\t } else {\\n\\t this.currDate = new Date(year + 10, months, date);\\n\\t }\\n\\t },\\n\\t preNextMonthClick: function preNextMonthClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var month = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t var preMonth = this.getYearMonth(year, month - 1);\\n\\t this.currDate = new Date(preMonth.year, preMonth.month, date);\\n\\t } else {\\n\\t var nextMonth = this.getYearMonth(year, month + 1);\\n\\t this.currDate = new Date(nextMonth.year, nextMonth.month, date);\\n\\t }\\n\\t },\\n\\t preNextYearClick: function preNextYearClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var months = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t this.currDate = new Date(year - 1, months, date);\\n\\t } else {\\n\\t this.currDate = new Date(year + 1, months, date);\\n\\t }\\n\\t },\\n\\t yearSelect: function yearSelect(year) {\\n\\t this.displayYearView = false;\\n\\t this.displayMonthView = true;\\n\\t this.currDate = new Date(year, this.currDate.getMonth(), this.currDate.getDate());\\n\\t },\\n\\t daySelect: function daySelect(day) {\\n\\t if (day.sclass === 'datepicker-item-disable') {\\n\\t return false;\\n\\t } else {\\n\\t this.currDate = day.date;\\n\\t this.val = this.stringify(this.currDate);\\n\\t this.displayDayView = false;\\n\\t }\\n\\t },\\n\\t switchMonthView: function switchMonthView() {\\n\\t this.displayDayView = false;\\n\\t this.displayMonthView = true;\\n\\t },\\n\\t switchDecadeView: function switchDecadeView() {\\n\\t this.displayMonthView = false;\\n\\t this.displayYearView = true;\\n\\t },\\n\\t monthSelect: function monthSelect(index) {\\n\\t this.displayMonthView = false;\\n\\t this.displayDayView = true;\\n\\t this.currDate = new Date(this.currDate.getFullYear(), index, this.currDate.getDate());\\n\\t },\\n\\t getYearMonth: function getYearMonth(year, month) {\\n\\t if (month > 11) {\\n\\t year++;\\n\\t month = 0;\\n\\t } else if (month < 0) {\\n\\t year--;\\n\\t month = 11;\\n\\t }\\n\\t return { year: year, month: month };\\n\\t },\\n\\t stringifyDecadeHeader: function stringifyDecadeHeader(date) {\\n\\t var yearStr = date.getFullYear().toString();\\n\\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0;\\n\\t var lastYearOfDecade = parseInt(firstYearOfDecade, 10) + 10;\\n\\t return firstYearOfDecade + '-' + lastYearOfDecade;\\n\\t },\\n\\t stringifyDayHeader: function stringifyDayHeader(date) {\\n\\t return this.text.months[date.getMonth()] + ' ' + date.getFullYear();\\n\\t },\\n\\t parseMonth: function parseMonth(date) {\\n\\t return this.text.months[date.getMonth()];\\n\\t },\\n\\t stringifyYearHeader: function stringifyYearHeader(date) {\\n\\t return date.getFullYear();\\n\\t },\\n\\t stringify: function stringify(date) {\\n\\t var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.format;\\n\\t\\n\\t if (!date) date = this.parse();\\n\\t if (!date) return '';\\n\\t var year = date.getFullYear();\\n\\t var month = date.getMonth() + 1;\\n\\t var day = date.getDate();\\n\\t var monthName = this.parseMonth(date);\\n\\t return format.replace(/yyyy/g, year).replace(/yy/g, year).replace(/MMMM/g, monthName).replace(/MMM/g, monthName.substring(0, 3)).replace(/MM/g, ('0' + month).slice(-2)).replace(/M(?!a)/g, month).replace(/dd/g, ('0' + day).slice(-2)).replace(/d/g, day);\\n\\t },\\n\\t parse: function parse(str) {\\n\\t if (str === undefined || str === null) {\\n\\t str = this.val;\\n\\t }\\n\\t var date = str.length === 10 && (this.format === 'dd-MM-yyyy' || this.format === 'dd/MM/yyyy') ? new Date(str.substring(6, 10), str.substring(3, 5) - 1, str.substring(0, 2)) : new Date(str);\\n\\t return isNaN(date.getFullYear()) ? new Date() : date;\\n\\t },\\n\\t getDayCount: function getDayCount(year, month) {\\n\\t var dict = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\\n\\t if (month === 1) {\\n\\t if (year % 400 === 0 || year % 4 === 0 && year % 100 !== 0) {\\n\\t return 29;\\n\\t }\\n\\t }\\n\\t return dict[month];\\n\\t },\\n\\t getDateRange: function getDateRange() {\\n\\t this.dateRange = [];\\n\\t this.decadeRange = [];\\n\\t var time = {\\n\\t year: this.currDate.getFullYear(),\\n\\t month: this.currDate.getMonth(),\\n\\t day: this.currDate.getDate()\\n\\t };\\n\\t var yearStr = time.year.toString();\\n\\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0 - 1;\\n\\t for (var i = 0; i < 12; i++) {\\n\\t this.decadeRange.push({\\n\\t text: firstYearOfDecade + i\\n\\t });\\n\\t }\\n\\t\\n\\t var currMonthFirstDay = new Date(time.year, time.month, 1);\\n\\t var firstDayWeek = currMonthFirstDay.getDay() + 1;\\n\\t if (firstDayWeek === 0) {\\n\\t firstDayWeek = 7;\\n\\t }\\n\\t var dayCount = this.getDayCount(time.year, time.month);\\n\\t if (firstDayWeek > 1) {\\n\\t var preMonth = this.getYearMonth(time.year, time.month - 1);\\n\\t var prevMonthDayCount = this.getDayCount(preMonth.year, preMonth.month);\\n\\t for (var _i = 1; _i < firstDayWeek; _i++) {\\n\\t var dayText = prevMonthDayCount - firstDayWeek + _i + 1;\\n\\t var date = new Date(preMonth.year, preMonth.month, dayText);\\n\\t var sclass = 'datepicker-item-gray';\\n\\t if (this.disabledDaysArray.indexOf(date.getDay()) > -1) {\\n\\t sclass = 'datepicker-item-disable';\\n\\t }\\n\\t this.dateRange.push({ text: dayText, date: date, sclass: sclass });\\n\\t }\\n\\t }\\n\\t\\n\\t for (var _i2 = 1; _i2 <= dayCount; _i2++) {\\n\\t var _date = new Date(time.year, time.month, _i2);\\n\\t var _sclass = '';\\n\\t if (this.disabledDaysArray.indexOf(_date.getDay()) > -1) {\\n\\t _sclass = 'datepicker-item-disable';\\n\\t }\\n\\t if (_i2 == time.day && _date.getFullYear() == time.year && _date.getMonth() == time.month) {\\n\\t _sclass = 'datepicker-dateRange-item-active';\\n\\t }\\n\\t this.dateRange.push({ text: _i2, date: _date, sclass: _sclass });\\n\\t }\\n\\t\\n\\t if (this.dateRange.length < 42) {\\n\\t var nextMonthNeed = 42 - this.dateRange.length;\\n\\t var nextMonth = this.getYearMonth(time.year, time.month + 1);\\n\\t\\n\\t for (var _i3 = 1; _i3 <= nextMonthNeed; _i3++) {\\n\\t var _date2 = new Date(nextMonth.year, nextMonth.month, _i3);\\n\\t var _sclass2 = 'datepicker-item-gray';\\n\\t if (this.disabledDaysArray.indexOf(_date2.getDay()) > -1) {\\n\\t _sclass2 = 'datepicker-item-disable';\\n\\t }\\n\\t this.dateRange.push({ text: _i3, date: _date2, sclass: _sclass2 });\\n\\t }\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('child-created', this);\\n\\t this.currDate = this.parse(this.val) || this.parse(new Date());\\n\\t this._blur = function (e) {\\n\\t if (!_this.$el.contains(e.target)) _this.close();\\n\\t };\\n\\t window.addEventListener('click', this._blur);\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t window.removeEventListener('click', this._blur);\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 104 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"datepicker\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t staticClass: \\\"form-control datepicker-input\\\",\\n\\t class: {\\n\\t 'with-reset-button': _vm.clearButton\\n\\t },\\n\\t style: ({\\n\\t width: _vm.width\\n\\t }),\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"placeholder\\\": _vm.placeholder\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.inputClick,\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.val) ? _vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.val = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayDayView),\\n\\t expression: \\\"displayDayView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextMonthClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextMonthClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', {\\n\\t on: {\\n\\t \\\"click\\\": _vm.switchMonthView\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.stringifyDayHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-weekRange\\\"\\n\\t }, _vm._l((_vm.text.daysOfWeek), function(w) {\\n\\t return _vm._c('span', [_vm._v(_vm._s(w))])\\n\\t })), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-dateRange\\\"\\n\\t }, _vm._l((_vm.dateRange), function(d) {\\n\\t return _vm._c('span', {\\n\\t class: d.sclass,\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.daySelect(d)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(d.text))])\\n\\t }))])])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayMonthView),\\n\\t expression: \\\"displayMonthView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextYearClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextYearClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', {\\n\\t on: {\\n\\t \\\"click\\\": _vm.switchDecadeView\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.stringifyYearHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-monthRange\\\"\\n\\t }, [_vm._l((_vm.text.months), function(m, index) {\\n\\t return [_vm._c('span', {\\n\\t class: {\\n\\t 'datepicker-dateRange-item-active':\\n\\t (_vm.text.months[_vm.parse(_vm.val).getMonth()] === m) &&\\n\\t _vm.currDate.getFullYear() === _vm.parse(_vm.val).getFullYear()\\n\\t },\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(m.substr(0, 3))\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.monthSelect(index)\\n\\t }\\n\\t }\\n\\t })]\\n\\t })], 2)])])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayYearView),\\n\\t expression: \\\"displayYearView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextDecadeClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextDecadeClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', [_vm._v(_vm._s(_vm.stringifyDecadeHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-monthRange decadeRange\\\"\\n\\t }, [_vm._l((_vm.decadeRange), function(decade) {\\n\\t return [_vm._c('span', {\\n\\t class: {\\n\\t 'datepicker-dateRange-item-active': _vm.parse(_vm.val).getFullYear() === decade.text\\n\\t },\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(decade.text)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.stopPropagation();\\n\\t _vm.yearSelect(decade.text)\\n\\t }\\n\\t }\\n\\t })]\\n\\t })], 2)])])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-477b8e5d\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 105 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(106)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(107)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Dropdown.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-39be1072\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-39be1072\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Dropdown.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 106 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tvar _ClickOutside = __webpack_require__(66);\\n\\t\\n\\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t directives: {\\n\\t ClickOutside: _ClickOutside2.default\\n\\t },\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t size: { type: String, default: null },\\n\\t text: { type: String, default: null },\\n\\t type: { type: String, default: 'default' },\\n\\t value: { type: Boolean, default: false }\\n\\t },\\n\\t data: function data() {\\n\\t var show = this.value;\\n\\t return { show: show };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t show: function show(val) {\\n\\t this.$emit('input', val);\\n\\t },\\n\\t value: function value(val) {\\n\\t this.show = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t buttonSize: function buttonSize() {\\n\\t return ~['lg', 'sm', 'xs'].indexOf(this.size) ? 'btn-' + this.size : '';\\n\\t },\\n\\t inInput: function inInput() {\\n\\t return this.$parent._input;\\n\\t },\\n\\t isLi: function isLi() {\\n\\t return this.$parent._isTabs || this.$parent._navbar || this.$parent.menu;\\n\\t },\\n\\t menu: function menu() {\\n\\t return !this.$parent || this.$parent.navbar;\\n\\t },\\n\\t slots: function slots() {\\n\\t return this._slotContents;\\n\\t },\\n\\t submenu: function submenu() {\\n\\t return this.$parent && (this.$parent.menu || this.$parent.submenu);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t blur: function blur() {\\n\\t this.show = false;\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (!this.disabled) {\\n\\t this.show = !this.show;\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t (0, _NodeList2.default)('ul', this.$el).on('click', 'li>a', function (e) {\\n\\t _this.show = false;\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t (0, _NodeList2.default)('ul', this.$el).off();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 107 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.isLi ? 'li' : 'div', {\\n\\t directives: [{\\n\\t name: \\\"click-outside\\\",\\n\\t rawName: \\\"v-click-outside\\\",\\n\\t value: (_vm.blur),\\n\\t expression: \\\"blur\\\"\\n\\t }],\\n\\t tag: \\\"div\\\",\\n\\t class: [{\\n\\t open: _vm.show,\\n\\t disabled: _vm.disabled,\\n\\t dropdown: _vm.isLi,\\n\\t 'input-group-btn': _vm.inInput,\\n\\t 'btn-group': !_vm.isLi && !_vm.inInput\\n\\t }]\\n\\t }, [_vm._t(\\\"before\\\"), _vm._v(\\\" \\\"), (_vm.isLi) ? _vm._c('a', {\\n\\t class: ['dropdown-toggle', _vm.buttonSize, {\\n\\t disabled: _vm.disabled\\n\\t }],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.show = false\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"button\\\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"caret\\\"\\n\\t })], 2) : _vm._c('button', {\\n\\t class: ['btn btn-' + _vm.type, _vm.buttonSize, 'dropdown-toggle'],\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\",\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.show = false\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"button\\\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"caret\\\"\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._t(\\\"dropdown-menu\\\", [_vm._c('ul', {\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-39be1072\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 108 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(109)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(110)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\FormGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-79eb400a\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-79eb400a\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] FormGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 109 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t// let coerce = {\\n\\t// enterSubmit: 'boolean',\\n\\t// icon: 'boolean'\\n\\t// }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t enterSubmit: {\\n\\t type: Boolean,\\n\\t default: false\\n\\t },\\n\\t icon: {\\n\\t type: Boolean,\\n\\t default: false\\n\\t },\\n\\t lang: {\\n\\t type: String,\\n\\t default: navigator.language\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t children: [],\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t validate: function validate() {\\n\\t var valid = true;\\n\\t this.children.some(function (el) {\\n\\t var v = el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\\n\\t if (!v) valid = false;\\n\\t return !valid;\\n\\t });\\n\\t this.valid = valid;\\n\\t return valid === true;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._formGroup = true;\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formGroup) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formGroup) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.validate();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\n/***/ },\\n/* 110 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-79eb400a\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 111 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(112)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(113)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\FormValidator.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-b9f57c46\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-b9f57c46\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] FormValidator.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 112 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t enterSubmit: { type: Boolean, default: false },\\n\\t icon: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t value: null\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t children: [],\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit('input', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t validate: function validate() {\\n\\t var invalid = !this.children.every(function (el) {\\n\\t return el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\\n\\t });\\n\\t this.valid = !invalid;\\n\\t return !invalid;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._formValidator = true;\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.validate();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\n/***/ },\\n/* 113 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-b9f57c46\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 114 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(115)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(117)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(118)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Input.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-652ad7b9\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-652ad7b9\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-652ad7b9\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Input.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 115 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 117 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\tvar DELAY = 300;\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t clearButton: { type: Boolean, default: false },\\n\\t cols: { type: Number, default: null },\\n\\t datalist: { type: Array, default: null },\\n\\t disabled: { type: Boolean, default: false },\\n\\t enterSubmit: { type: Boolean, default: false },\\n\\t error: { type: String, default: null },\\n\\t help: { type: String, default: null },\\n\\t hideHelp: { type: Boolean, default: true },\\n\\t icon: { type: Boolean, default: false },\\n\\t label: { type: String, default: null },\\n\\t lang: { type: String, default: navigator.language },\\n\\t mask: null,\\n\\t maskDelay: { type: Number, default: 100 },\\n\\t match: { type: String, default: null },\\n\\t max: { type: String, default: null },\\n\\t maxlength: { type: Number, default: null },\\n\\t min: { type: String, default: null },\\n\\t minlength: { type: Number, default: 0 },\\n\\t name: { type: String, default: null },\\n\\t pattern: { default: null },\\n\\t placeholder: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t required: { type: Boolean, default: false },\\n\\t rows: { type: Number, default: 3 },\\n\\t step: { type: Number, default: null },\\n\\t type: { type: String, default: 'text' },\\n\\t url: { type: String, default: null },\\n\\t urlMap: { type: Function, default: null },\\n\\t validationDelay: { type: Number, default: 250 },\\n\\t value: { default: null }\\n\\t },\\n\\t data: function data() {\\n\\t var val = this.value;\\n\\t return {\\n\\t options: this.datalist,\\n\\t val: val,\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t canValidate: function canValidate() {\\n\\t return !this.disabled && !this.readonly && (this.required || this.regex || this.nativeValidate || this.match !== null);\\n\\t },\\n\\t errorText: function errorText() {\\n\\t var value = this.value;\\n\\t var error = [this.error];\\n\\t if (!value && this.required) error.push('(' + this.text.required.toLowerCase() + ')');\\n\\t if (value && value.length < this.minlength) error.push('(' + this.text.minLength.toLowerCase() + ': ' + this.minlength + ')');\\n\\t return error.join(' ');\\n\\t },\\n\\t id_datalist: function id_datalist() {\\n\\t if (this.type !== 'textarea' && this.datalist instanceof Array) {\\n\\t if (!this._id_datalist) {\\n\\t if (!this.$root.id_datalist) {\\n\\t this.$root.id_datalist = 0;\\n\\t }\\n\\t this._id_datalist = 'input-datalist' + this.$root.id_datalist++;\\n\\t }\\n\\t return this._id_datalist;\\n\\t }\\n\\t return null;\\n\\t },\\n\\t input: function input() {\\n\\t return this.$refs.input;\\n\\t },\\n\\t nativeValidate: function nativeValidate() {\\n\\t return (this.input || {}).checkValidity && (~['url', 'email'].indexOf(this.type.toLowerCase()) || this.min || this.max);\\n\\t },\\n\\t regex: function regex() {\\n\\t return _utils.coerce.pattern(this.pattern);\\n\\t },\\n\\t showError: function showError() {\\n\\t return this.error && this.valid === false;\\n\\t },\\n\\t showHelp: function showHelp() {\\n\\t return this.help && (!this.showError || !this.hideHelp);\\n\\t },\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t title: function title() {\\n\\t return this.errorText || this.help || '';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t datalist: function datalist(val, old) {\\n\\t if (val !== old && val instanceof Array) {\\n\\t this.options = val;\\n\\t }\\n\\t },\\n\\t match: function match(val) {\\n\\t this.eval();\\n\\t },\\n\\t options: function options(val, old) {\\n\\t if (val !== old) this.$emit('options', val);\\n\\t },\\n\\t url: function url(val) {\\n\\t this._url();\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('input', _val);\\n\\t if (_val !== old) {\\n\\t if (this.mask instanceof Function) {\\n\\t _val = this.mask(_val || '');\\n\\t if (this.val !== _val) {\\n\\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\\n\\t this._timeout.mask = setTimeout(function () {\\n\\t _this.val = _val;\\n\\t }, isNaN(this.maskDelay) ? 0 : this.maskDelay);\\n\\t }\\n\\t }\\n\\t this.eval();\\n\\t }\\n\\t },\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (this._parent) this._parent.validate();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t attr: function attr(value) {\\n\\t return ~['', null, undefined].indexOf(value) || value instanceof Function ? null : value;\\n\\t },\\n\\t emit: function emit(e) {\\n\\t this.$emit(e.type, e.type == 'input' ? e.target.value : e);\\n\\t if (e.type === 'blur' && this.canValidate) {\\n\\t this.valid = this.validate();\\n\\t }\\n\\t },\\n\\t eval: function _eval() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\\n\\t if (!this.canValidate) {\\n\\t this.valid = true;\\n\\t } else {\\n\\t this._timeout.eval = setTimeout(function () {\\n\\t _this2.valid = _this2.validate();\\n\\t _this2._timeout.eval = null;\\n\\t }, this.validationDelay);\\n\\t }\\n\\t },\\n\\t focus: function focus() {\\n\\t this.input.focus();\\n\\t },\\n\\t submit: function submit() {\\n\\t if (this.$parent._formValidator) {\\n\\t return this.$parent.validate();\\n\\t }\\n\\t if (this.input.form) {\\n\\t var invalids = (0, _NodeList2.default)('.form-group.validate:not(.has-success)', this.input.form);\\n\\t if (invalids.length) {\\n\\t invalids.find('input,textarea,select')[0].focus();\\n\\t } else {\\n\\t this.input.form.submit();\\n\\t }\\n\\t }\\n\\t },\\n\\t validate: function validate() {\\n\\t if (!this.canValidate) {\\n\\t return true;\\n\\t }\\n\\t var value = (this.val || '').trim();\\n\\t if (!value) {\\n\\t return !this.required;\\n\\t }\\n\\t if (this.match !== null) {\\n\\t return this.match === value;\\n\\t }\\n\\t if (value.length < this.minlength) {\\n\\t return false;\\n\\t }\\n\\t if (this.nativeValidate && !this.input.checkValidity()) {\\n\\t return false;\\n\\t }\\n\\t if (this.regex) {\\n\\t if (!(this.regex instanceof Function ? this.regex(this.val) : this.regex.test(this.val))) {\\n\\t return false;\\n\\t }\\n\\t }\\n\\t return true;\\n\\t },\\n\\t reset: function reset() {\\n\\t this.value = '';\\n\\t this.valid = null;\\n\\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\\n\\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._input = true;\\n\\t this._timeout = {};\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t this._url = (0, _utils.delayer)(function () {\\n\\t var _this3 = this;\\n\\t\\n\\t if (!this.url || !this.$http || this._loading) {\\n\\t return;\\n\\t }\\n\\t this._loading = true;\\n\\t this.$http.get(this.url).then(function (response) {\\n\\t var data = response.data instanceof Array ? response.data : [];\\n\\t try {\\n\\t data = JSON.parse(data);\\n\\t } catch (e) {}\\n\\t if (_this3.urlMap) {\\n\\t data = data.map(_this3.urlMap);\\n\\t }\\n\\t _this3.options = data;\\n\\t _this3.loading = false;\\n\\t }, function (response) {\\n\\t _this3.loading = false;\\n\\t });\\n\\t }, DELAY);\\n\\t if (this.url) this._url();\\n\\t },\\n\\t mounted: function mounted() {\\n\\t // $(this.input).on('focus', e => { this.$emit('focus', e) }).on('blur', e => {\\n\\t // if (this.canValidate) { this.valid = this.validate() }\\n\\t // this.$emit('blur', e)\\n\\t // })\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t // $(this.input).off()\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 118 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"form-group\\\",\\n\\t class: {\\n\\t validate: _vm.canValidate, 'has-feedback': _vm.icon, 'has-error': _vm.canValidate && _vm.valid === false, 'has-success': _vm.canValidate && _vm.valid\\n\\t }\\n\\t }, [_vm._t(\\\"label\\\", [(_vm.label) ? _vm._c('label', {\\n\\t staticClass: \\\"control-label\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.label))]) : _vm._e()]), _vm._v(\\\" \\\"), (_vm.$slots.before || _vm.$slots.after) ? _vm._c('div', {\\n\\t staticClass: \\\"input-group\\\"\\n\\t }, [_vm._t(\\\"before\\\"), _vm._v(\\\" \\\"), _vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t tag: \\\"textarea\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"cols\\\": _vm.cols,\\n\\t \\\"disabled\\\": _vm.disabled,\\n\\t \\\"list\\\": _vm.id_datalist,\\n\\t \\\"max\\\": _vm.attr(_vm.max),\\n\\t \\\"maxlength\\\": _vm.maxlength,\\n\\t \\\"min\\\": _vm.attr(_vm.min),\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"rows\\\": _vm.rows,\\n\\t \\\"step\\\": _vm.step,\\n\\t \\\"title\\\": _vm.attr(_vm.title),\\n\\t \\\"type\\\": _vm.type == 'textarea' ? null : _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": _vm.emit,\\n\\t \\\"focus\\\": _vm.emit,\\n\\t \\\"input\\\": [function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }, _vm.emit],\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.value) ? _vm._c('div', {\\n\\t class: {\\n\\t icon: _vm.icon\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.value = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.icon) ? _vm._c('div', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }, [(_vm.icon && _vm.valid !== null) ? _vm._c('span', {\\n\\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t }) : _vm._e()]) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"after\\\")], 2) : [_vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t tag: \\\"textarea\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"cols\\\": _vm.cols,\\n\\t \\\"disabled\\\": _vm.disabled,\\n\\t \\\"list\\\": _vm.id_datalist,\\n\\t \\\"max\\\": _vm.attr(_vm.max),\\n\\t \\\"maxlength\\\": _vm.maxlength,\\n\\t \\\"min\\\": _vm.attr(_vm.min),\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"rows\\\": _vm.rows,\\n\\t \\\"step\\\": _vm.step,\\n\\t \\\"title\\\": _vm.attr(_vm.title),\\n\\t \\\"type\\\": _vm.type == 'textarea' ? null : _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": _vm.emit,\\n\\t \\\"focus\\\": _vm.emit,\\n\\t \\\"input\\\": [function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }, _vm.emit],\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.val) ? _vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.val = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.icon && _vm.valid !== null) ? _vm._c('span', {\\n\\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t }) : _vm._e()], _vm._v(\\\" \\\"), (_vm.id_datalist) ? _vm._c('datalist', {\\n\\t attrs: {\\n\\t \\\"id\\\": _vm.id_datalist\\n\\t }\\n\\t }, _vm._l((_vm.options), function(opc) {\\n\\t return _vm._c('option', {\\n\\t domProps: {\\n\\t \\\"value\\\": opc\\n\\t }\\n\\t })\\n\\t })) : _vm._e(), _vm._v(\\\" \\\"), (_vm.showHelp) ? _vm._c('div', {\\n\\t staticClass: \\\"help-block\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.help))]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.showError) ? _vm._c('div', {\\n\\t staticClass: \\\"help-block with-errors\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.errorText))]) : _vm._e()], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-652ad7b9\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 119 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(120)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(122)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(127)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Modal.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-fe7d5dc8\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-fe7d5dc8\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Modal.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 120 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 122 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _isInteger = __webpack_require__(123);\\n\\t\\n\\tvar _isInteger2 = _interopRequireDefault(_isInteger);\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t backdrop: { type: Boolean, default: true },\\n\\t callback: { type: Function, default: null },\\n\\t cancelText: { type: String, default: 'Close' },\\n\\t effect: { type: String, default: null },\\n\\t large: { type: Boolean, default: false },\\n\\t okText: { type: String, default: 'Save changes' },\\n\\t small: { type: Boolean, default: false },\\n\\t title: { type: String, default: '' },\\n\\t value: { type: Boolean, required: true },\\n\\t width: { default: null }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t transition: false,\\n\\t val: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t optionalWidth: function optionalWidth() {\\n\\t if (this.width === null) {\\n\\t return null;\\n\\t } else if ((0, _isInteger2.default)(this.width)) {\\n\\t return this.width + 'px';\\n\\t }\\n\\t return this.width;\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t transition: function transition(val, old) {\\n\\t if (val === old) {\\n\\t return;\\n\\t }\\n\\t var el = this.$el;\\n\\t var body = document.body;\\n\\t if (val) {\\n\\t //starting\\n\\t if (this.val) {\\n\\t el.querySelector('.modal-content').focus();\\n\\t el.style.display = 'block';\\n\\t setTimeout(function () {\\n\\t return el.classList.add('in');\\n\\t }, 0);\\n\\t body.classList.add('modal-open');\\n\\t if ((0, _utils.getScrollBarWidth)() !== 0) {\\n\\t body.style.paddingRight = (0, _utils.getScrollBarWidth)() + 'px';\\n\\t }\\n\\t } else {\\n\\t el.classList.remove('in');\\n\\t }\\n\\t } else {\\n\\t //ending\\n\\t this.$emit(this.val ? 'opened' : 'closed');\\n\\t if (!this.val) {\\n\\t el.style.display = 'none';\\n\\t body.style.paddingRight = null;\\n\\t body.classList.remove('modal-open');\\n\\t }\\n\\t }\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t if (old === null ? _val === true : _val !== old) this.transition = true;\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) this.val = val;\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t action: function action(val, p) {\\n\\t if (val === null) {\\n\\t return;\\n\\t }\\n\\t if (val && this.callback instanceof Function) this.callback();\\n\\t this.$emit(val ? 'ok' : 'cancel', p);\\n\\t this.val = val || false;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.val = this.value;\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 123 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports = { \\\"default\\\": __webpack_require__(124), __esModule: true };\\n\\n/***/ },\\n/* 124 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(125);\\n\\tmodule.exports = __webpack_require__(7).Number.isInteger;\\n\\n/***/ },\\n/* 125 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 20.1.2.3 Number.isInteger(number)\\n\\tvar $export = __webpack_require__(5);\\n\\t\\n\\t$export($export.S, 'Number', {isInteger: __webpack_require__(126)});\\n\\n/***/ },\\n/* 126 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 20.1.2.3 Number.isInteger(number)\\n\\tvar isObject = __webpack_require__(13)\\n\\t , floor = Math.floor;\\n\\tmodule.exports = function isInteger(it){\\n\\t return !isObject(it) && isFinite(it) && floor(it) === it;\\n\\t};\\n\\n/***/ },\\n/* 127 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['modal', _vm.effect],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"dialog\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.backdrop && _vm.action(false, 1)\\n\\t },\\n\\t \\\"transitionend\\\": function($event) {\\n\\t _vm.transition = false\\n\\t }\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t class: ['modal-dialog', {\\n\\t 'modal-lg': _vm.large,\\n\\t 'modal-sm': _vm.small\\n\\t }],\\n\\t style: ({\\n\\t width: _vm.optionalWidth\\n\\t }),\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"document\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.stopPropagation();\\n\\t _vm.action(null)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"modal-content\\\"\\n\\t }, [_vm._t(\\\"modal-header\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-header\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.action(false, 2)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]), _vm._v(\\\" \\\"), _vm._c('h4', {\\n\\t staticClass: \\\"modal-title\\\"\\n\\t }, [_vm._t(\\\"title\\\", [_vm._v(_vm._s(_vm.title))])], 2)])]), _vm._v(\\\" \\\"), _vm._t(\\\"modal-body\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)]), _vm._v(\\\" \\\"), _vm._t(\\\"modal-footer\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-footer\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"btn btn-default\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.action(false, 3)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.cancelText))]), _vm._v(\\\" \\\"), _vm._c('button', {\\n\\t staticClass: \\\"btn btn-primary\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.action(true, 4)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.okText))])])])], 2)])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-fe7d5dc8\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 128 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(129)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(130)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Navbar.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-38f0619e\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-38f0619e\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Navbar.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 129 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t type: { type: String, default: 'default' },\\n\\t placement: { type: String, default: '' },\\n\\t container: { type: String, default: '' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t id: 'bs-example-navbar-collapse-1',\\n\\t collapsed: true,\\n\\t styles: {}\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t slots: function slots() {\\n\\t return this._slotContents;\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggleCollapse: function toggleCollapse(e) {\\n\\t e && e.preventDefault();\\n\\t this.collapsed = !this.collapsed;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._navbar = true;\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t try {\\n\\t (function () {\\n\\t var $dropdown = (0, _NodeList2.default)('.dropdown>[data-toggle=\\\"dropdown\\\"]', _this.$el).parent();\\n\\t if ($dropdown) {\\n\\t $dropdown.on('click', '.dropdown-toggle', function (e) {\\n\\t e.preventDefault();\\n\\t $dropdown.each(function (content) {\\n\\t if (content.contains(e.target)) content.classList.toggle('open');\\n\\t });\\n\\t }).on('click', '.dropdown-menu>li>a', function (e) {\\n\\t $dropdown.each(function (content) {\\n\\t if (content.contains(e.target)) content.classList.remove('open');\\n\\t });\\n\\t }).onBlur(function (e) {\\n\\t $dropdown.each(function (content) {\\n\\t if (!content.contains(e.target)) content.classList.remove('open');\\n\\t });\\n\\t });\\n\\t }\\n\\t })();\\n\\t } catch (ex) {\\n\\t console.log('error finding dropdown');\\n\\t }\\n\\t\\n\\t (0, _NodeList2.default)(this.$el).on('click touchstart', 'li:not(.dropdown)>a', function (e) {\\n\\t setTimeout(function () {\\n\\t _this.collapsed = true;\\n\\t }, 200);\\n\\t }).onBlur(function (e) {\\n\\t if (!_this.$el.contains(e.target)) {\\n\\t _this.collapsed = true;\\n\\t }\\n\\t });\\n\\t var height = this.$el.offsetHeight;\\n\\t if (this.placement === 'top') {\\n\\t document.body.style.paddingTop = height + 'px';\\n\\t }\\n\\t if (this.placement === 'bottom') {\\n\\t document.body.style.paddingBottom = height + 'px';\\n\\t }\\n\\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\\\"collapse\\\"]', this.$el).on('click', function (e) {\\n\\t return _this.toggleCollapse(e);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t (0, _NodeList2.default)('.dropdown', this.$el).off('click').offBlur();\\n\\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\\\"collapse\\\"]', this.$el).off('click');\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 130 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('nav', {\\n\\t class: ['navbar', 'navbar-' + _vm.type, _vm.placement === 'static' ? 'navbar-static-top' : 'navbar-fixed-' + _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t class: _vm.container === 'fluid' ? 'container-fluid' : 'container'\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"navbar-header\\\"\\n\\t }, [(!_vm.$slots.collapse) ? _vm._c('button', {\\n\\t staticClass: \\\"navbar-toggle collapsed\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\",\\n\\t \\\"aria-expanded\\\": \\\"false\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggleCollapse\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"sr-only\\\"\\n\\t }, [_vm._v(\\\"Toggle navigation\\\")]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t })]) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"collapse\\\"), _vm._v(\\\" \\\"), _vm._t(\\\"brand\\\")], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t class: ['navbar-collapse', {\\n\\t collapse: _vm.collapsed\\n\\t }]\\n\\t }, [_vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2), _vm._v(\\\" \\\"), (_vm.$slots.left) ? _vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav navbar-left\\\"\\n\\t }, [_vm._t(\\\"left\\\")], 2) : _vm._e(), _vm._v(\\\" \\\"), (_vm.$slots.right) ? _vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav navbar-right\\\"\\n\\t }, [_vm._t(\\\"right\\\")], 2) : _vm._e()])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-38f0619e\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 131 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(132)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(133)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Option.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-42088116\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-42088116\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Option.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 132 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: { value: null },\\n\\t data: function data() {\\n\\t return { loading: true };\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this.$parent._select) {\\n\\t if (!this.$parent.options) {\\n\\t this.$parent.options = [];\\n\\t }\\n\\t var el = {};\\n\\t el[this.$parent.optionsLabel] = this.$el.innerHTML;\\n\\t el[this.$parent.optionsValue] = this.value;\\n\\t this.$parent.options.push(el);\\n\\t this.loading = false;\\n\\t } else {\\n\\t console.warn('options only work inside a select component');\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 133 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return (_vm.loading) ? _vm._c('li', [_vm._t(\\\"default\\\")], 2) : _vm._e()\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-42088116\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 134 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(135)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(137)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(138)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Panel.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-b1e0461a\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-b1e0461a\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Panel.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 135 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 137 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t header: { type: String },\\n\\t isOpen: { type: Boolean, default: null },\\n\\t type: { type: String, default: null }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t open: this.isOpen\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t isOpen: function isOpen(val) {\\n\\t this.open = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t inAccordion: function inAccordion() {\\n\\t return this.$parent && this.$parent._isAccordion;\\n\\t },\\n\\t panelType: function panelType() {\\n\\t return 'panel-' + (this.type || this.$parent && this.$parent.type || 'default');\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggle: function toggle() {\\n\\t this.open = !this.open;\\n\\t if (this.inAccordion) {\\n\\t this.$parent.openChild(this);\\n\\t }\\n\\t },\\n\\t enter: function enter(el) {\\n\\t el.style.height = 'auto';\\n\\t var endWidth = getComputedStyle(el).height;\\n\\t el.style.height = '0px';\\n\\t el.offsetHeight; // force repaint\\n\\t el.style.height = endWidth;\\n\\t },\\n\\t afterEnter: function afterEnter(el) {\\n\\t el.style.height = 'auto';\\n\\t },\\n\\t beforeLeave: function beforeLeave(el) {\\n\\t el.style.height = getComputedStyle(el).height;\\n\\t el.offsetHeight; // force repaint\\n\\t el.style.height = '0px';\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.isOpen === null) {\\n\\t this.open = !this.inAccordion;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 138 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['panel', _vm.panelType]\\n\\t }, [_vm._c('div', {\\n\\t class: ['panel-heading', {\\n\\t 'accordion-toggle': _vm.inAccordion\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.inAccordion && _vm.toggle()\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"header\\\", [_vm._c('h4', {\\n\\t staticClass: \\\"panel-title\\\"\\n\\t }, [_vm._v(_vm._s(_vm.header))])])], 2), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"collapse\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"enter\\\": _vm.enter,\\n\\t \\\"after-enter\\\": _vm.afterEnter,\\n\\t \\\"before-leave\\\": _vm.beforeLeave\\n\\t }\\n\\t }, [(_vm.open) ? _vm._c('div', {\\n\\t staticClass: \\\"panel-collapse\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"panel-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)]) : _vm._e()])], 1)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-b1e0461a\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 139 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(140)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(142)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(144)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Popover.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-2465bf54\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-2465bf54\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Popover.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 140 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 142 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _popoverMixins = __webpack_require__(143);\\n\\t\\n\\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t mixins: [_popoverMixins2.default],\\n\\t props: {\\n\\t trigger: { type: String, default: 'click' }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 143 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t content: { type: String },\\n\\t effect: { type: String, default: 'fade' },\\n\\t header: { type: Boolean, default: true },\\n\\t placement: { type: String, default: 'top' },\\n\\t title: { type: String },\\n\\t trigger: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t top: 0,\\n\\t left: 0,\\n\\t show: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t events: function events() {\\n\\t return { contextmenu: ['contextmenu'], hover: ['mouseleave', 'mouseenter'], focus: ['blur', 'focus'] }[this.trigger] || ['click'];\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t beforeEnter: function beforeEnter() {\\n\\t var _this = this;\\n\\t\\n\\t this.position();\\n\\t setTimeout(function () {\\n\\t return _this.position();\\n\\t }, 30);\\n\\t },\\n\\t position: function position() {\\n\\t var _this2 = this;\\n\\t\\n\\t this.$nextTick(function () {\\n\\t var popover = _this2.$refs.popover;\\n\\t var trigger = _this2.$refs.trigger.children[0];\\n\\t switch (_this2.placement) {\\n\\t case 'top':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\\n\\t _this2.top = trigger.offsetTop - popover.offsetHeight;\\n\\t break;\\n\\t case 'left':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\\n\\t break;\\n\\t case 'right':\\n\\t _this2.left = trigger.offsetLeft + trigger.offsetWidth;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\\n\\t break;\\n\\t case 'bottom':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight;\\n\\t break;\\n\\t default:\\n\\t console.warn('Wrong placement prop');\\n\\t }\\n\\t popover.style.top = _this2.top + 'px';\\n\\t popover.style.left = _this2.left + 'px';\\n\\t });\\n\\t },\\n\\t toggle: function toggle(e) {\\n\\t if (e && this.trigger === 'contextmenu') e.preventDefault();\\n\\t this.show = !this.show;\\n\\t if (this.show) this.beforeEnter();\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this3 = this;\\n\\t\\n\\t var trigger = this.$refs.trigger.children[0];\\n\\t if (!trigger) return console.error('Could not find trigger v-el in your component that uses popoverMixin.');\\n\\t\\n\\t if (this.trigger === 'focus' && !~trigger.tabIndex) {\\n\\t trigger = (0, _NodeList2.default)('a,input,select,textarea,button', trigger);\\n\\t if (!trigger.length) {\\n\\t return;\\n\\t }\\n\\t }\\n\\t this.events.forEach(function (event) {\\n\\t (0, _NodeList2.default)(trigger).on(event, _this3.toggle);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._trigger) (0, _NodeList2.default)(this._trigger).off();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 144 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', {\\n\\t ref: \\\"trigger\\\"\\n\\t }, [_vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.effect\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t ref: \\\"popover\\\",\\n\\t class: ['popover', _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"arrow\\\"\\n\\t }), _vm._v(\\\" \\\"), (_vm.title) ? _vm._c('h3', {\\n\\t staticClass: \\\"popover-title\\\"\\n\\t }, [_vm._t(\\\"title\\\", [_vm._v(_vm._s(_vm.title))])], 2) : _vm._e(), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"popover-content\\\"\\n\\t }, [_vm._t(\\\"content\\\", [_vm._c('span', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.content)\\n\\t }\\n\\t })])], 2)]) : _vm._e()])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-2465bf54\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 145 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(146)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(147)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Progressbar.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-68aa3375\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-68aa3375\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Progressbar.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 146 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t animated: { type: Boolean, default: false },\\n\\t label: { default: false },\\n\\t now: { required: true },\\n\\t striped: { type: Boolean, default: false },\\n\\t type: { type: String }\\n\\t },\\n\\t computed: {\\n\\t labelBool: function labelBool() {\\n\\t return _utils.coerce.boolean(this.label);\\n\\t },\\n\\t nowNum: function nowNum() {\\n\\t return _utils.coerce.number(this.now);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 147 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['progress-bar', 'progress-bar-' + _vm.type, {\\n\\t active: _vm.animated,\\n\\t 'progress-bar-striped': _vm.striped\\n\\t }],\\n\\t style: ({\\n\\t width: _vm.nowNum + '%'\\n\\t }),\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(_vm.labelBool ? _vm.nowNum + '%' : null)\\n\\t }\\n\\t })\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-68aa3375\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 148 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(149)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(151)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(152)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Radio.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-74cfd92c\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-74cfd92c\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Radio.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 149 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 151 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t button: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t name: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t selectedValue: { default: true },\\n\\t type: { type: String, default: null },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t check: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t return this.check === this.selectedValue;\\n\\t },\\n\\t inGroup: function inGroup() {\\n\\t return this.$parent && this.$parent.btnGroup && !this.$parent._checkboxGroup;\\n\\t },\\n\\t parentValue: function parentValue() {\\n\\t return this.$parent.val;\\n\\t },\\n\\t buttonStyle: function buttonStyle() {\\n\\t return this.button || this.$parent && this.$parent.btnGroup && this.$parent.buttons;\\n\\t },\\n\\t typeColor: function typeColor() {\\n\\t return this.type || this.$parent && this.$parent.type || 'default';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t check: function check(val) {\\n\\t if (this.selectedValue === val) {\\n\\t this.$emit('input', val);\\n\\t this.$emit('checked', true);\\n\\t this.updateParent();\\n\\t }\\n\\t },\\n\\t parentValue: function parentValue(val) {\\n\\t this.updateFromParent();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.selectedValue == val) {\\n\\t this.check = val;\\n\\t } else {\\n\\t this.check = false;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.inGroup) {\\n\\t var parent = this.$parent;\\n\\t parent._radioGroup = true;\\n\\t this.updateFromParent();\\n\\t }\\n\\t },\\n\\t\\n\\t methods: {\\n\\t updateFromParent: function updateFromParent() {\\n\\t if (this.inGroup) {\\n\\t if (this.selectedValue == this.$parent.val) {\\n\\t this.check = this.selectedValue;\\n\\t } else {\\n\\t this.check = false;\\n\\t }\\n\\t }\\n\\t },\\n\\t updateParent: function updateParent() {\\n\\t if (this.inGroup) {\\n\\t if (this.selectedValue === this.check) {\\n\\t this.$parent.val = this.selectedValue;\\n\\t }\\n\\t }\\n\\t },\\n\\t focus: function focus() {\\n\\t this.$refs.input.focus();\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled) {\\n\\t return;\\n\\t }\\n\\t this.focus();\\n\\t if (this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.check = this.selectedValue;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 152 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.buttonStyle ? 'label' : 'div', {\\n\\t tag: \\\"div\\\",\\n\\t class: [(_vm.buttonStyle ? 'btn btn-' + _vm.typeColor : 'radio ' + _vm.typeColor), {\\n\\t active: _vm.active,\\n\\t disabled: _vm.disabled,\\n\\t readonly: _vm.readonly\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [(_vm.buttonStyle) ? [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (!_vm.readonly),\\n\\t expression: \\\"!readonly\\\"\\n\\t }, {\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.check),\\n\\t expression: \\\"check\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"radio\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.selectedValue,\\n\\t \\\"checked\\\": _vm._q(_vm.check, _vm.selectedValue)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.check = _vm.selectedValue\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")] : _vm._c('label', {\\n\\t staticClass: \\\"open\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.check),\\n\\t expression: \\\"check\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"radio\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.selectedValue,\\n\\t \\\"checked\\\": _vm._q(_vm.check, _vm.selectedValue)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.check = _vm.selectedValue\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon dropdown-toggle\\\",\\n\\t class: [_vm.active ? 'btn-' + _vm.typeColor : '', {\\n\\t bg: _vm.typeColor === 'default'\\n\\t }]\\n\\t }), _vm._v(\\\" \\\"), (_vm.active && _vm.typeColor === 'default') ? _vm._c('span', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")], 2)], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-74cfd92c\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 153 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(154)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(156)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(157)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Select.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-e514dbc6\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-e514dbc6\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-e514dbc6\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Select.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 154 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 156 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _ClickOutside = __webpack_require__(66);\\n\\t\\n\\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\tvar timeout = {};\\n\\texports.default = {\\n\\t directives: {\\n\\t ClickOutside: _ClickOutside2.default\\n\\t },\\n\\t props: {\\n\\t clearButton: { type: Boolean, default: false },\\n\\t closeOnSelect: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t limit: { type: Number, default: 1024 },\\n\\t minSearch: { type: Number, default: 0 },\\n\\t multiple: { type: Boolean, default: false },\\n\\t name: { type: String, default: null },\\n\\t options: { type: Array, default: function _default() {\\n\\t return [];\\n\\t }\\n\\t },\\n\\t optionsLabel: { type: String, default: 'label' },\\n\\t optionsValue: { type: String, default: 'value' },\\n\\t parent: { default: true },\\n\\t placeholder: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: null },\\n\\t required: { type: Boolean, default: null },\\n\\t search: { type: Boolean, default: false },\\n\\t searchText: { type: String, default: null },\\n\\t countText: { type: String, default: null },\\n\\t showCount: { type: Boolean, default: false },\\n\\t url: { type: String, default: null },\\n\\t value: null\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t list: [],\\n\\t loading: null,\\n\\t searchValue: null,\\n\\t show: false,\\n\\t notify: false,\\n\\t val: null,\\n\\t valid: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t canSearch: function canSearch() {\\n\\t return this.minSearch ? this.list.length >= this.minSearch : this.search;\\n\\t },\\n\\t classes: function classes() {\\n\\t return [{ open: this.show, disabled: this.disabled }, this.class, this.isLi ? 'dropdown' : this.inInput ? 'input-group-btn' : 'btn-group'];\\n\\t },\\n\\t filteredOptions: function filteredOptions() {\\n\\t var _this = this;\\n\\t\\n\\t var search = (this.searchValue || '').toLowerCase();\\n\\t return !search ? this.list : this.list.filter(function (el) {\\n\\t return ~el[_this.optionsLabel].toLowerCase().search(search);\\n\\t });\\n\\t },\\n\\t hasParent: function hasParent() {\\n\\t return this.parent instanceof Array ? this.parent.length : this.parent;\\n\\t },\\n\\t inInput: function inInput() {\\n\\t return this.$parent._input;\\n\\t },\\n\\t isLi: function isLi() {\\n\\t return this.$parent._navbar || this.$parent.menu || this.$parent._tabset;\\n\\t },\\n\\t limitText: function limitText() {\\n\\t return this.text.limit.replace('{{limit}}', this.limit);\\n\\t },\\n\\t selected: function selected() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this.list.length === 0) {\\n\\t return '';\\n\\t }\\n\\t var sel = this.values.map(function (val) {\\n\\t return (_this2.list.find(function (o) {\\n\\t return o[_this2.optionsValue] === val;\\n\\t }) || {})[_this2.optionsLabel];\\n\\t }).filter(function (val) {\\n\\t return val !== undefined;\\n\\t });\\n\\t this.$emit('selected', sel);\\n\\t return sel.join(', ');\\n\\t },\\n\\t selectedText: function selectedText() {\\n\\t return this.countText || this.text.selected.replace('{{count}}', this.values.length);\\n\\t },\\n\\t showPlaceholder: function showPlaceholder() {\\n\\t return this.values.length === 0 || !this.hasParent ? this.placeholder || this.text.notSelected : null;\\n\\t },\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t values: function values() {\\n\\t return this.val instanceof Array ? this.val : ~[null, undefined].indexOf(this.val) ? [] : [this.val];\\n\\t },\\n\\t valOptions: function valOptions() {\\n\\t var _this3 = this;\\n\\t\\n\\t return this.list.map(function (el) {\\n\\t return el[_this3.optionsValue];\\n\\t });\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t options: function options(_options) {\\n\\t if (_options instanceof Array) this.setOptions(_options);\\n\\t },\\n\\t show: function show(val) {\\n\\t if (val) {\\n\\t this.$refs.search ? this.$refs.search.focus() : this.$refs.btn.focus();\\n\\t // onBlur(this.$refs.select, e => { this.show = false })\\n\\t } else {\\n\\t // offBlur(this.$refs.select)\\n\\t }\\n\\t },\\n\\t url: function url() {\\n\\t this.urlChanged();\\n\\t },\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this.val = val;\\n\\t }\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t var _this4 = this;\\n\\t\\n\\t if (_val === undefined) {\\n\\t this.val = _val = null;\\n\\t }\\n\\t if (_val !== old) {\\n\\t this.$emit('change', _val);\\n\\t this.$emit('input', _val);\\n\\t }\\n\\t if (_val instanceof Array && _val.length > this.limit) {\\n\\t this.val = _val.slice(0, this.limit);\\n\\t this.notify = true;\\n\\t if (timeout.limit) clearTimeout(timeout.limit);\\n\\t timeout.limit = setTimeout(function () {\\n\\t timeout.limit = false;\\n\\t _this4.notify = false;\\n\\t }, 1500);\\n\\t }\\n\\t this.valid = this.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t close: function close() {\\n\\t this.show = false;\\n\\t },\\n\\t checkData: function checkData() {\\n\\t if (this.multiple) {\\n\\t if (this.limit < 1) {\\n\\t this.limit = 1;\\n\\t }\\n\\t if (!(this.val instanceof Array)) {\\n\\t this.val = this.val === null || this.val === undefined ? [] : [this.val];\\n\\t }\\n\\t var values = this.valOptions;\\n\\t this.val = this.val.filter(function (el) {\\n\\t return ~values.indexOf(el);\\n\\t });\\n\\t if (this.values.length > this.limit) {\\n\\t this.val = this.val.slice(0, this.limit);\\n\\t }\\n\\t } else {\\n\\t if (!~this.valOptions.indexOf(this.val)) {\\n\\t this.val = null;\\n\\t }\\n\\t }\\n\\t },\\n\\t clear: function clear() {\\n\\t if (this.disabled || this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.val = this.val instanceof Array ? [] : null;\\n\\t this.toggle();\\n\\t },\\n\\t clearSearch: function clearSearch() {\\n\\t this.searchValue = '';\\n\\t this.$refs.search.focus();\\n\\t },\\n\\t isSelected: function isSelected(v) {\\n\\t return this.values.indexOf(v) > -1;\\n\\t },\\n\\t select: function select(v) {\\n\\t if (this.val instanceof Array) {\\n\\t var newVal = this.val.slice(0);\\n\\t if (~newVal.indexOf(v)) {\\n\\t newVal.splice(newVal.indexOf(v), 1);\\n\\t } else {\\n\\t newVal.push(v);\\n\\t }\\n\\t this.val = newVal;\\n\\t if (this.closeOnSelect) {\\n\\t this.toggle();\\n\\t }\\n\\t } else {\\n\\t this.val = v;\\n\\t this.toggle();\\n\\t }\\n\\t },\\n\\t setOptions: function setOptions(options) {\\n\\t var _this5 = this;\\n\\t\\n\\t this.list = options.map(function (el) {\\n\\t if (el instanceof Object) {\\n\\t return el;\\n\\t }\\n\\t var obj = {};\\n\\t obj[_this5.optionsLabel] = el;\\n\\t obj[_this5.optionsValue] = el;\\n\\t return obj;\\n\\t });\\n\\t this.$emit('options', this.list);\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled && !this.show) return;\\n\\t this.show = !this.show;\\n\\t if (!this.show) this.$refs.btn.focus();\\n\\t },\\n\\t urlChanged: function urlChanged() {\\n\\t var _this6 = this;\\n\\t\\n\\t if (!this.url || !this.$http) {\\n\\t return;\\n\\t }\\n\\t this.loading = true;\\n\\t this.$http.get(this.url).then(function (response) {\\n\\t var data = response.data instanceof Array ? response.data : [];\\n\\t try {\\n\\t data = JSON.parse(data);\\n\\t } catch (e) {}\\n\\t _this6.setOptions(data);\\n\\t _this6.loading = false;\\n\\t _this6.checkData();\\n\\t }, function (response) {\\n\\t _this6.loading = false;\\n\\t });\\n\\t },\\n\\t validate: function validate() {\\n\\t return !this.required ? true : this.val instanceof Array ? this.val.length > 0 : this.val !== null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this.setOptions(this.options);\\n\\t this.val = this.value;\\n\\t this._select = true;\\n\\t if (this.val === undefined || !this.parent) {\\n\\t this.val = null;\\n\\t }\\n\\t if (!this.multiple && this.val instanceof Array) {\\n\\t this.val = this.val[0];\\n\\t }\\n\\t this.checkData();\\n\\t if (this.url) this.urlChanged();\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this._parent) this._parent.children.push(this);\\n\\t this.setOptions(this.options);\\n\\t this.val = this.value;\\n\\t this.checkData();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 157 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"click-outside\\\",\\n\\t rawName: \\\"v-click-outside\\\",\\n\\t value: (_vm.close),\\n\\t expression: \\\"close\\\"\\n\\t }],\\n\\t ref: \\\"select\\\",\\n\\t class: _vm.classes\\n\\t }, [_vm._c('div', {\\n\\t ref: \\\"btn\\\",\\n\\t staticClass: \\\"form-control dropdown-toggle\\\",\\n\\t attrs: {\\n\\t \\\"tabindex\\\": \\\"1\\\",\\n\\t \\\"disabled\\\": _vm.disabled || !_vm.hasParent,\\n\\t \\\"readonly\\\": _vm.readonly\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": function($event) {\\n\\t _vm.canSearch ? null : _vm.close()\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.toggle()\\n\\t },\\n\\t \\\"keydown\\\": [function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.close($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"space\\\", 32)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }]\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"btn-content\\\",\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.loading ? _vm.text.loading : _vm.showPlaceholder || (_vm.multiple && _vm.showCount ? _vm.selectedText : _vm.selected))\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.values.length) ? _vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.clear()\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")]) : _vm._e()]), _vm._v(\\\" \\\"), _vm._c('select', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"sel\\\",\\n\\t staticClass: \\\"secret\\\",\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"multiple\\\": _vm.multiple,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"change\\\": function($event) {\\n\\t _vm.val = Array.prototype.filter.call($event.target.options, function(o) {\\n\\t return o.selected\\n\\t }).map(function(o) {\\n\\t var val = \\\"_value\\\" in o ? o._value : o.value;\\n\\t return val\\n\\t })[0]\\n\\t }\\n\\t }\\n\\t }, [(_vm.required) ? _vm._c('option', {\\n\\t attrs: {\\n\\t \\\"value\\\": \\\"\\\"\\n\\t }\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._l((_vm.list), function(option) {\\n\\t return _vm._c('option', {\\n\\t domProps: {\\n\\t \\\"value\\\": option[_vm.optionsValue]\\n\\t }\\n\\t }, [_vm._v(_vm._s(option[_vm.optionsLabel]))])\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._c('ul', {\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, [(_vm.list.length) ? [(_vm.canSearch) ? _vm._c('li', {\\n\\t staticClass: \\\"bs-searchbox\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.searchValue),\\n\\t expression: \\\"searchValue\\\"\\n\\t }],\\n\\t ref: \\\"search\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"placeholder\\\": _vm.searchText || _vm.text.search,\\n\\t \\\"autocomplete\\\": \\\"off\\\"\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.searchValue)\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.close($event)\\n\\t },\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.searchValue = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.searchValue),\\n\\t expression: \\\"searchValue\\\"\\n\\t }],\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.clearSearch\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.required && !_vm.clearButton) ? _vm._c('li', [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.clear() && _vm.close()\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.placeholder || _vm.text.notSelected))])]) : _vm._e(), _vm._v(\\\" \\\"), _vm._l((_vm.filteredOptions), function(option) {\\n\\t return _vm._c('li', {\\n\\t attrs: {\\n\\t \\\"id\\\": option[_vm.optionsValue]\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(option[_vm.optionsValue])\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(option[_vm.optionsLabel])\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.isSelected(option[_vm.optionsValue])),\\n\\t expression: \\\"isSelected(option[optionsValue])\\\"\\n\\t }],\\n\\t staticClass: \\\"glyphicon glyphicon-ok check-mark\\\"\\n\\t })])])\\n\\t })] : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), (_vm.notify && !_vm.closeOnSelect) ? _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"fadein\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"notify in\\\"\\n\\t }, [_vm._v(_vm._s(_vm.limitText))])]) : _vm._e()], 2), _vm._v(\\\" \\\"), (_vm.notify && _vm.closeOnSelect) ? _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"fadein\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"notify out\\\"\\n\\t }, [_vm._c('div', [_vm._v(_vm._s(_vm.limitText))])])]) : _vm._e()], 1)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-e514dbc6\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 158 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(159)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(160)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Slider.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-32185b82\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-32185b82\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Slider.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 159 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t computed: {\\n\\t index: function index() {\\n\\t return this.$parent.$children.indexOf(this);\\n\\t },\\n\\t show: function show() {\\n\\t return this.$parent.index === this.index;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this.$parent.indicator_list) {\\n\\t this.$parent.indicator_list.push(this.index);\\n\\t }\\n\\t\\n\\t if (this.index === 0) {\\n\\t this.$el.classList.add('active');\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 160 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"item\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-32185b82\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 161 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(162)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(164)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(165)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Spinner.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-8b298e70\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-8b298e70\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Spinner.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 162 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 164 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar MIN_WAIT = 500; // in ms\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t fixed: { type: Boolean, default: false },\\n\\t global: { type: Boolean, default: false },\\n\\t size: { type: String, default: 'md' },\\n\\t text: { type: String, default: '' },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t active: this.value,\\n\\t locked: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t spinnerSize: function spinnerSize() {\\n\\t return 'spinner-' + (this.size ? this.size : 'sm');\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t active: function active(val, old) {\\n\\t if (val !== old) this.$emit('input', val);\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this[val ? 'show' : 'hide']();\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t hide: function hide() {\\n\\t var delay = 0;\\n\\t this.active = false;\\n\\t },\\n\\t show: function show(options) {\\n\\t if (options) {\\n\\t if (options.text) {\\n\\t this.text = options.text;\\n\\t }\\n\\t if (options.size) {\\n\\t this.size = options.size;\\n\\t }\\n\\t if (options.fixed) {\\n\\t this.fixed = options.fixed;\\n\\t }\\n\\t }\\n\\t // block scrolling when spinner is on\\n\\t this._body.style.overflowY = 'hidden';\\n\\t // activate spinner\\n\\t this._started = new Date();\\n\\t this.active = true;\\n\\t this.locked = true;\\n\\t this._unlock();\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._body = document.body;\\n\\t this._bodyOverflow = document.body.style.overflowY;\\n\\t this._unlock = (0, _utils.delayer)(function () {\\n\\t this.locked = false;\\n\\t this._body.style.overflowY = this._bodyOverflow;\\n\\t }, MIN_WAIT);\\n\\t if (this.global) {\\n\\t if (!this.$root._globalSpinner) {\\n\\t this.$root._globalSpinner = true;\\n\\t var self = this;\\n\\t this._global = {\\n\\t hide: function hide() {\\n\\t self.hide();\\n\\t },\\n\\t show: function show() {\\n\\t self.show();\\n\\t }\\n\\t };\\n\\t this.$root.$on('spinner::show', this._global.show);\\n\\t this.$root.$on('spinner::hide', this._global.hide);\\n\\t }\\n\\t }\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._global) {\\n\\t this.$root.$off('spinner::show', this._global.show);\\n\\t this.$root.$off('spinner::hide', this._global.hide);\\n\\t delete this.$root._globalSpinner;\\n\\t }\\n\\t clearTimeout(this._spinnerAnimation);\\n\\t this._body.style.overflowY = this._bodyOverflow;\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 165 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.active || _vm.locked),\\n\\t expression: \\\"active||locked\\\"\\n\\t }],\\n\\t class: ['spinner spinner-gritcode', _vm.spinnerSize, {\\n\\t 'spinner-fixed': _vm.fixed\\n\\t }]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"spinner-wrapper\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"spinner-circle\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"spinner-text\\\"\\n\\t }, [_vm._v(_vm._s(_vm.text))])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-8b298e70\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 166 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(167)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(168)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tab.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-0985e878\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-0985e878\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tab.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 167 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t header: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t fadein: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t var _this = this;\\n\\t\\n\\t var active = !this._tabs || this._tabs.show === this;\\n\\t this.fadein = false;\\n\\t if (active) {\\n\\t setTimeout(function () {\\n\\t _this.fadein = true;\\n\\t }, 0);\\n\\t }\\n\\t return active;\\n\\t },\\n\\t index: function index() {\\n\\t return this._tabs.tabs.indexOf(this);\\n\\t },\\n\\t transition: function transition() {\\n\\t return this._tabs ? this._tabs.effect : null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTab = true;\\n\\t var tabs = this;\\n\\t while (!this._tabs && tabs.$parent) {\\n\\t if (tabs._isTabGroup) {\\n\\t tabs.tabs.push(this);\\n\\t this._tabGroup = tabs;\\n\\t }\\n\\t if (tabs._isTabs) {\\n\\t tabs.tabs.push(this);\\n\\t this._tabs = tabs;\\n\\t if (!this._tabGroup) tabs.headers.push(this);\\n\\t }\\n\\t tabs = tabs.$parent;\\n\\t }\\n\\t if (!this._tabs) throw Error('tab depend on tabs.');\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this._tabGroup) {\\n\\t this._tabGroup.tabs = this._tabGroup.tabs.filter(function (el) {\\n\\t return el !== _this2;\\n\\t });\\n\\t }\\n\\t if (this._tabs) {\\n\\t this._tabs.tabs = this._tabs.tabs.filter(function (el) {\\n\\t return el !== _this2;\\n\\t });\\n\\t }\\n\\t if (this._tabs) {\\n\\t if (this._tabs.active === this.index) {\\n\\t this._tabs.index = 0;\\n\\t }\\n\\t if (this._ingroup) {\\n\\t var id = this.$parent.tabs.indexOf(this);\\n\\t if (~id) this.$parent.tabs.splice(id, 1);\\n\\t }\\n\\t }\\n\\t if (this._tabs) {\\n\\t var _id = this._tabs.tabs.indexOf(this);\\n\\t if (~_id) this._tabs.tabs.splice(_id, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 168 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t ref: \\\"panel\\\",\\n\\t class: ['tab-pane', {\\n\\t 'active fade': _vm.active,\\n\\t 'in': _vm.fadein\\n\\t }],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"tabpanel\\\"\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-0985e878\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 169 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(170)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(172)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(173)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\TabGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-55faf3cb\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-55faf3cb\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] TabGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 170 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 172 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t header: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t show: false,\\n\\t tabs: []\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t return ~this.tabs.indexOf(this._tabs.show);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t blur: function blur() {\\n\\t this.show = false;\\n\\t },\\n\\t toggle: function toggle() {\\n\\t this.show = !this.show;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTabGroup = true;\\n\\t if (this.$parent) {\\n\\t if (this.$parent._isTabGroup) throw Error('Can\\\\'t nest tab-groups.');\\n\\t if (!this.$parent._isTabs) throw Error('tab-group depend on tabs.');\\n\\t }\\n\\t this._tabs = this.$parent;\\n\\t this._tabs.headers.push(this);\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 173 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-55faf3cb\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 174 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(175)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(177)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(178)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tabs.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-70100ddf\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-70100ddf\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tabs.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 175 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 177 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _Dropdown = __webpack_require__(105);\\n\\t\\n\\tvar _Dropdown2 = _interopRequireDefault(_Dropdown);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t components: {\\n\\t dropdown: _Dropdown2.default\\n\\t },\\n\\t props: {\\n\\t // effect: {type: String, default: 'fadein'},\\n\\t justified: false,\\n\\t navStyle: { type: String, default: null },\\n\\t value: { type: Number, default: 0 }\\n\\t },\\n\\t data: function data() {\\n\\t var index = this.value || 0;\\n\\t return {\\n\\t index: index,\\n\\t headers: [],\\n\\t tabs: []\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t index: function index(val) {\\n\\t this.$emit('active', val);\\n\\t this.$emit('input', val);\\n\\t },\\n\\t value: function value(val) {\\n\\t this.index = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t navStyleClass: function navStyleClass() {\\n\\t return ['nav', ~['pills', 'stacked'].indexOf(this.navStyle) ? 'nav-' + this.navStyle : 'nav-tabs', {\\n\\t 'nav-justified': _utils.coerce.boolean(this.justified),\\n\\t 'nav-pills': this.navStyle === 'stacked'\\n\\t }];\\n\\t },\\n\\t show: function show() {\\n\\t return this.tabs[this.index] || this.tabs[0];\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t select: function select(tab) {\\n\\t if (!tab.disabled) {\\n\\t this.index = this.tabs.indexOf(tab);\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTabs = true;\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 178 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t attrs: {\\n\\t \\\"tabs\\\": \\\"\\\"\\n\\t }\\n\\t }, [_vm._c('ul', {\\n\\t class: _vm.navStyleClass,\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"tablist\\\"\\n\\t }\\n\\t }, [_vm._l((_vm.headers), function(header) {\\n\\t return [(header._isTab) ? _vm._c('li', {\\n\\t class: {\\n\\t active: header.active, disabled: header.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(header)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"header\\\", [_vm._c('a', {\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"#\\\"\\n\\t },\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(header.header)\\n\\t }\\n\\t })])], 2) : _vm._e(), _vm._v(\\\" \\\"), (header._isTabGroup) ? _vm._c('dropdown', {\\n\\t class: {\\n\\t active: header.active\\n\\t },\\n\\t attrs: {\\n\\t \\\"text\\\": header.header,\\n\\t \\\"disabled\\\": header.disabled\\n\\t }\\n\\t }, _vm._l((header.tabs), function(tab) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t disabled: tab.disabled\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"#\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(tab)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(tab.header))])])\\n\\t })) : _vm._e()]\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"tab-content\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-70100ddf\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 179 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(180)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(181)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\ToggleButton.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-f034a5f2\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-f034a5f2\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] ToggleButton.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 180 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { default: null },\\n\\t falseType: { default: null },\\n\\t name: null,\\n\\t readonly: { default: null },\\n\\t trueType: { default: 'primary' },\\n\\t value: false\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t active: _utils.coerce.boolean(this.value),\\n\\t types: {\\n\\t danger: 'btn-danger',\\n\\t info: 'btn-info',\\n\\t primary: 'btn-primary',\\n\\t success: 'btn-success',\\n\\t warning: 'btn-warning'\\n\\t }\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t active: function active(val, old) {\\n\\t if (val !== old) {\\n\\t this.$emit('changed', val);\\n\\t this.$emit(val ? 'enabled' : 'disabled');\\n\\t this.$emit('input', val);\\n\\t }\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this.active = _utils.coerce.boolean(this.value);\\n\\t }\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t boolDisabled: function boolDisabled() {\\n\\t return _utils.coerce.boolean(this.disabled);\\n\\t },\\n\\t boolReadonly: function boolReadonly() {\\n\\t return _utils.coerce.boolean(this.readonly);\\n\\t },\\n\\t type: function type() {\\n\\t return this.types[this.value ? this.trueType : this.falseType] || 'btn-default';\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggle: function toggle() {\\n\\t if (this.boolDisabled || this.boolReadonly) {\\n\\t return;\\n\\t }\\n\\t this.active = !this.active;\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 181 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('a', {\\n\\t class: ['btn', _vm.type, {\\n\\t readonly: _vm.boolReadonly\\n\\t }],\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"javascript:void(0)\\\",\\n\\t \\\"disabled\\\": _vm.boolDisabled\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggle\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t class: ['glyphicon', 'glyphicon-' + (_vm.value ? 'ok' : 'remove')]\\n\\t }), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), (_vm.name) ? _vm._c('input', {\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"hidden\\\",\\n\\t \\\"name\\\": _vm.name\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.active ? 1 : 0\\n\\t }\\n\\t }) : _vm._e()], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-f034a5f2\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 182 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(183)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(185)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(186)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tooltip.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-48fb51b2\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-48fb51b2\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tooltip.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 183 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 185 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _popoverMixins = __webpack_require__(143);\\n\\t\\n\\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t mixins: [_popoverMixins2.default],\\n\\t props: {\\n\\t effect: { type: String, default: 'scale' },\\n\\t trigger: { type: String, default: 'hover' }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 186 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', {\\n\\t ref: \\\"trigger\\\"\\n\\t }, [_vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.effect\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t ref: \\\"popover\\\",\\n\\t class: ['tooltip', _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"tooltip-arrow\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"tooltip-inner\\\"\\n\\t }, [_vm._t(\\\"content\\\", [_vm._c('div', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.content)\\n\\t }\\n\\t })])], 2)]) : _vm._e()])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-48fb51b2\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 187 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(188)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(190)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(206)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Typeahead.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-5b5f5e94\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-5b5f5e94\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Typeahead.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 188 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 190 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _typeof2 = __webpack_require__(191);\\n\\t\\n\\tvar _typeof3 = _interopRequireDefault(_typeof2);\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\tvar DELAY = 300; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t async: { type: String },\\n\\t data: { type: Array },\\n\\t delay: { type: Number, default: DELAY },\\n\\t asyncKey: { type: String, default: null },\\n\\t limit: { type: Number, default: 8 },\\n\\t matchCase: { type: Boolean, default: false },\\n\\t matchStart: { type: Boolean, default: false },\\n\\t onHit: {\\n\\t type: Function,\\n\\t default: function _default(item) {\\n\\t return item;\\n\\t }\\n\\t },\\n\\t placeholder: { type: String },\\n\\t template: { type: String },\\n\\t type: { type: String, default: 'text' },\\n\\t value: { type: String, default: '' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t asign: '',\\n\\t showDropdown: false,\\n\\t noResults: true,\\n\\t current: 0,\\n\\t items: [],\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t templateComp: function templateComp() {\\n\\t return {\\n\\t template: typeof this.template === 'string' ? '' + this.template + '' : '',\\n\\t props: { item: { default: null } }\\n\\t };\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t if (_val !== old && _val !== this.asign) this.__update();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t setItems: function setItems(data) {\\n\\t var _this = this;\\n\\t\\n\\t if (this.async) {\\n\\t this.items = this.asyncKey ? data[this.asyncKey] : data;\\n\\t this.items = this.items.slice(0, this.limit);\\n\\t } else {\\n\\t this.items = (data || []).filter(function (value) {\\n\\t if ((typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) === 'object') {\\n\\t return true;\\n\\t }\\n\\t value = _this.matchCase ? value : value.toLowerCase();\\n\\t var query = _this.matchCase ? _this.val : _this.val.toLowerCase();\\n\\t return _this.matchStart ? value.indexOf(query) === 0 : value.indexOf(query) !== -1;\\n\\t }).slice(0, this.limit);\\n\\t }\\n\\t this.showDropdown = this.items.length > 0;\\n\\t },\\n\\t setValue: function setValue(value) {\\n\\t this.asign = value;\\n\\t this.val = value;\\n\\t this.items = [];\\n\\t this.loading = false;\\n\\t this.showDropdown = false;\\n\\t },\\n\\t reset: function reset() {\\n\\t this.setValue(null);\\n\\t },\\n\\t setActive: function setActive(index) {\\n\\t this.current = index;\\n\\t },\\n\\t isActive: function isActive(index) {\\n\\t return this.current === index;\\n\\t },\\n\\t hit: function hit(e) {\\n\\t e.preventDefault();\\n\\t this.setValue(this.onHit(this.items[this.current], this));\\n\\t },\\n\\t up: function up() {\\n\\t if (this.current > 0) {\\n\\t this.current--;\\n\\t } else {\\n\\t this.current = this.items.length - 1;\\n\\t }\\n\\t },\\n\\t down: function down() {\\n\\t if (this.current < this.items.length - 1) {\\n\\t this.current++;\\n\\t } else {\\n\\t this.current = 0;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this.__update = (0, _utils.delayer)(function () {\\n\\t var _this2 = this;\\n\\t\\n\\t if (!this.val) {\\n\\t this.reset();\\n\\t return;\\n\\t }\\n\\t this.asign = '';\\n\\t if (this.async) {\\n\\t (0, _utils.getJSON)(this.async + this.val).then(function (data) {\\n\\t _this2.setItems(data);\\n\\t });\\n\\t } else if (this.data) {\\n\\t this.setItems(this.data);\\n\\t }\\n\\t }, 'delay', DELAY);\\n\\t this.__update();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 191 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t\\\"use strict\\\";\\n\\t\\n\\texports.__esModule = true;\\n\\t\\n\\tvar _iterator = __webpack_require__(20);\\n\\t\\n\\tvar _iterator2 = _interopRequireDefault(_iterator);\\n\\t\\n\\tvar _symbol = __webpack_require__(192);\\n\\t\\n\\tvar _symbol2 = _interopRequireDefault(_symbol);\\n\\t\\n\\tvar _typeof = typeof _symbol2.default === \\\"function\\\" && typeof _iterator2.default === \\\"symbol\\\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \\\"function\\\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \\\"symbol\\\" : typeof obj; };\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = typeof _symbol2.default === \\\"function\\\" && _typeof(_iterator2.default) === \\\"symbol\\\" ? function (obj) {\\n\\t return typeof obj === \\\"undefined\\\" ? \\\"undefined\\\" : _typeof(obj);\\n\\t} : function (obj) {\\n\\t return obj && typeof _symbol2.default === \\\"function\\\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \\\"symbol\\\" : typeof obj === \\\"undefined\\\" ? \\\"undefined\\\" : _typeof(obj);\\n\\t};\\n\\n/***/ },\\n/* 192 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports = { \\\"default\\\": __webpack_require__(193), __esModule: true };\\n\\n/***/ },\\n/* 193 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(194);\\n\\t__webpack_require__(203);\\n\\t__webpack_require__(204);\\n\\t__webpack_require__(205);\\n\\tmodule.exports = __webpack_require__(7).Symbol;\\n\\n/***/ },\\n/* 194 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t// ECMAScript 6 symbols shim\\n\\tvar global = __webpack_require__(6)\\n\\t , has = __webpack_require__(29)\\n\\t , DESCRIPTORS = __webpack_require__(15)\\n\\t , $export = __webpack_require__(5)\\n\\t , redefine = __webpack_require__(28)\\n\\t , META = __webpack_require__(195).KEY\\n\\t , $fails = __webpack_require__(16)\\n\\t , shared = __webpack_require__(43)\\n\\t , setToStringTag = __webpack_require__(47)\\n\\t , uid = __webpack_require__(44)\\n\\t , wks = __webpack_require__(48)\\n\\t , wksExt = __webpack_require__(55)\\n\\t , wksDefine = __webpack_require__(196)\\n\\t , keyOf = __webpack_require__(197)\\n\\t , enumKeys = __webpack_require__(198)\\n\\t , isArray = __webpack_require__(201)\\n\\t , anObject = __webpack_require__(12)\\n\\t , toIObject = __webpack_require__(36)\\n\\t , toPrimitive = __webpack_require__(18)\\n\\t , createDesc = __webpack_require__(19)\\n\\t , _create = __webpack_require__(32)\\n\\t , gOPNExt = __webpack_require__(60)\\n\\t , $GOPD = __webpack_require__(202)\\n\\t , $DP = __webpack_require__(11)\\n\\t , $keys = __webpack_require__(34)\\n\\t , gOPD = $GOPD.f\\n\\t , dP = $DP.f\\n\\t , gOPN = gOPNExt.f\\n\\t , $Symbol = global.Symbol\\n\\t , $JSON = global.JSON\\n\\t , _stringify = $JSON && $JSON.stringify\\n\\t , PROTOTYPE = 'prototype'\\n\\t , HIDDEN = wks('_hidden')\\n\\t , TO_PRIMITIVE = wks('toPrimitive')\\n\\t , isEnum = {}.propertyIsEnumerable\\n\\t , SymbolRegistry = shared('symbol-registry')\\n\\t , AllSymbols = shared('symbols')\\n\\t , OPSymbols = shared('op-symbols')\\n\\t , ObjectProto = Object[PROTOTYPE]\\n\\t , USE_NATIVE = typeof $Symbol == 'function'\\n\\t , QObject = global.QObject;\\n\\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\\n\\tvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\\n\\t\\n\\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\\n\\tvar setSymbolDesc = DESCRIPTORS && $fails(function(){\\n\\t return _create(dP({}, 'a', {\\n\\t get: function(){ return dP(this, 'a', {value: 7}).a; }\\n\\t })).a != 7;\\n\\t}) ? function(it, key, D){\\n\\t var protoDesc = gOPD(ObjectProto, key);\\n\\t if(protoDesc)delete ObjectProto[key];\\n\\t dP(it, key, D);\\n\\t if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\\n\\t} : dP;\\n\\t\\n\\tvar wrap = function(tag){\\n\\t var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\\n\\t sym._k = tag;\\n\\t return sym;\\n\\t};\\n\\t\\n\\tvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\\n\\t return typeof it == 'symbol';\\n\\t} : function(it){\\n\\t return it instanceof $Symbol;\\n\\t};\\n\\t\\n\\tvar $defineProperty = function defineProperty(it, key, D){\\n\\t if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\\n\\t anObject(it);\\n\\t key = toPrimitive(key, true);\\n\\t anObject(D);\\n\\t if(has(AllSymbols, key)){\\n\\t if(!D.enumerable){\\n\\t if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\\n\\t it[HIDDEN][key] = true;\\n\\t } else {\\n\\t if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\\n\\t D = _create(D, {enumerable: createDesc(0, false)});\\n\\t } return setSymbolDesc(it, key, D);\\n\\t } return dP(it, key, D);\\n\\t};\\n\\tvar $defineProperties = function defineProperties(it, P){\\n\\t anObject(it);\\n\\t var keys = enumKeys(P = toIObject(P))\\n\\t , i = 0\\n\\t , l = keys.length\\n\\t , key;\\n\\t while(l > i)$defineProperty(it, key = keys[i++], P[key]);\\n\\t return it;\\n\\t};\\n\\tvar $create = function create(it, P){\\n\\t return P === undefined ? _create(it) : $defineProperties(_create(it), P);\\n\\t};\\n\\tvar $propertyIsEnumerable = function propertyIsEnumerable(key){\\n\\t var E = isEnum.call(this, key = toPrimitive(key, true));\\n\\t if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\\n\\t return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\\n\\t};\\n\\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\\n\\t it = toIObject(it);\\n\\t key = toPrimitive(key, true);\\n\\t if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\\n\\t var D = gOPD(it, key);\\n\\t if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\\n\\t return D;\\n\\t};\\n\\tvar $getOwnPropertyNames = function getOwnPropertyNames(it){\\n\\t var names = gOPN(toIObject(it))\\n\\t , result = []\\n\\t , i = 0\\n\\t , key;\\n\\t while(names.length > i){\\n\\t if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\\n\\t } return result;\\n\\t};\\n\\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\\n\\t var IS_OP = it === ObjectProto\\n\\t , names = gOPN(IS_OP ? OPSymbols : toIObject(it))\\n\\t , result = []\\n\\t , i = 0\\n\\t , key;\\n\\t while(names.length > i){\\n\\t if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\\n\\t } return result;\\n\\t};\\n\\t\\n\\t// 19.4.1.1 Symbol([description])\\n\\tif(!USE_NATIVE){\\n\\t $Symbol = function Symbol(){\\n\\t if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\\n\\t var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\\n\\t var $set = function(value){\\n\\t if(this === ObjectProto)$set.call(OPSymbols, value);\\n\\t if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\\n\\t setSymbolDesc(this, tag, createDesc(1, value));\\n\\t };\\n\\t if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\\n\\t return wrap(tag);\\n\\t };\\n\\t redefine($Symbol[PROTOTYPE], 'toString', function toString(){\\n\\t return this._k;\\n\\t });\\n\\t\\n\\t $GOPD.f = $getOwnPropertyDescriptor;\\n\\t $DP.f = $defineProperty;\\n\\t __webpack_require__(61).f = gOPNExt.f = $getOwnPropertyNames;\\n\\t __webpack_require__(200).f = $propertyIsEnumerable;\\n\\t __webpack_require__(199).f = $getOwnPropertySymbols;\\n\\t\\n\\t if(DESCRIPTORS && !__webpack_require__(27)){\\n\\t redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\\n\\t }\\n\\t\\n\\t wksExt.f = function(name){\\n\\t return wrap(wks(name));\\n\\t }\\n\\t}\\n\\t\\n\\t$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\\n\\t\\n\\tfor(var symbols = (\\n\\t // 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\\t 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\\n\\t).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\\n\\t\\n\\tfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\\n\\t\\n\\t$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\\n\\t // 19.4.2.1 Symbol.for(key)\\n\\t 'for': function(key){\\n\\t return has(SymbolRegistry, key += '')\\n\\t ? SymbolRegistry[key]\\n\\t : SymbolRegistry[key] = $Symbol(key);\\n\\t },\\n\\t // 19.4.2.5 Symbol.keyFor(sym)\\n\\t keyFor: function keyFor(key){\\n\\t if(isSymbol(key))return keyOf(SymbolRegistry, key);\\n\\t throw TypeError(key + ' is not a symbol!');\\n\\t },\\n\\t useSetter: function(){ setter = true; },\\n\\t useSimple: function(){ setter = false; }\\n\\t});\\n\\t\\n\\t$export($export.S + $export.F * !USE_NATIVE, 'Object', {\\n\\t // 19.1.2.2 Object.create(O [, Properties])\\n\\t create: $create,\\n\\t // 19.1.2.4 Object.defineProperty(O, P, Attributes)\\n\\t defineProperty: $defineProperty,\\n\\t // 19.1.2.3 Object.defineProperties(O, Properties)\\n\\t defineProperties: $defineProperties,\\n\\t // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\\n\\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\\n\\t // 19.1.2.7 Object.getOwnPropertyNames(O)\\n\\t getOwnPropertyNames: $getOwnPropertyNames,\\n\\t // 19.1.2.8 Object.getOwnPropertySymbols(O)\\n\\t getOwnPropertySymbols: $getOwnPropertySymbols\\n\\t});\\n\\t\\n\\t// 24.3.2 JSON.stringify(value [, replacer [, space]])\\n\\t$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\\n\\t var S = $Symbol();\\n\\t // MS Edge converts symbol values to JSON as {}\\n\\t // WebKit converts symbol values to JSON as null\\n\\t // V8 throws on boxed symbols\\n\\t return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\\n\\t})), 'JSON', {\\n\\t stringify: function stringify(it){\\n\\t if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\\n\\t var args = [it]\\n\\t , i = 1\\n\\t , replacer, $replacer;\\n\\t while(arguments.length > i)args.push(arguments[i++]);\\n\\t replacer = args[1];\\n\\t if(typeof replacer == 'function')$replacer = replacer;\\n\\t if($replacer || !isArray(replacer))replacer = function(key, value){\\n\\t if($replacer)value = $replacer.call(this, key, value);\\n\\t if(!isSymbol(value))return value;\\n\\t };\\n\\t args[1] = replacer;\\n\\t return _stringify.apply($JSON, args);\\n\\t }\\n\\t});\\n\\t\\n\\t// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\\n\\t$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\\n\\t// 19.4.3.5 Symbol.prototype[@@toStringTag]\\n\\tsetToStringTag($Symbol, 'Symbol');\\n\\t// 20.2.1.9 Math[@@toStringTag]\\n\\tsetToStringTag(Math, 'Math', true);\\n\\t// 24.3.3 JSON[@@toStringTag]\\n\\tsetToStringTag(global.JSON, 'JSON', true);\\n\\n/***/ },\\n/* 195 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar META = __webpack_require__(44)('meta')\\n\\t , isObject = __webpack_require__(13)\\n\\t , has = __webpack_require__(29)\\n\\t , setDesc = __webpack_require__(11).f\\n\\t , id = 0;\\n\\tvar isExtensible = Object.isExtensible || function(){\\n\\t return true;\\n\\t};\\n\\tvar FREEZE = !__webpack_require__(16)(function(){\\n\\t return isExtensible(Object.preventExtensions({}));\\n\\t});\\n\\tvar setMeta = function(it){\\n\\t setDesc(it, META, {value: {\\n\\t i: 'O' + ++id, // object ID\\n\\t w: {} // weak collections IDs\\n\\t }});\\n\\t};\\n\\tvar fastKey = function(it, create){\\n\\t // return primitive with prefix\\n\\t if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\\n\\t if(!has(it, META)){\\n\\t // can't set metadata to uncaught frozen object\\n\\t if(!isExtensible(it))return 'F';\\n\\t // not necessary to add metadata\\n\\t if(!create)return 'E';\\n\\t // add missing metadata\\n\\t setMeta(it);\\n\\t // return object ID\\n\\t } return it[META].i;\\n\\t};\\n\\tvar getWeak = function(it, create){\\n\\t if(!has(it, META)){\\n\\t // can't set metadata to uncaught frozen object\\n\\t if(!isExtensible(it))return true;\\n\\t // not necessary to add metadata\\n\\t if(!create)return false;\\n\\t // add missing metadata\\n\\t setMeta(it);\\n\\t // return hash weak collections IDs\\n\\t } return it[META].w;\\n\\t};\\n\\t// add metadata on freeze-family methods calling\\n\\tvar onFreeze = function(it){\\n\\t if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);\\n\\t return it;\\n\\t};\\n\\tvar meta = module.exports = {\\n\\t KEY: META,\\n\\t NEED: false,\\n\\t fastKey: fastKey,\\n\\t getWeak: getWeak,\\n\\t onFreeze: onFreeze\\n\\t};\\n\\n/***/ },\\n/* 196 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar global = __webpack_require__(6)\\n\\t , core = __webpack_require__(7)\\n\\t , LIBRARY = __webpack_require__(27)\\n\\t , wksExt = __webpack_require__(55)\\n\\t , defineProperty = __webpack_require__(11).f;\\n\\tmodule.exports = function(name){\\n\\t var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\\n\\t if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\\n\\t};\\n\\n/***/ },\\n/* 197 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar getKeys = __webpack_require__(34)\\n\\t , toIObject = __webpack_require__(36);\\n\\tmodule.exports = function(object, el){\\n\\t var O = toIObject(object)\\n\\t , keys = getKeys(O)\\n\\t , length = keys.length\\n\\t , index = 0\\n\\t , key;\\n\\t while(length > index)if(O[key = keys[index++]] === el)return key;\\n\\t};\\n\\n/***/ },\\n/* 198 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// all enumerable object keys, includes symbols\\n\\tvar getKeys = __webpack_require__(34)\\n\\t , gOPS = __webpack_require__(199)\\n\\t , pIE = __webpack_require__(200);\\n\\tmodule.exports = function(it){\\n\\t var result = getKeys(it)\\n\\t , getSymbols = gOPS.f;\\n\\t if(getSymbols){\\n\\t var symbols = getSymbols(it)\\n\\t , isEnum = pIE.f\\n\\t , i = 0\\n\\t , key;\\n\\t while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\\n\\t } return result;\\n\\t};\\n\\n/***/ },\\n/* 199 */\\n/***/ function(module, exports) {\\n\\n\\texports.f = Object.getOwnPropertySymbols;\\n\\n/***/ },\\n/* 200 */\\n/***/ function(module, exports) {\\n\\n\\texports.f = {}.propertyIsEnumerable;\\n\\n/***/ },\\n/* 201 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 7.2.2 IsArray(argument)\\n\\tvar cof = __webpack_require__(38);\\n\\tmodule.exports = Array.isArray || function isArray(arg){\\n\\t return cof(arg) == 'Array';\\n\\t};\\n\\n/***/ },\\n/* 202 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar pIE = __webpack_require__(200)\\n\\t , createDesc = __webpack_require__(19)\\n\\t , toIObject = __webpack_require__(36)\\n\\t , toPrimitive = __webpack_require__(18)\\n\\t , has = __webpack_require__(29)\\n\\t , IE8_DOM_DEFINE = __webpack_require__(14)\\n\\t , gOPD = Object.getOwnPropertyDescriptor;\\n\\t\\n\\texports.f = __webpack_require__(15) ? gOPD : function getOwnPropertyDescriptor(O, P){\\n\\t O = toIObject(O);\\n\\t P = toPrimitive(P, true);\\n\\t if(IE8_DOM_DEFINE)try {\\n\\t return gOPD(O, P);\\n\\t } catch(e){ /* empty */ }\\n\\t if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\\n\\t};\\n\\n/***/ },\\n/* 203 */\\n/***/ function(module, exports) {\\n\\n\\n\\n/***/ },\\n/* 204 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(196)('asyncIterator');\\n\\n/***/ },\\n/* 205 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(196)('observable');\\n\\n/***/ },\\n/* 206 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: {\\n\\t open: _vm.showDropdown\\n\\t },\\n\\t staticStyle: {\\n\\t \\\"position\\\": \\\"relative\\\"\\n\\t }\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"type\\\": _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": function($event) {\\n\\t _vm.showDropdown = false\\n\\t },\\n\\t \\\"keydown\\\": [function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"down\\\", 40)) { return; }\\n\\t $event.preventDefault();\\n\\t _vm.down($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.hit($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.reset($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"up\\\", 38)) { return; }\\n\\t $event.preventDefault();\\n\\t _vm.up($event)\\n\\t }],\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('ul', {\\n\\t ref: \\\"dropdown\\\",\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, _vm._l((_vm.items), function(item, i) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t active: _vm.isActive(i)\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.hit($event)\\n\\t },\\n\\t \\\"mousemove\\\": function($event) {\\n\\t _vm.setActive(i)\\n\\t }\\n\\t }\\n\\t }, [_vm._c(_vm.templateComp, {\\n\\t tag: \\\"component\\\",\\n\\t attrs: {\\n\\t \\\"item\\\": item\\n\\t }\\n\\t })], 1)])\\n\\t }))])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-5b5f5e94\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ }\\n/******/ ])\\n});\\n;\\n//# sourceMappingURL=vue-strap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3Z1ZS1zdHJhcC9kaXN0L3Z1ZS1zdHJhcC5qcz9lMTQ3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogdnVlLXN0cmFwIDIuMC4yXG4gKiBodHRwOi8vd2ZmcmFuY28uZ2l0aHViLmlvL3Z1ZS1zdHJhcC9cbiAqIENvbXBpbGVkIHVzaW5nIFZ1ZSAyLjEuMTBcbiAqL1xuKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiVnVlU3RyYXBcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiVnVlU3RyYXBcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdHZhciBfU2Nyb2xsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OCk7XG5cdFxuXHR2YXIgX1Njcm9sbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TY3JvbGwpO1xuXHRcblx0dmFyIF9BY2NvcmRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5KTtcblx0XG5cdHZhciBfQWNjb3JkaW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FjY29yZGlvbik7XG5cdFxuXHR2YXIgX0FmZml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Mik7XG5cdFxuXHR2YXIgX0FmZml4MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FmZml4KTtcblx0XG5cdHZhciBfQWxlcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1KTtcblx0XG5cdHZhciBfQWxlcnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQWxlcnQpO1xuXHRcblx0dmFyIF9Bc2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oODIpO1xuXHRcblx0dmFyIF9Bc2lkZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Bc2lkZSk7XG5cdFxuXHR2YXIgX0J1dHRvbkdyb3VwID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4Nyk7XG5cdFxuXHR2YXIgX0J1dHRvbkdyb3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0J1dHRvbkdyb3VwKTtcblx0XG5cdHZhciBfQ2Fyb3VzZWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwKTtcblx0XG5cdHZhciBfQ2Fyb3VzZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2Fyb3VzZWwpO1xuXHRcblx0dmFyIF9DaGVja2JveCA9IF9fd2VicGFja19yZXF1aXJlX18oOTUpO1xuXHRcblx0dmFyIF9DaGVja2JveDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DaGVja2JveCk7XG5cdFxuXHR2YXIgX0RhdGVwaWNrZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMCk7XG5cdFxuXHR2YXIgX0RhdGVwaWNrZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRGF0ZXBpY2tlcik7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDUpO1xuXHRcblx0dmFyIF9Ecm9wZG93bjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ecm9wZG93bik7XG5cdFxuXHR2YXIgX0Zvcm1Hcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTA4KTtcblx0XG5cdHZhciBfRm9ybUdyb3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1Hcm91cCk7XG5cdFxuXHR2YXIgX0Zvcm1WYWxpZGF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMSk7XG5cdFxuXHR2YXIgX0Zvcm1WYWxpZGF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRm9ybVZhbGlkYXRvcik7XG5cdFxuXHR2YXIgX0lucHV0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTQpO1xuXHRcblx0dmFyIF9JbnB1dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9JbnB1dCk7XG5cdFxuXHR2YXIgX01vZGFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTkpO1xuXHRcblx0dmFyIF9Nb2RhbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbCk7XG5cdFxuXHR2YXIgX05hdmJhciA9IF9fd2VicGFja19yZXF1aXJlX18oMTI4KTtcblx0XG5cdHZhciBfTmF2YmFyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdmJhcik7XG5cdFxuXHR2YXIgX09wdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTMxKTtcblx0XG5cdHZhciBfT3B0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX09wdGlvbik7XG5cdFxuXHR2YXIgX1BhbmVsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzQpO1xuXHRcblx0dmFyIF9QYW5lbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QYW5lbCk7XG5cdFxuXHR2YXIgX1BvcG92ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzOSk7XG5cdFxuXHR2YXIgX1BvcG92ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUG9wb3Zlcik7XG5cdFxuXHR2YXIgX1Byb2dyZXNzYmFyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDUpO1xuXHRcblx0dmFyIF9Qcm9ncmVzc2JhcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qcm9ncmVzc2Jhcik7XG5cdFxuXHR2YXIgX1JhZGlvID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDgpO1xuXHRcblx0dmFyIF9SYWRpbzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9SYWRpbyk7XG5cdFxuXHR2YXIgX1NlbGVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUzKTtcblx0XG5cdHZhciBfU2VsZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NlbGVjdCk7XG5cdFxuXHR2YXIgX1NsaWRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTU4KTtcblx0XG5cdHZhciBfU2xpZGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NsaWRlcik7XG5cdFxuXHR2YXIgX1NwaW5uZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2MSk7XG5cdFxuXHR2YXIgX1NwaW5uZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU3Bpbm5lcik7XG5cdFxuXHR2YXIgX1RhYiA9IF9fd2VicGFja19yZXF1aXJlX18oMTY2KTtcblx0XG5cdHZhciBfVGFiMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYik7XG5cdFxuXHR2YXIgX1RhYkdyb3VwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjkpO1xuXHRcblx0dmFyIF9UYWJHcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJHcm91cCk7XG5cdFxuXHR2YXIgX1RhYnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NCk7XG5cdFxuXHR2YXIgX1RhYnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFicyk7XG5cdFxuXHR2YXIgX1RvZ2dsZUJ1dHRvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTc5KTtcblx0XG5cdHZhciBfVG9nZ2xlQnV0dG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RvZ2dsZUJ1dHRvbik7XG5cdFxuXHR2YXIgX1Rvb2x0aXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4Mik7XG5cdFxuXHR2YXIgX1Rvb2x0aXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVG9vbHRpcCk7XG5cdFxuXHR2YXIgX1R5cGVhaGVhZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTg3KTtcblx0XG5cdHZhciBfVHlwZWFoZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1R5cGVhaGVhZCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly8gQ29tcG9uZW50c1xuXHRcblx0Ly8gRGlyZWN0aXZlc1xuXHQvLyBVdGlsc1xuXHR2YXIgVnVlU3RyYXAgPSB7XG5cdCAgZGlyZWN0aXZlczoge1xuXHQgICAgQ2xpY2tPdXRzaWRlOiBfQ2xpY2tPdXRzaWRlMi5kZWZhdWx0LFxuXHQgICAgU2Nyb2xsOiBfU2Nyb2xsMi5kZWZhdWx0XG5cdCAgfSxcblx0ICB1dGlsczoge1xuXHQgICAgJDogX05vZGVMaXN0Mi5kZWZhdWx0LFxuXHQgICAgY29lcmNlOiBfdXRpbHMuY29lcmNlXG5cdCAgfSxcblx0ICAvL2NvbXBvbmVudHNcblx0ICBhY2NvcmRpb246IF9BY2NvcmRpb24yLmRlZmF1bHQsXG5cdCAgYWZmaXg6IF9BZmZpeDIuZGVmYXVsdCxcblx0ICBhbGVydDogX0FsZXJ0Mi5kZWZhdWx0LFxuXHQgIGFzaWRlOiBfQXNpZGUyLmRlZmF1bHQsXG5cdCAgYnV0dG9uR3JvdXA6IF9CdXR0b25Hcm91cDIuZGVmYXVsdCxcblx0ICBjYXJvdXNlbDogX0Nhcm91c2VsMi5kZWZhdWx0LFxuXHQgIGNoZWNrYm94OiBfQ2hlY2tib3gyLmRlZmF1bHQsXG5cdCAgZGF0ZXBpY2tlcjogX0RhdGVwaWNrZXIyLmRlZmF1bHQsXG5cdCAgZHJvcGRvd246IF9Ecm9wZG93bjIuZGVmYXVsdCxcblx0ICBmb3JtR3JvdXA6IF9Gb3JtR3JvdXAyLmRlZmF1bHQsXG5cdCAgZm9ybVZhbGlkYXRvcjogX0Zvcm1WYWxpZGF0b3IyLmRlZmF1bHQsXG5cdCAgaW5wdXQ6IF9JbnB1dDIuZGVmYXVsdCxcblx0ICBtb2RhbDogX01vZGFsMi5kZWZhdWx0LFxuXHQgIG5hdmJhcjogX05hdmJhcjIuZGVmYXVsdCxcblx0ICBvcHRpb246IF9PcHRpb24yLmRlZmF1bHQsXG5cdCAgcGFuZWw6IF9QYW5lbDIuZGVmYXVsdCxcblx0ICBwb3BvdmVyOiBfUG9wb3ZlcjIuZGVmYXVsdCxcblx0ICBwcm9ncmVzc2JhcjogX1Byb2dyZXNzYmFyMi5kZWZhdWx0LFxuXHQgIHJhZGlvOiBfUmFkaW8yLmRlZmF1bHQsXG5cdCAgc2VsZWN0OiBfU2VsZWN0Mi5kZWZhdWx0LFxuXHQgIHNsaWRlcjogX1NsaWRlcjIuZGVmYXVsdCxcblx0ICBzcGlubmVyOiBfU3Bpbm5lcjIuZGVmYXVsdCxcblx0ICB0YWI6IF9UYWIyLmRlZmF1bHQsXG5cdCAgdGFiR3JvdXA6IF9UYWJHcm91cDIuZGVmYXVsdCxcblx0ICB0YWJzOiBfVGFiczIuZGVmYXVsdCxcblx0ICB0b2dnbGVCdXR0b246IF9Ub2dnbGVCdXR0b24yLmRlZmF1bHQsXG5cdCAgdG9vbHRpcDogX1Rvb2x0aXAyLmRlZmF1bHQsXG5cdCAgdHlwZWFoZWFkOiBfVHlwZWFoZWFkMi5kZWZhdWx0XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IFZ1ZVN0cmFwO1xuXG4vKioqLyB9LFxuLyogMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXHRcblx0dmFyIF9pdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xuXHRcblx0dmFyIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvcik7XG5cdFxuXHR2YXIgX2dldE93blByb3BlcnR5TmFtZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2KTtcblx0XG5cdHZhciBfZ2V0T3duUHJvcGVydHlOYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRPd25Qcm9wZXJ0eU5hbWVzKTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Mik7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzMiA9IF9fd2VicGFja19yZXF1aXJlX18oNjMpO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdF9fd2VicGFja19yZXF1aXJlX18oNjQpO1xuXHRcblx0dmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cdHZhciBub2RlRXJyb3IgPSBuZXcgRXJyb3IoJ1Bhc3NlZCBhcmd1bWVudHMgbXVzdCBiZSBvZiBOb2RlJyk7XG5cdHZhciBibHVyRXZlbnQ7XG5cdHZhciBibHVyTGlzdCA9IFtdO1xuXHR2YXIgRXZlbnRzID0gW107XG5cdFxuXHRmdW5jdGlvbiBpc05vZGUodmFsKSB7XG5cdCAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHdpbmRvdy5Ob2RlO1xuXHR9XG5cdGZ1bmN0aW9uIGlzTm9kZUxpc3QodmFsKSB7XG5cdCAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHdpbmRvdy5Ob2RlTGlzdCB8fCB2YWwgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENvbGxlY3Rpb24gfHwgdmFsIGluc3RhbmNlb2YgQXJyYXk7XG5cdH1cblx0XG5cdHZhciBOb2RlTGlzdCA9IGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBOb2RlTGlzdChhcmdzKSB7XG5cdCAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBOb2RlTGlzdCk7XG5cdFxuXHQgICAgdmFyIG5vZGVzID0gYXJncztcblx0ICAgIGlmIChhcmdzWzBdID09PSB3aW5kb3cpIHtcblx0ICAgICAgbm9kZXMgPSBbd2luZG93XTtcblx0ICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgIG5vZGVzID0gKGFyZ3NbMV0gfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoYXJnc1swXSk7XG5cdCAgICAgIGlmIChhcmdzWzFdKSB7XG5cdCAgICAgICAgdGhpcy5vd25lciA9IGFyZ3NbMV07XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAoMCBpbiBhcmdzICYmICFpc05vZGUoYXJnc1swXSkgJiYgYXJnc1swXSAmJiAnbGVuZ3RoJyBpbiBhcmdzWzBdKSB7XG5cdCAgICAgIG5vZGVzID0gYXJnc1swXTtcblx0ICAgICAgaWYgKGFyZ3NbMV0pIHtcblx0ICAgICAgICB0aGlzLm93bmVyID0gYXJnc1sxXTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaWYgKG5vZGVzKSB7XG5cdCAgICAgIGZvciAodmFyIGkgaW4gbm9kZXMpIHtcblx0ICAgICAgICB0aGlzW2ldID0gbm9kZXNbaV07XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5sZW5ndGggPSBub2Rlcy5sZW5ndGg7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmxlbmd0aCA9IDA7XG5cdCAgICB9XG5cdCAgICB3aW5kb3cucHJ1ZWJhID0gdGhpcztcblx0ICB9XG5cdFxuXHQgICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKE5vZGVMaXN0LCBbe1xuXHQgICAga2V5OiAnY29uY2F0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjb25jYXQoKSB7XG5cdCAgICAgIHZhciBub2RlcyA9IEFycmF5UHJvdG8uc2xpY2UuY2FsbCh0aGlzKTtcblx0ICAgICAgZnVuY3Rpb24gZmxhdHRlbihhcnIpIHtcblx0ICAgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcnIsIGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGlzTm9kZShlbCkpIHtcblx0ICAgICAgICAgICAgaWYgKCF+bm9kZXMuaW5kZXhPZihlbCkpIG5vZGVzLnB1c2goZWwpO1xuXHQgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGVsKSkge1xuXHQgICAgICAgICAgICBmbGF0dGVuKGVsKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcblx0ICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcmdzLCBmdW5jdGlvbiAoYXJnKSB7XG5cdCAgICAgICAgaWYgKGlzTm9kZShhcmcpKSB7XG5cdCAgICAgICAgICBpZiAoIX5ub2Rlcy5pbmRleE9mKGFyZykpIG5vZGVzLnB1c2goYXJnKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZUxpc3QoYXJnKSkge1xuXHQgICAgICAgICAgZmxhdHRlbihhcmcpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aHJvdyBFcnJvcignQ29uY2F0IGFyZ3VtZW50cyBtdXN0IGJlIG9mIGEgTm9kZSwgTm9kZUxpc3QsIEhUTUxDb2xsZWN0aW9uLCBvciBBcnJheSBvZiAoTm9kZSwgTm9kZUxpc3QsIEhUTUxDb2xsZWN0aW9uLCBBcnJheSknKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZGVsZXRlJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKCkge1xuXHQgICAgICB2YXIgbm90UmVtb3ZlZCA9IGZsYXR0ZW4odGhpcykuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbC5yZW1vdmUpIHtcblx0ICAgICAgICAgIGVsLnJlbW92ZSgpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoZWwucGFyZW50Tm9kZSkge1xuXHQgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmIChub3RSZW1vdmVkLmxlbmd0aCkgY29uc29sZS53YXJuKCdOb2RlTGlzdDogU29tZSBub2RlcyBjb3VsZCBub3QgYmUgZGVsZXRlZC4nKTtcblx0ICAgICAgcmV0dXJuIG5vdFJlbW92ZWQ7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZWFjaCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZWFjaCgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcblx0ICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZmlsdGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmaWx0ZXIoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhBcnJheVByb3RvLmZpbHRlci5hcHBseSh0aGlzLCBhcmdzKSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZmluZCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZmluZChlbGVtZW50KSB7XG5cdCAgICAgIHZhciBub2RlcyA9IFtdO1xuXHQgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICBub2Rlcy5wdXNoKG5vZGUucXVlcnlTZWxlY3RvckFsbChlbGVtZW50KSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICBpZiAoaXNOb2RlKGVsZW1lbnQpKSBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICBpZiAobm9kZSAhPT0gZWxlbWVudCAmJiBub2RlLmNvbnRhaW5zKGVsZW1lbnQpKSBub2Rlcy5wdXNoKGVsZW1lbnQpO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKGlzTm9kZUxpc3QoZWxlbWVudCkpIHtcblx0ICAgICAgICB2YXIgZWxzID0gZmxhdHRlbihlbGVtZW50KTtcblx0ICAgICAgICBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICAgIGVscy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgICBpZiAobm9kZSAhPT0gZWwgJiYgbm9kZS5jb250YWlucyhlbCkpIG5vZGVzLnB1c2goZWwpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZsYXR0ZW4obm9kZXMsIHRoaXMub3duZXIpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZvckVhY2gnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2luY2x1ZGVzJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBpbmNsdWRlcyhlbGVtZW50LCBpbmRleCkge1xuXHQgICAgICByZXR1cm4gfnRoaXMuaW5kZXhPZihlbGVtZW50LCBpbmRleCk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnbWFwJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW41ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW41KSwgX2tleTUgPSAwOyBfa2V5NSA8IF9sZW41OyBfa2V5NSsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5NV0gPSBhcmd1bWVudHNbX2tleTVdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgbWFwcGVkID0gQXJyYXlQcm90by5tYXAuYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiBtYXBwZWQuc29tZShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gaXNOb2RlKGVsKSB8fCBpc05vZGVMaXN0KGVsKTtcblx0ICAgICAgfSkgPyBmbGF0dGVuKG1hcHBlZCwgdGhpcykgOiBtYXBwZWQ7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncGFyZW50Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKHRoaXMubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbC5wYXJlbnROb2RlO1xuXHQgICAgICB9KSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncG9wJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwb3AoYW1vdW50KSB7XG5cdCAgICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGFtb3VudCA9IDE7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIG5vZGVzID0gW107XG5cdCAgICAgIHZhciBwb3AgPSBBcnJheVByb3RvLnBvcC5iaW5kKHRoaXMpO1xuXHQgICAgICB3aGlsZSAoYW1vdW50LS0pIHtcblx0ICAgICAgICBub2Rlcy5wdXNoKHBvcCgpKTtcblx0ICAgICAgfXJldHVybiBOb2RlTGlzdEpTKG5vZGVzLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdwdXNoJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjYpLCBfa2V5NiA9IDA7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk2XSA9IGFyZ3VtZW50c1tfa2V5Nl07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyZ3MsIGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmcpKSB0aHJvdyBub2RlRXJyb3I7XG5cdCAgICAgICAgaWYgKCF+X3RoaXMuaW5kZXhPZihhcmcpKSBBcnJheVByb3RvLnB1c2guY2FsbChfdGhpcywgYXJnKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3NoaWZ0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzaGlmdChhbW91bnQpIHtcblx0ICAgICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XG5cdCAgICAgICAgYW1vdW50ID0gMTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgbm9kZXMgPSBbXTtcblx0ICAgICAgd2hpbGUgKGFtb3VudC0tKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChBcnJheVByb3RvLnNoaWZ0LmNhbGwodGhpcykpO1xuXHQgICAgICB9cmV0dXJuIG5vZGVzLmxlbmd0aCA9PSAxID8gbm9kZXNbMF0gOiBOb2RlTGlzdEpTKG5vZGVzLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzbGljZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2xpY2UoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW43ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW43KSwgX2tleTcgPSAwOyBfa2V5NyA8IF9sZW43OyBfa2V5NysrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5N10gPSBhcmd1bWVudHNbX2tleTddO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhBcnJheVByb3RvLnNsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzcGxpY2UnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNwbGljZSgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjggPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjgpLCBfa2V5OCA9IDA7IF9rZXk4IDwgX2xlbjg7IF9rZXk4KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk4XSA9IGFyZ3VtZW50c1tfa2V5OF07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIGkgPSAyLCBsID0gYXJncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmdzW2ldKSkgdGhyb3cgbm9kZUVycm9yO1xuXHQgICAgICB9XG5cdCAgICAgIEFycmF5UHJvdG8uc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICd1bnNoaWZ0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIHZhciB1bnNoaWZ0ID0gQXJyYXlQcm90by51bnNoaWZ0LmJpbmQodGhpcyk7XG5cdFxuXHQgICAgICBmb3IgKHZhciBfbGVuOSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuOSksIF9rZXk5ID0gMDsgX2tleTkgPCBfbGVuOTsgX2tleTkrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTldID0gYXJndW1lbnRzW19rZXk5XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJncywgZnVuY3Rpb24gKGFyZykge1xuXHQgICAgICAgIGlmICghaXNOb2RlKGFyZykpIHRocm93IG5vZGVFcnJvcjtcblx0ICAgICAgICBpZiAoIX5fdGhpczIuaW5kZXhPZihhcmcpKSB1bnNoaWZ0KGFyZyk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdhZGRDbGFzcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQ2xhc3MoY2xhc3Nlcykge1xuXHQgICAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCB0cnVlKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdyZW1vdmVDbGFzcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoY2xhc3Nlcykge1xuXHQgICAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCBmYWxzZSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAndG9nZ2xlQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuXHRcblx0ICAgICAgdmFyIG1ldGhvZCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyAndG9nZ2xlJyA6IHZhbHVlID8gJ2FkZCcgOiAncmVtb3ZlJztcblx0ICAgICAgaWYgKHR5cGVvZiBjbGFzc2VzID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgcmV0dXJuIGNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuXHQgICAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdFttZXRob2RdKGMpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdnZXQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGdldChwcm9wKSB7XG5cdCAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgZWwgPSBlbFtwcm9wXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXJyLnB1c2goZWwpO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIGZsYXR0ZW4oYXJyLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzZXQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNldChwcm9wLCB2YWx1ZSkge1xuXHQgICAgICBpZiAocHJvcC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGVsKSB7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wKSB7XG5cdCAgICAgICAgICAgICAgaWYgKGtleSBpbiBlbCkge1xuXHQgICAgICAgICAgICAgICAgZWxba2V5XSA9IHByb3Bba2V5XTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgICBpZiAocHJvcCBpbiBlbCkge1xuXHQgICAgICAgICAgICBlbFtwcm9wXSA9IHZhbHVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2NhbGwnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbGwoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4xMCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMTApLCBfa2V5MTAgPSAwOyBfa2V5MTAgPCBfbGVuMTA7IF9rZXkxMCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5MTBdID0gYXJndW1lbnRzW19rZXkxMF07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvLnNoaWZ0LmNhbGwoYXJncyk7XG5cdCAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgdmFyIHJldHVyblRoaXMgPSB0cnVlO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgaWYgKGVsICYmIGVsW21ldGhvZF0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgZWwgPSBlbFttZXRob2RdLmFwcGx5KGVsLCBhcmdzKTtcblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICAgIGlmIChyZXR1cm5UaGlzICYmIGVsICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuVGhpcyA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBhcnIucHVzaCh1bmRlZmluZWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiByZXR1cm5UaGlzID8gdGhpcyA6IGZsYXR0ZW4oYXJyLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdpdGVtJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBpdGVtKGluZGV4KSB7XG5cdCAgICAgIHJldHVybiBOb2RlTGlzdEpTKFt0aGlzW2luZGV4XV0sIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uJyxcblx0XG5cdFxuXHQgICAgLy8gZXZlbnQgaGFuZGxlcnNcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuXHQgICAgICBpZiAodHlwZW9mIGV2ZW50cyA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBldmVudHMgPSBldmVudHMudHJpbSgpLnJlcGxhY2UoL1xccysvLCAnICcpLnNwbGl0KCcgJyk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cdCAgICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgY2FsbGJhY2sgPSBzZWxlY3Rvcjtcblx0ICAgICAgICBzZWxlY3RvciA9IG51bGw7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuIHRoaXM7XG5cdCAgICAgIHZhciBmbiA9IGNhbGxiYWNrO1xuXHQgICAgICBjYWxsYmFjayA9IHNlbGVjdG9yID8gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICB2YXIgZWxzID0gTm9kZUxpc3RKUyhzZWxlY3RvciwgdGhpcyk7XG5cdCAgICAgICAgaWYgKCFlbHMubGVuZ3RoKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVscy5zb21lKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgdmFyIHRhcmdldCA9IGVsLmNvbnRhaW5zKGUudGFyZ2V0KTtcblx0ICAgICAgICAgIGlmICh0YXJnZXQpIGZuLmNhbGwoZWwsIGUsIGVsKTtcblx0ICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gOiBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgIGZuLmFwcGx5KHRoaXMsIFtlLCB0aGlzXSk7XG5cdCAgICAgIH07XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgIGlmIChlbCA9PT0gd2luZG93IHx8IGlzTm9kZShlbCkpIHtcblx0ICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgY2FsbGJhY2ssIGZhbHNlKTtcblx0ICAgICAgICAgICAgRXZlbnRzLnB1c2goe1xuXHQgICAgICAgICAgICAgIGVsOiBlbCxcblx0ICAgICAgICAgICAgICBldmVudDogZXZlbnQsXG5cdCAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb2ZmJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYoZXZlbnRzLCBjYWxsYmFjaykge1xuXHQgICAgICBpZiAoZXZlbnRzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICBjYWxsYmFjayA9IGV2ZW50cztcblx0ICAgICAgICBldmVudHMgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGV2ZW50cyA9IGV2ZW50cyBpbnN0YW5jZW9mIEFycmF5ID8gZXZlbnRzIDogdHlwZW9mIGV2ZW50cyA9PT0gJ3N0cmluZycgPyBldmVudHMudHJpbSgpLnJlcGxhY2UoL1xccysvLCAnICcpLnNwbGl0KCcgJykgOiBudWxsO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgRXZlbnRzID0gRXZlbnRzLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgaWYgKGUgJiYgZS5lbCA9PT0gZWwgJiYgKCFjYWxsYmFjayB8fCBjYWxsYmFjayA9PT0gZS5jYWxsYmFjaykgJiYgKCFldmVudHMgfHwgfmV2ZW50cy5pbmRleE9mKGUuZXZlbnQpKSkge1xuXHQgICAgICAgICAgICBlLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS5ldmVudCwgZS5jYWxsYmFjayk7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25CbHVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkJsdXIoY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cdCAgICAgIGlmICghY2FsbGJhY2spIHJldHVybiB0aGlzO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgYmx1ckxpc3QucHVzaCh7IGVsOiBlbCwgY2FsbGJhY2s6IGNhbGxiYWNrIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKCFibHVyRXZlbnQpIHtcblx0ICAgICAgICBibHVyRXZlbnQgPSBmdW5jdGlvbiBibHVyRXZlbnQoZSkge1xuXHQgICAgICAgICAgYmx1ckxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gaXRlbS5lbC5jb250YWlucyhlLnRhcmdldCkgfHwgaXRlbS5lbCA9PT0gZS50YXJnZXQ7XG5cdCAgICAgICAgICAgIGlmICghdGFyZ2V0KSBpdGVtLmNhbGxiYWNrLmNhbGwoaXRlbS5lbCwgZSwgaXRlbS5lbCk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYmx1ckV2ZW50LCBmYWxzZSk7XG5cdCAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJsdXJFdmVudCwgZmFsc2UpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29mZkJsdXInLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9mZkJsdXIoY2FsbGJhY2spIHtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGJsdXJMaXN0ID0gYmx1ckxpc3QuZmlsdGVyKGZ1bmN0aW9uIChibHVyKSB7XG5cdCAgICAgICAgICBpZiAoYmx1ciAmJiBibHVyLmVsID09PSBlbCAmJiAoIWNhbGxiYWNrIHx8IGJsdXIuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICByZXR1cm4gZWw7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdhc0FycmF5Jyxcblx0ICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgICByZXR1cm4gQXJyYXlQcm90by5zbGljZS5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHQgIH1dKTtcblx0ICByZXR1cm4gTm9kZUxpc3Q7XG5cdH0oKTtcblx0XG5cdHZhciBOTCA9IE5vZGVMaXN0LnByb3RvdHlwZTtcblx0XG5cdGZ1bmN0aW9uIGZsYXR0ZW4oYXJyLCBvd25lcikge1xuXHQgIHZhciBsaXN0ID0gW107XG5cdCAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJyLCBmdW5jdGlvbiAoZWwpIHtcblx0ICAgIGlmIChpc05vZGUoZWwpKSB7XG5cdCAgICAgIGlmICghfmxpc3QuaW5kZXhPZihlbCkpIGxpc3QucHVzaChlbCk7XG5cdCAgICB9IGVsc2UgaWYgKGlzTm9kZUxpc3QoZWwpKSB7XG5cdCAgICAgIGZvciAodmFyIGlkIGluIGVsKSB7XG5cdCAgICAgICAgaWYgKCF+bGlzdC5pbmRleE9mKGVsW2lkXSkpIGxpc3QucHVzaChlbFtpZF0pO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2UgaWYgKGVsICE9PSBudWxsKSB7XG5cdCAgICAgIGFyci5nZXQgPSBOTC5nZXQ7XG5cdCAgICAgIGFyci5zZXQgPSBOTC5zZXQ7XG5cdCAgICAgIGFyci5jYWxsID0gTkwuY2FsbDtcblx0ICAgICAgYXJyLm93bmVyID0gb3duZXI7XG5cdCAgICAgIHJldHVybiBhcnI7XG5cdCAgICB9XG5cdCAgfSk7XG5cdCAgcmV0dXJuIE5vZGVMaXN0SlMobGlzdCwgb3duZXIpO1xuXHR9XG5cdFxuXHR2YXIgZXhjZXB0aW9ucyA9IFsnam9pbicsICdjb3B5V2l0aGluJywgJ2ZpbGwnLCAnZmluZCcsICdmb3JFYWNoJ107XG5cdCgwLCBfZ2V0T3duUHJvcGVydHlOYW1lczIuZGVmYXVsdCkoQXJyYXlQcm90bykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdCAgaWYgKCF+ZXhjZXB0aW9ucy5pbmRleE9mKGtleSkgJiYgTkxba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICBOTFtrZXldID0gQXJyYXlQcm90b1trZXldO1xuXHQgIH1cblx0fSk7XG5cdGlmICh3aW5kb3cuU3ltYm9sICYmIF9pdGVyYXRvcjIuZGVmYXVsdCkge1xuXHQgIE5MW19pdGVyYXRvcjIuZGVmYXVsdF0gPSBOTC52YWx1ZXMgPSBBcnJheVByb3RvW19pdGVyYXRvcjIuZGVmYXVsdF07XG5cdH1cblx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRmdW5jdGlvbiBzZXR0ZXJHZXR0ZXIocHJvcCkge1xuXHQgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICBpZiAoTkxbcHJvcF0pIHJldHVybjtcblx0ICBpZiAoZGl2W3Byb3BdIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgIE5MW3Byb3BdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMTEgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjExKSwgX2tleTExID0gMDsgX2tleTExIDwgX2xlbjExOyBfa2V5MTErKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTExXSA9IGFyZ3VtZW50c1tfa2V5MTFdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHZhciByZXR1cm5UaGlzID0gdHJ1ZTtcblx0ICAgICAgZm9yICh2YXIgaSBpbiBOTCkge1xuXHQgICAgICAgIHZhciBlbCA9IE5MW2ldO1xuXHQgICAgICAgIGlmIChlbCAmJiBlbFtwcm9wXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICAgICAgICBlbCA9IGVsW3Byb3BdLmFwcGx5KGVsLCBhcmdzKTtcblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICAgIGlmIChyZXR1cm5UaGlzICYmIGVsICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuVGhpcyA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBhcnIucHVzaCh1bmRlZmluZWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gcmV0dXJuVGhpcyA/IF90aGlzMyA6IGZsYXR0ZW4oYXJyLCBfdGhpczMpO1xuXHQgICAgfTtcblx0ICB9IGVsc2Uge1xuXHQgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoTkwsIHByb3AsIHtcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICAgICAgdmFyIGFyciA9IFtdO1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICBlbCA9IGVsW3Byb3BdO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgYXJyLnB1c2goZWwpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGVsICYmIHByb3AgaW4gZWwpIHtcblx0ICAgICAgICAgICAgZWxbcHJvcF0gPSB2YWx1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgfVxuXHR9XG5cdGZvciAodmFyIHByb3AgaW4gZGl2KSB7XG5cdCAgc2V0dGVyR2V0dGVyKHByb3ApO1xuXHR9ZnVuY3Rpb24gTm9kZUxpc3RKUygpIHtcblx0ICBmb3IgKHZhciBfbGVuMTIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjEyKSwgX2tleTEyID0gMDsgX2tleTEyIDwgX2xlbjEyOyBfa2V5MTIrKykge1xuXHQgICAgYXJnc1tfa2V5MTJdID0gYXJndW1lbnRzW19rZXkxMl07XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gbmV3IE5vZGVMaXN0KGFyZ3MpO1xuXHR9XG5cdHdpbmRvdy5OTCA9IE5vZGVMaXN0SlM7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSBOb2RlTGlzdEpTO1xuXG4vKioqLyB9LFxuLyogMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgJE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNykuT2JqZWN0O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2Mpe1xuXHQgIHJldHVybiAkT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHQvLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuXHQkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSwgJ09iamVjdCcsIHtkZWZpbmVQcm9wZXJ0eTogX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZn0pO1xuXG4vKioqLyB9LFxuLyogNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGdsb2JhbCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIGNvcmUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIGN0eCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oOClcblx0ICAsIGhpZGUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblx0XG5cdHZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcblx0ICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuXHQgICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG5cdCAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcblx0ICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuXHQgICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG5cdCAgICAsIElTX1dSQVAgICA9IHR5cGUgJiAkZXhwb3J0Lldcblx0ICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcblx0ICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdXG5cdCAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV1cblx0ICAgICwga2V5LCBvd24sIG91dDtcblx0ICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcblx0ICBmb3Ioa2V5IGluIHNvdXJjZSl7XG5cdCAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcblx0ICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG5cdCAgICBpZihvd24gJiYga2V5IGluIGV4cG9ydHMpY29udGludWU7XG5cdCAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuXHQgICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcblx0ICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuXHQgICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cblx0ICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG5cdCAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuXHQgICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcblx0ICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24oQyl7XG5cdCAgICAgIHZhciBGID0gZnVuY3Rpb24oYSwgYiwgYyl7XG5cdCAgICAgICAgaWYodGhpcyBpbnN0YW5jZW9mIEMpe1xuXHQgICAgICAgICAgc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe1xuXHQgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQztcblx0ICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEMoYSk7XG5cdCAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuXHQgICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG5cdCAgICAgICAgfSByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICB9O1xuXHQgICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG5cdCAgICAgIHJldHVybiBGO1xuXHQgICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG5cdCAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG5cdCAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSVcblx0ICAgIGlmKElTX1BST1RPKXtcblx0ICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuXHQgICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuXHQgICAgICBpZih0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKWhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cdC8vIHR5cGUgYml0bWFwXG5cdCRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG5cdCRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG5cdCRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG5cdCRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cblx0JGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG5cdCRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuXHQkZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcblx0JGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgIFxuXHRtb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG5cbi8qKiovIH0sXG4vKiA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxuXHR2YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcblx0ICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdGlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbi8qKiovIH0sXG4vKiA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHR2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuXHRpZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuLyoqKi8gfSxcbi8qIDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xuXHR2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcblx0ICBhRnVuY3Rpb24oZm4pO1xuXHQgIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG5cdCAgc3dpdGNoKGxlbmd0aCl7XG5cdCAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcblx0ICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG5cdCAgICB9O1xuXHQgICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG5cdCAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuXHQgICAgfTtcblx0ICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuXHQgICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcblx0ICAgIH07XG5cdCAgfVxuXHQgIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcblx0ICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuXHQgIH07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZFAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCBjcmVhdGVEZXNjID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSkgPyBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuXHQgIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG5cdH0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuXHQgIG9iamVjdFtrZXldID0gdmFsdWU7XG5cdCAgcmV0dXJuIG9iamVjdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDExICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgYW5PYmplY3QgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuXHQgICwgSUU4X0RPTV9ERUZJTkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KVxuXHQgICwgdG9QcmltaXRpdmUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KVxuXHQgICwgZFAgICAgICAgICAgICAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdFxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuXHQgIGFuT2JqZWN0KE8pO1xuXHQgIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcblx0ICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcblx0ICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuXHQgICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuXHQgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblx0ICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcblx0ICBpZigndmFsdWUnIGluIEF0dHJpYnV0ZXMpT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG5cdCAgcmV0dXJuIE87XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gIV9fd2VicGFja19yZXF1aXJlX18oMTUpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KShmdW5jdGlvbigpe1xuXHQgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX3JlcXVpcmVfXygxNykoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDE1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5cdG1vZHVsZS5leHBvcnRzID0gIV9fd2VicGFja19yZXF1aXJlX18oMTYpKGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcblx0fSk7XG5cbi8qKiovIH0sXG4vKiAxNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcblx0ICB0cnkge1xuXHQgICAgcmV0dXJuICEhZXhlYygpO1xuXHQgIH0gY2F0Y2goZSl7XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMylcblx0ICAsIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5kb2N1bWVudFxuXHQgIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuXHQgICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHQvLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuXHQvLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBTKXtcblx0ICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcblx0ICB2YXIgZm4sIHZhbDtcblx0ICBpZihTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG5cdCAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG5cdCAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG5cdCAgcmV0dXJuIHtcblx0ICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcblx0ICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcblx0ICAgIHdyaXRhYmxlICAgIDogIShiaXRtYXAgJiA0KSxcblx0ICAgIHZhbHVlICAgICAgIDogdmFsdWVcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX193ZWJwYWNrX3JlcXVpcmVfXygyMSksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1MSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSkuZignaXRlcmF0b3InKTtcblxuLyoqKi8gfSxcbi8qIDIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciAkYXQgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMykodHJ1ZSk7XG5cdFxuXHQvLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5cdF9fd2VicGFja19yZXF1aXJlX18oMjYpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcblx0ICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG5cdCAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcblx0Ly8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxuXHR9LCBmdW5jdGlvbigpe1xuXHQgIHZhciBPICAgICA9IHRoaXMuX3Rcblx0ICAgICwgaW5kZXggPSB0aGlzLl9pXG5cdCAgICAsIHBvaW50O1xuXHQgIGlmKGluZGV4ID49IE8ubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG5cdCAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuXHQgIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuXHQgIHJldHVybiB7dmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZX07XG5cdH0pO1xuXG4vKioqLyB9LFxuLyogMjMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgZGVmaW5lZCAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cdC8vIHRydWUgIC0+IFN0cmluZyNhdFxuXHQvLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuXHQgIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuXHQgICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcblx0ICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcblx0ICAgICAgLCBsID0gcy5sZW5ndGhcblx0ICAgICAgLCBhLCBiO1xuXHQgICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcblx0ICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG5cdCAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuXHQgICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuXHQgICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIDcuMS40IFRvSW50ZWdlclxuXHR2YXIgY2VpbCAgPSBNYXRoLmNlaWxcblx0ICAsIGZsb29yID0gTWF0aC5mbG9vcjtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYoaXQgPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgTElCUkFSWSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KVxuXHQgICwgJGV4cG9ydCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCByZWRlZmluZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpXG5cdCAgLCBoaWRlICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBJdGVyYXRvcnMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzApXG5cdCAgLCAkaXRlckNyZWF0ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpXG5cdCAgLCBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpXG5cdCAgLCBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oNDkpXG5cdCAgLCBJVEVSQVRPUiAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpKCdpdGVyYXRvcicpXG5cdCAgLCBCVUdHWSAgICAgICAgICA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKSAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG5cdCAgLCBGRl9JVEVSQVRPUiAgICA9ICdAQGl0ZXJhdG9yJ1xuXHQgICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcblx0ICAsIFZBTFVFUyAgICAgICAgID0gJ3ZhbHVlcyc7XG5cdFxuXHR2YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpe1xuXHQgICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblx0ICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG5cdCAgICBpZighQlVHR1kgJiYga2luZCBpbiBwcm90bylyZXR1cm4gcHJvdG9ba2luZF07XG5cdCAgICBzd2l0Y2goa2luZCl7XG5cdCAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICB9O1xuXHQgIHZhciBUQUcgICAgICAgID0gTkFNRSArICcgSXRlcmF0b3InXG5cdCAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuXHQgICAgLCBWQUxVRVNfQlVHID0gZmFsc2Vcblx0ICAgICwgcHJvdG8gICAgICA9IEJhc2UucHJvdG90eXBlXG5cdCAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cblx0ICAgICwgJGRlZmF1bHQgICA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpXG5cdCAgICAsICRlbnRyaWVzICAgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkXG5cdCAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG5cdCAgICAsIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG5cdCAgLy8gRml4IG5hdGl2ZVxuXHQgIGlmKCRhbnlOYXRpdmUpe1xuXHQgICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UpKTtcblx0ICAgIGlmKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKXtcblx0ICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuXHQgICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcblx0ICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG5cdCAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcblx0ICBpZihERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpe1xuXHQgICAgVkFMVUVTX0JVRyA9IHRydWU7XG5cdCAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuXHQgIH1cblx0ICAvLyBEZWZpbmUgaXRlcmF0b3Jcblx0ICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG5cdCAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuXHQgIH1cblx0ICAvLyBQbHVnIGZvciBsaWJyYXJ5XG5cdCAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG5cdCAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcblx0ICBpZihERUZBVUxUKXtcblx0ICAgIG1ldGhvZHMgPSB7XG5cdCAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuXHQgICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG5cdCAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG5cdCAgICB9O1xuXHQgICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG5cdCAgICAgIGlmKCEoa2V5IGluIHByb3RvKSlyZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuXHQgICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcblx0ICB9XG5cdCAgcmV0dXJuIG1ldGhvZHM7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB0cnVlO1xuXG4vKioqLyB9LFxuLyogMjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5cbi8qKiovIH0sXG4vKiAyOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG5cdCAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLyoqKi8gfSxcbi8qIDMxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciBjcmVhdGUgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpXG5cdCAgLCBkZXNjcmlwdG9yICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpXG5cdCAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXHRcblx0Ly8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMCkoSXRlcmF0b3JQcm90b3R5cGUsIF9fd2VicGFja19yZXF1aXJlX18oNDgpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KXtcblx0ICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG5cdCAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG5cdHZhciBhbk9iamVjdCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCBkUHMgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzMpXG5cdCAgLCBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpXG5cdCAgLCBJRV9QUk9UTyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpKCdJRV9QUk9UTycpXG5cdCAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cblx0ICAsIFBST1RPVFlQRSAgID0gJ3Byb3RvdHlwZSc7XG5cdFxuXHQvLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG5cdHZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24oKXtcblx0ICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuXHQgIHZhciBpZnJhbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KSgnaWZyYW1lJylcblx0ICAgICwgaSAgICAgID0gZW51bUJ1Z0tleXMubGVuZ3RoXG5cdCAgICAsIGx0ICAgICA9ICc8J1xuXHQgICAgLCBndCAgICAgPSAnPidcblx0ICAgICwgaWZyYW1lRG9jdW1lbnQ7XG5cdCAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXyg0NikuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblx0ICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG5cdCAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcblx0ICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG5cdCAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcblx0ICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG5cdCAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuXHQgIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG5cdCAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG5cdCAgd2hpbGUoaS0tKWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuXHQgIHJldHVybiBjcmVhdGVEaWN0KCk7XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuXHQgIHZhciByZXN1bHQ7XG5cdCAgaWYoTyAhPT0gbnVsbCl7XG5cdCAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG5cdCAgICByZXN1bHQgPSBuZXcgRW1wdHk7XG5cdCAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcblx0ICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcblx0ICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuXHQgIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG5cdCAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAzMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRQICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSlcblx0ICAsIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIGdldEtleXMgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpe1xuXHQgIGFuT2JqZWN0KE8pO1xuXHQgIHZhciBrZXlzICAgPSBnZXRLZXlzKFByb3BlcnRpZXMpXG5cdCAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG5cdCAgICAsIGkgPSAwXG5cdCAgICAsIFA7XG5cdCAgd2hpbGUobGVuZ3RoID4gaSlkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuXHQgIHJldHVybiBPO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxuXHR2YXIgJGtleXMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KVxuXHQgICwgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKXtcblx0ICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBoYXMgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgdG9JT2JqZWN0ICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIGFycmF5SW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMzkpKGZhbHNlKVxuXHQgICwgSUVfUFJPVE8gICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MikoJ0lFX1BST1RPJyk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgbmFtZXMpe1xuXHQgIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuXHQgICAgLCBpICAgICAgPSAwXG5cdCAgICAsIHJlc3VsdCA9IFtdXG5cdCAgICAsIGtleTtcblx0ICBmb3Ioa2V5IGluIE8paWYoa2V5ICE9IElFX1BST1RPKWhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG5cdCAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuXHQgIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKXtcblx0ICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfVxuXHQgIHJldHVybiByZXN1bHQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG5cdHZhciBJT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNylcblx0ICAsIGRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5cdHZhciBjb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcblx0Ly8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcblx0dmFyIHRvSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b0xlbmd0aCAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQwKVxuXHQgICwgdG9JbmRleCAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuXHQgIHJldHVybiBmdW5jdGlvbigkdGhpcywgZWwsIGZyb21JbmRleCl7XG5cdCAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuXHQgICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuXHQgICAgICAsIGluZGV4ICA9IHRvSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpXG5cdCAgICAgICwgdmFsdWU7XG5cdCAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG5cdCAgICBpZihJU19JTkNMVURFUyAmJiBlbCAhPSBlbCl3aGlsZShsZW5ndGggPiBpbmRleCl7XG5cdCAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcblx0ICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG5cdCAgICAvLyBBcnJheSN0b0luZGV4IGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG5cdCAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcblx0ICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuXHQgICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuXHQgIH07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjE1IFRvTGVuZ3RoXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgbWluICAgICAgID0gTWF0aC5taW47XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpXG5cdCAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuXHQgICwgbWluICAgICAgID0gTWF0aC5taW47XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG5cdCAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuXHQgIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKSgna2V5cycpXG5cdCAgLCB1aWQgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuXHQgIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG5cdCAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHR2YXIgaWQgPSAwXG5cdCAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcblx0bW9kdWxlLmV4cG9ydHMgPSAoXG5cdCAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcblx0KS5zcGxpdCgnLCcpO1xuXG4vKioqLyB9LFxuLyogNDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbi8qKiovIH0sXG4vKiA0NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRlZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpLmZcblx0ICAsIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBUQUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgndG9TdHJpbmdUYWcnKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIHRhZywgc3RhdCl7XG5cdCAgaWYoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSlkZWYoaXQsIFRBRywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZ30pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBzdG9yZSAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MykoJ3drcycpXG5cdCAgLCB1aWQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NClcblx0ICAsIFN5bWJvbCAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLlN5bWJvbFxuXHQgICwgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblx0XG5cdHZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XG5cdCAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG5cdCAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xuXHR9O1xuXHRcblx0JGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcblxuLyoqKi8gfSxcbi8qIDQ5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxuXHR2YXIgaGFzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgdG9PYmplY3QgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKVxuXHQgICwgSUVfUFJPVE8gICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKSgnSUVfUFJPVE8nKVxuXHQgICwgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oTyl7XG5cdCAgTyA9IHRvT2JqZWN0KE8pO1xuXHQgIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuXHQgIGlmKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3Ipe1xuXHQgICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuXHQgIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxuXHR2YXIgZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDUxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDUyKTtcblx0dmFyIGdsb2JhbCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBoaWRlICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMClcblx0ICAsIEl0ZXJhdG9ycyAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgVE9fU1RSSU5HX1RBRyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpKCd0b1N0cmluZ1RhZycpO1xuXHRcblx0Zm9yKHZhciBjb2xsZWN0aW9ucyA9IFsnTm9kZUxpc3QnLCAnRE9NVG9rZW5MaXN0JywgJ01lZGlhTGlzdCcsICdTdHlsZVNoZWV0TGlzdCcsICdDU1NSdWxlTGlzdCddLCBpID0gMDsgaSA8IDU7IGkrKyl7XG5cdCAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuXHQgICAgLCBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdXG5cdCAgICAsIHByb3RvICAgICAgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuXHQgIGlmKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSloaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcblx0ICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDUyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mylcblx0ICAsIHN0ZXAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0KVxuXHQgICwgSXRlcmF0b3JzICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzApXG5cdCAgLCB0b0lPYmplY3QgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7XG5cdFxuXHQvLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG5cdC8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG5cdC8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcblx0Ly8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNikoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcblx0ICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG5cdCAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcblx0ICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuXHQvLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcblx0fSwgZnVuY3Rpb24oKXtcblx0ICB2YXIgTyAgICAgPSB0aGlzLl90XG5cdCAgICAsIGtpbmQgID0gdGhpcy5fa1xuXHQgICAgLCBpbmRleCA9IHRoaXMuX2krKztcblx0ICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG5cdCAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuXHQgICAgcmV0dXJuIHN0ZXAoMSk7XG5cdCAgfVxuXHQgIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuXHQgIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuXHQgIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcblx0fSwgJ3ZhbHVlcycpO1xuXHRcblx0Ly8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuXHRJdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXHRcblx0YWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuXHRhZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcblx0YWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG4vKioqLyB9LFxuLyogNTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfTtcblxuLyoqKi8gfSxcbi8qIDU0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcblx0ICByZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDU1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KTtcblxuLyoqKi8gfSxcbi8qIDU2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oNTcpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiA1NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1OCk7XG5cdHZhciAkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5PYmplY3Q7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1OSkoJ2dldE93blByb3BlcnR5TmFtZXMnLCBmdW5jdGlvbigpe1xuXHQgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwKS5mO1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDU5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCBjb3JlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuXHQgICwgZmFpbHMgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG5cdCAgdmFyIGZuICA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXVxuXHQgICAgLCBleHAgPSB7fTtcblx0ICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuXHQgICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24oKXsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG5cdHZhciB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KVxuXHQgICwgZ09QTiAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MSkuZlxuXHQgICwgdG9TdHJpbmcgID0ge30udG9TdHJpbmc7XG5cdFxuXHR2YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuXHQgID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXHRcblx0dmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHRyeSB7XG5cdCAgICByZXR1cm4gZ09QTihpdCk7XG5cdCAgfSBjYXRjaChlKXtcblx0ICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuXHQgIH1cblx0fTtcblx0XG5cdG1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcblx0ICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiA2MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuXHR2YXIgJGtleXMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzUpXG5cdCAgLCBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSkuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cdFxuXHRleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pe1xuXHQgIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDYyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG5cdCAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcblx0ICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNjMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHRcblx0dmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZpbmVQcm9wZXJ0eSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuXHQgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuXHQgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG5cdCAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcblx0ICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcblx0ICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG5cdCAgICB9XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuXHQgICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcblx0ICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuXHQgICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuXHQgIH07XG5cdH0oKTtcblxuLyoqKi8gfSxcbi8qIDY0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHQvKipcclxuXHQgKiBBcnJheS5maW5kXHJcblx0ICovXG5cdGlmICghQXJyYXkucHJvdG90eXBlLmZpbmQpIHtcblx0ICBBcnJheS5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHtcblx0ICAgICd1c2Ugc3RyaWN0Jztcblx0XG5cdCAgICBpZiAodGhpcyA9PSBudWxsKSB7XG5cdCAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5maW5kIGNhbGxlZCBvbiBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHQgICAgfVxuXHQgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHQgICAgfVxuXHQgICAgdmFyIGxpc3QgPSBPYmplY3QodGhpcyk7XG5cdCAgICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGggPj4+IDA7XG5cdCAgICB2YXIgdGhpc0FyZyA9IGFyZ3VtZW50c1sxXTtcblx0ICAgIHZhciB2YWx1ZTtcblx0XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIHZhbHVlID0gbGlzdFtpXTtcblx0ICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpLCBsaXN0KSkge1xuXHQgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHVuZGVmaW5lZDtcblx0ICB9O1xuXHR9XG5cdFxuXHQvKlxyXG5cdCAqIGNsYXNzTGlzdC5qczogQ3Jvc3MtYnJvd3NlciBmdWxsIGVsZW1lbnQuY2xhc3NMaXN0IGltcGxlbWVudGF0aW9uLlxyXG5cdCAqIDEuMS4yMDE1MDMxMlxyXG5cdCAqXHJcblx0ICogQnkgRWxpIEdyZXksIGh0dHA6Ly9lbGlncmV5LmNvbVxyXG5cdCAqIExpY2Vuc2U6IERlZGljYXRlZCB0byB0aGUgcHVibGljIGRvbWFpbi5cclxuXHQgKiAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZFxyXG5cdCAqL1xuXHQvKmdsb2JhbCBzZWxmLCBkb2N1bWVudCwgRE9NRXhjZXB0aW9uICovXG5cdC8qISBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvY2xhc3NMaXN0LmpzICovXG5cdGlmIChcImRvY3VtZW50XCIgaW4gc2VsZikge1xuXHQgIC8vIEZ1bGwgcG9seWZpbGwgZm9yIGJyb3dzZXJzIHdpdGggbm8gY2xhc3NMaXN0IHN1cHBvcnRcblx0ICAvLyBJbmNsdWRpbmcgSUUgPCBFZGdlIG1pc3NpbmcgU1ZHRWxlbWVudC5jbGFzc0xpc3Rcblx0ICBpZiAoIShcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJfXCIpKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgJiYgIShcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKSkpIHtcblx0XG5cdCAgICAoZnVuY3Rpb24gKHZpZXcpIHtcblx0XG5cdCAgICAgIFwidXNlIHN0cmljdFwiO1xuXHRcblx0ICAgICAgaWYgKCEoJ0VsZW1lbnQnIGluIHZpZXcpKSByZXR1cm47XG5cdFxuXHQgICAgICB2YXIgY2xhc3NMaXN0UHJvcCA9IFwiY2xhc3NMaXN0XCIsXG5cdCAgICAgICAgICBwcm90b1Byb3AgPSBcInByb3RvdHlwZVwiLFxuXHQgICAgICAgICAgZWxlbUN0clByb3RvID0gdmlldy5FbGVtZW50W3Byb3RvUHJvcF0sXG5cdCAgICAgICAgICBvYmpDdHIgPSBPYmplY3QsXG5cdCAgICAgICAgICBzdHJUcmltID0gU3RyaW5nW3Byb3RvUHJvcF0udHJpbSB8fCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgXCJcIik7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBhcnJJbmRleE9mID0gQXJyYXlbcHJvdG9Qcm9wXS5pbmRleE9mIHx8IGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICAgICAgdmFyIGkgPSAwLFxuXHQgICAgICAgICAgICBsZW4gPSB0aGlzLmxlbmd0aDtcblx0ICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICBpZiAoaSBpbiB0aGlzICYmIHRoaXNbaV0gPT09IGl0ZW0pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgfVxuXHQgICAgICAvLyBWZW5kb3JzOiBwbGVhc2UgYWxsb3cgY29udGVudCBjb2RlIHRvIGluc3RhbnRpYXRlIERPTUV4Y2VwdGlvbnNcblx0ICAgICAgLFxuXHQgICAgICAgICAgRE9NRXggPSBmdW5jdGlvbiBET01FeCh0eXBlLCBtZXNzYWdlKSB7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gdHlwZTtcblx0ICAgICAgICB0aGlzLmNvZGUgPSBET01FeGNlcHRpb25bdHlwZV07XG5cdCAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0ICAgICAgfSxcblx0ICAgICAgICAgIGNoZWNrVG9rZW5BbmRHZXRJbmRleCA9IGZ1bmN0aW9uIGNoZWNrVG9rZW5BbmRHZXRJbmRleChjbGFzc0xpc3QsIHRva2VuKSB7XG5cdCAgICAgICAgaWYgKHRva2VuID09PSBcIlwiKSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXCJTWU5UQVhfRVJSXCIsIFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkXCIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoL1xccy8udGVzdCh0b2tlbikpIHtcblx0ICAgICAgICAgIHRocm93IG5ldyBET01FeChcIklOVkFMSURfQ0hBUkFDVEVSX0VSUlwiLCBcIlN0cmluZyBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3RlclwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGFyckluZGV4T2YuY2FsbChjbGFzc0xpc3QsIHRva2VuKTtcblx0ICAgICAgfSxcblx0ICAgICAgICAgIENsYXNzTGlzdCA9IGZ1bmN0aW9uIENsYXNzTGlzdChlbGVtKSB7XG5cdCAgICAgICAgdmFyIHRyaW1tZWRDbGFzc2VzID0gc3RyVHJpbS5jYWxsKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiksXG5cdCAgICAgICAgICAgIGNsYXNzZXMgPSB0cmltbWVkQ2xhc3NlcyA/IHRyaW1tZWRDbGFzc2VzLnNwbGl0KC9cXHMrLykgOiBbXSxcblx0ICAgICAgICAgICAgaSA9IDAsXG5cdCAgICAgICAgICAgIGxlbiA9IGNsYXNzZXMubGVuZ3RoO1xuXHQgICAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgIHRoaXMucHVzaChjbGFzc2VzW2ldKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLnRvU3RyaW5nKCkpO1xuXHQgICAgICAgIH07XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBjbGFzc0xpc3RQcm90byA9IENsYXNzTGlzdFtwcm90b1Byb3BdID0gW10sXG5cdCAgICAgICAgICBjbGFzc0xpc3RHZXR0ZXIgPSBmdW5jdGlvbiBjbGFzc0xpc3RHZXR0ZXIoKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0xpc3QodGhpcyk7XG5cdCAgICAgIH07XG5cdCAgICAgIC8vIE1vc3QgRE9NRXhjZXB0aW9uIGltcGxlbWVudGF0aW9ucyBkb24ndCBhbGxvdyBjYWxsaW5nIERPTUV4Y2VwdGlvbidzIHRvU3RyaW5nKClcblx0ICAgICAgLy8gb24gbm9uLURPTUV4Y2VwdGlvbnMuIEVycm9yJ3MgdG9TdHJpbmcoKSBpcyBzdWZmaWNpZW50IGhlcmUuXG5cdCAgICAgIERPTUV4W3Byb3RvUHJvcF0gPSBFcnJvcltwcm90b1Byb3BdO1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5pdGVtID0gZnVuY3Rpb24gKGkpIHtcblx0ICAgICAgICByZXR1cm4gdGhpc1tpXSB8fCBudWxsO1xuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5jb250YWlucyA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIHRva2VuICs9IFwiXCI7XG5cdCAgICAgICAgcmV0dXJuIGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbikgIT09IC0xO1xuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5hZGQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHRva2VucyA9IGFyZ3VtZW50cyxcblx0ICAgICAgICAgICAgaSA9IDAsXG5cdCAgICAgICAgICAgIGwgPSB0b2tlbnMubGVuZ3RoLFxuXHQgICAgICAgICAgICB0b2tlbixcblx0ICAgICAgICAgICAgdXBkYXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIGRvIHtcblx0ICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcblx0ICAgICAgICAgIGlmIChjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pID09PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IHdoaWxlICgrK2kgPCBsKTtcblx0XG5cdCAgICAgICAgaWYgKHVwZGF0ZWQpIHtcblx0ICAgICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbnMgPSBhcmd1bWVudHMsXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsID0gdG9rZW5zLmxlbmd0aCxcblx0ICAgICAgICAgICAgdG9rZW4sXG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcblx0ICAgICAgICAgICAgaW5kZXg7XG5cdCAgICAgICAgZG8ge1xuXHQgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV0gKyBcIlwiO1xuXHQgICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgd2hpbGUgKGluZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLnNwbGljZShpbmRleCwgMSk7XG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSB3aGlsZSAoKytpIDwgbCk7XG5cdFxuXHQgICAgICAgIGlmICh1cGRhdGVkKSB7XG5cdCAgICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIGNsYXNzTGlzdFByb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uICh0b2tlbiwgZm9yY2UpIHtcblx0ICAgICAgICB0b2tlbiArPSBcIlwiO1xuXHRcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jb250YWlucyh0b2tlbiksXG5cdCAgICAgICAgICAgIG1ldGhvZCA9IHJlc3VsdCA/IGZvcmNlICE9PSB0cnVlICYmIFwicmVtb3ZlXCIgOiBmb3JjZSAhPT0gZmFsc2UgJiYgXCJhZGRcIjtcblx0XG5cdCAgICAgICAgaWYgKG1ldGhvZCkge1xuXHQgICAgICAgICAgdGhpc1ttZXRob2RdKHRva2VuKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIGlmIChmb3JjZSA9PT0gdHJ1ZSB8fCBmb3JjZSA9PT0gZmFsc2UpIHtcblx0ICAgICAgICAgIHJldHVybiBmb3JjZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5qb2luKFwiIFwiKTtcblx0ICAgICAgfTtcblx0XG5cdCAgICAgIGlmIChvYmpDdHIuZGVmaW5lUHJvcGVydHkpIHtcblx0ICAgICAgICB2YXIgY2xhc3NMaXN0UHJvcERlc2MgPSB7XG5cdCAgICAgICAgICBnZXQ6IGNsYXNzTGlzdEdldHRlcixcblx0ICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBvYmpDdHIuZGVmaW5lUHJvcGVydHkoZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyk7XG5cdCAgICAgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgICAgIC8vIElFIDggZG9lc24ndCBzdXBwb3J0IGVudW1lcmFibGU6dHJ1ZVxuXHQgICAgICAgICAgaWYgKGV4Lm51bWJlciA9PT0gLTB4N0ZGNUVDNTQpIHtcblx0ICAgICAgICAgICAgY2xhc3NMaXN0UHJvcERlc2MuZW51bWVyYWJsZSA9IGZhbHNlO1xuXHQgICAgICAgICAgICBvYmpDdHIuZGVmaW5lUHJvcGVydHkoZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2UgaWYgKG9iakN0cltwcm90b1Byb3BdLl9fZGVmaW5lR2V0dGVyX18pIHtcblx0ICAgICAgICBlbGVtQ3RyUHJvdG8uX19kZWZpbmVHZXR0ZXJfXyhjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RHZXR0ZXIpO1xuXHQgICAgICB9XG5cdCAgICB9KShzZWxmKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgLy8gVGhlcmUgaXMgZnVsbCBvciBwYXJ0aWFsIG5hdGl2ZSBjbGFzc0xpc3Qgc3VwcG9ydCwgc28ganVzdCBjaGVjayBpZiB3ZSBuZWVkXG5cdCAgICAvLyB0byBub3JtYWxpemUgdGhlIGFkZC9yZW1vdmUgYW5kIHRvZ2dsZSBBUElzLlxuXHRcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgIFwidXNlIHN0cmljdFwiO1xuXHRcblx0ICAgICAgdmFyIHRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIl9cIik7XG5cdFxuXHQgICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYzFcIiwgXCJjMlwiKTtcblx0XG5cdCAgICAgIC8vIFBvbHlmaWxsIGZvciBJRSAxMC8xMSBhbmQgRmlyZWZveCA8MjYsIHdoZXJlIGNsYXNzTGlzdC5hZGQgYW5kXG5cdCAgICAgIC8vIGNsYXNzTGlzdC5yZW1vdmUgZXhpc3QgYnV0IHN1cHBvcnQgb25seSBvbmUgYXJndW1lbnQgYXQgYSB0aW1lLlxuXHQgICAgICBpZiAoIXRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImMyXCIpKSB7XG5cdCAgICAgICAgdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZChtZXRob2QpIHtcblx0ICAgICAgICAgIHZhciBvcmlnaW5hbCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGVbbWV0aG9kXTtcblx0XG5cdCAgICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgdmFyIGksXG5cdCAgICAgICAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcblx0ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgdG9rZW4gPSBhcmd1bWVudHNbaV07XG5cdCAgICAgICAgICAgICAgb3JpZ2luYWwuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBjcmVhdGVNZXRob2QoJ2FkZCcpO1xuXHQgICAgICAgIGNyZWF0ZU1ldGhvZCgncmVtb3ZlJyk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHRlc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoXCJjM1wiLCBmYWxzZSk7XG5cdFxuXHQgICAgICAvLyBQb2x5ZmlsbCBmb3IgSUUgMTAgYW5kIEZpcmVmb3ggPDI0LCB3aGVyZSBjbGFzc0xpc3QudG9nZ2xlIGRvZXMgbm90XG5cdCAgICAgIC8vIHN1cHBvcnQgdGhlIHNlY29uZCBhcmd1bWVudC5cblx0ICAgICAgaWYgKHRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImMzXCIpKSB7XG5cdCAgICAgICAgdmFyIF90b2dnbGUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZTtcblx0XG5cdCAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4sIGZvcmNlKSB7XG5cdCAgICAgICAgICBpZiAoMSBpbiBhcmd1bWVudHMgJiYgIXRoaXMuY29udGFpbnModG9rZW4pID09PSAhZm9yY2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZvcmNlO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIF90b2dnbGUuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdGVzdEVsZW1lbnQgPSBudWxsO1xuXHQgICAgfSkoKTtcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0ZXhwb3J0cy5nZXRKU09OID0gZ2V0SlNPTjtcblx0ZXhwb3J0cy5nZXRTY3JvbGxCYXJXaWR0aCA9IGdldFNjcm9sbEJhcldpZHRoO1xuXHRleHBvcnRzLnRyYW5zbGF0aW9ucyA9IHRyYW5zbGF0aW9ucztcblx0ZXhwb3J0cy5kZWxheWVyID0gZGVsYXllcjtcblx0ZXhwb3J0cy5WdWVGaXhlciA9IFZ1ZUZpeGVyO1xuXHQvLyBjb2VyY2UgY29udmVydCBzb20gdHlwZXMgb2YgZGF0YSBpbnRvIGFub3RoZXIgdHlwZVxuXHR2YXIgY29lcmNlID0gZXhwb3J0cy5jb2VyY2UgPSB7XG5cdCAgLy8gQ29udmVydCBhIHN0cmluZyB0byBib29sZWFtLiBPdGhlcndpc2UsIHJldHVybiB0aGUgdmFsdWUgd2l0aG91dCBtb2RpZmljYXRpb24sIHNvIGlmIGlzIG5vdCBib29sZWFuLCBWdWUgdGhyb3cgYSB3YXJuaW5nLlxuXHQgIGJvb2xlYW46IGZ1bmN0aW9uIGJvb2xlYW4odmFsKSB7XG5cdCAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwgPT09ICcnIHx8IHZhbCA9PT0gJ3RydWUnID8gdHJ1ZSA6IHZhbCA9PT0gJ2ZhbHNlJyB8fCB2YWwgPT09ICdudWxsJyB8fCB2YWwgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiB2YWwgOiB2YWw7XG5cdCAgfSxcblx0ICAvLyBBdHRlbXB0IHRvIGNvbnZlcnQgYSBzdHJpbmcgdmFsdWUgdG8gYSBOdW1iZXIuIE90aGVyd2lzZSwgcmV0dXJuIDAuXG5cdCAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsKSB7XG5cdCAgICB2YXIgYWx0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuXHQgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInID8gdmFsIDogdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsIHx8IGlzTmFOKE51bWJlcih2YWwpKSA/IGFsdCA6IE51bWJlcih2YWwpO1xuXHQgIH0sXG5cdCAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IHRvIHN0cmluZyBhbnkgdmFsdWUsIGV4Y2VwdCBmb3IgbnVsbCBvciB1bmRlZmluZWQuXG5cdCAgc3RyaW5nOiBmdW5jdGlvbiBzdHJpbmcodmFsKSB7XG5cdCAgICByZXR1cm4gdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsID8gJycgOiB2YWwgKyAnJztcblx0ICB9LFxuXHQgIC8vIFBhdHRlcm4gYWNjZXB0IFJlZ0V4cCwgZnVuY3Rpb24sIG9yIHN0cmluZyAoY29udmVydGVkIHRvIFJlZ0V4cCkuIE90aGVyd2lzZSByZXR1cm4gbnVsbC5cblx0ICBwYXR0ZXJuOiBmdW5jdGlvbiBwYXR0ZXJuKHZhbCkge1xuXHQgICAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IHZhbCBpbnN0YW5jZW9mIFJlZ0V4cCA/IHZhbCA6IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gbmV3IFJlZ0V4cCh2YWwpIDogbnVsbDtcblx0ICB9XG5cdH07XG5cdFxuXHRmdW5jdGlvbiBnZXRKU09OKHVybCkge1xuXHQgIHZhciByZXF1ZXN0ID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHQgIHZhciBkYXRhID0ge307XG5cdCAgLy8gcCAoLXNpbXVsYXRlZC0gcHJvbWlzZSlcblx0ICB2YXIgcCA9IHtcblx0ICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4oZm4xLCBmbjIpIHtcblx0ICAgICAgcmV0dXJuIHAuZG9uZShmbjEpLmZhaWwoZm4yKTtcblx0ICAgIH0sXG5cdCAgICBjYXRjaDogZnVuY3Rpb24gX2NhdGNoKGZuKSB7XG5cdCAgICAgIHJldHVybiBwLmZhaWwoZm4pO1xuXHQgICAgfSxcblx0ICAgIGFsd2F5czogZnVuY3Rpb24gYWx3YXlzKGZuKSB7XG5cdCAgICAgIHJldHVybiBwLmRvbmUoZm4pLmZhaWwoZm4pO1xuXHQgICAgfVxuXHQgIH07XG5cdCAgWydkb25lJywgJ2ZhaWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICBkYXRhW25hbWVdID0gW107XG5cdCAgICBwW25hbWVdID0gZnVuY3Rpb24gKGZuKSB7XG5cdCAgICAgIGlmIChmbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSBkYXRhW25hbWVdLnB1c2goZm4pO1xuXHQgICAgICByZXR1cm4gcDtcblx0ICAgIH07XG5cdCAgfSk7XG5cdCAgcC5kb25lKEpTT04ucGFyc2UpO1xuXHQgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSA9PT0gNCkge1xuXHQgICAgICB2YXIgcmVzcG9uc2U7XG5cdCAgICAgIHZhciBpO1xuXHQgICAgICB2YXIgdmFsdWU7XG5cdFxuXHQgICAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBlID0geyBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzIH07XG5cdCAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0ICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIHJlc3BvbnNlID0gcmVxdWVzdC5yZXNwb25zZVRleHQ7XG5cdFxuXHQgICAgICAgICAgICBmb3IgKGkgaW4gZGF0YS5kb25lKSB7XG5cdCAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhLmRvbmVbaV0ocmVzcG9uc2UpO1xuXHRcblx0ICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB2YWx1ZTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICBkYXRhLmZhaWwuZm9yRWFjaChmdW5jdGlvbiAoZmFpbCkge1xuXHQgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBkYXRhLmZhaWwuZm9yRWFjaChmdW5jdGlvbiAoZmFpbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbChlKTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSkoKTtcblx0ICAgIH1cblx0ICB9O1xuXHQgIHJlcXVlc3Qub3BlbignR0VUJywgdXJsKTtcblx0ICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG5cdCAgcmVxdWVzdC5zZW5kKCk7XG5cdCAgcmV0dXJuIHA7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGdldFNjcm9sbEJhcldpZHRoKCkge1xuXHQgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IDw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpIHtcblx0ICAgIHJldHVybiAwO1xuXHQgIH1cblx0ICB2YXIgaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cdCAgaW5uZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG5cdCAgaW5uZXIuc3R5bGUuaGVpZ2h0ID0gJzIwMHB4Jztcblx0XG5cdCAgdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdCAgb3V0ZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHQgIG91dGVyLnN0eWxlLnRvcCA9ICcwcHgnO1xuXHQgIG91dGVyLnN0eWxlLmxlZnQgPSAnMHB4Jztcblx0ICBvdXRlci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cdCAgb3V0ZXIuc3R5bGUud2lkdGggPSAnMjAwcHgnO1xuXHQgIG91dGVyLnN0eWxlLmhlaWdodCA9ICcxNTBweCc7XG5cdCAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblx0ICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7XG5cdFxuXHQgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpO1xuXHQgIHZhciB3MSA9IGlubmVyLm9mZnNldFdpZHRoO1xuXHQgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG5cdCAgdmFyIHcyID0gaW5uZXIub2Zmc2V0V2lkdGg7XG5cdCAgaWYgKHcxID09PSB3MikgdzIgPSBvdXRlci5jbGllbnRXaWR0aDtcblx0XG5cdCAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChvdXRlcik7XG5cdFxuXHQgIHJldHVybiB3MSAtIHcyO1xuXHR9XG5cdFxuXHQvLyByZXR1cm4gYWxsIHRoZSB0cmFuc2xhdGlvbnMgb3IgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgKGVuZ2xpc2gpXG5cdGZ1bmN0aW9uIHRyYW5zbGF0aW9ucygpIHtcblx0ICB2YXIgbGFuZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2VuJztcblx0XG5cdCAgdmFyIHRleHQgPSB7XG5cdCAgICBkYXlzT2ZXZWVrOiBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10sXG5cdCAgICBsaW1pdDogJ0xpbWl0IHJlYWNoZWQgKHt7bGltaXR9fSBpdGVtcyBtYXgpLicsXG5cdCAgICBsb2FkaW5nOiAnTG9hZGluZy4uLicsXG5cdCAgICBtaW5MZW5ndGg6ICdNaW4uIExlbmd0aCcsXG5cdCAgICBtb250aHM6IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddLFxuXHQgICAgbm90U2VsZWN0ZWQ6ICdOb3RoaW5nIFNlbGVjdGVkJyxcblx0ICAgIHJlcXVpcmVkOiAnUmVxdWlyZWQnLFxuXHQgICAgc2VhcmNoOiAnU2VhcmNoJyxcblx0ICAgIHNlbGVjdGVkOiAne3tjb3VudH19IHNlbGVjdGVkJ1xuXHQgIH07XG5cdCAgcmV0dXJuIHdpbmRvdy5WdWVTdHJhcExhbmcgPyB3aW5kb3cuVnVlU3RyYXBMYW5nKGxhbmcpIDogdGV4dDtcblx0fVxuXHRcblx0Ly8gZGVsYXllcjogc2V0IGEgZnVuY3Rpb24gdGhhdCBleGVjdXRlIGFmdGVyIGEgZGVsYXlcblx0Ly8gQHBhcmFtcyAoZnVuY3Rpb24sIGRlbGF5X3Byb3Agb3IgdmFsdWUsIGRlZmF1bHRfdmFsdWUpXG5cdGZ1bmN0aW9uIGRlbGF5ZXIoZm4sIHZhclRpbWVyKSB7XG5cdCAgdmFyIGlmTmFOID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxMDA7XG5cdFxuXHQgIGZ1bmN0aW9uIHRvSW50KGVsKSB7XG5cdCAgICByZXR1cm4gKC9eWzAtOV0rJC8udGVzdChlbCkgPyBOdW1iZXIoZWwpIHx8IDEgOiBudWxsXG5cdCAgICApO1xuXHQgIH1cblx0ICB2YXIgdGltZXJJZDtcblx0ICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuXHQgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuXHQgICAgfVxuXHRcblx0ICAgIGlmICh0aW1lcklkKSBjbGVhclRpbWVvdXQodGltZXJJZCk7XG5cdCAgICB0aW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGZuLmFwcGx5KF90aGlzLCBhcmdzKTtcblx0ICAgIH0sIHRvSW50KHZhclRpbWVyKSB8fCB0b0ludCh0aGlzW3ZhclRpbWVyXSkgfHwgaWZOYU4pO1xuXHQgIH07XG5cdH1cblx0XG5cdC8vIEZpeCBhIHZ1ZSBpbnN0YW5jZSBMaWZlY3ljbGUgdG8gdnVlIDEvMiAoanVzdCB0aGUgYmFzaWMgZWxlbWVudHMsIGlzIG5vdCBhIHJlYWwgcGFyc2VyLCBzbyB0aGlzIHdvcmsgb25seSBpZiB5b3VyIGNvZGUgaXMgY29tcGF0aWJsZSB3aXRoIGJvdGgpXG5cdC8vIChXYWl0aW5nIGZvciB0ZXN0aW5nKVxuXHRmdW5jdGlvbiBWdWVGaXhlcih2dWUpIHtcblx0ICB2YXIgdnVlMiA9ICF3aW5kb3cuVnVlIHx8ICF3aW5kb3cuVnVlLnBhcnRpYWw7XG5cdCAgdmFyIG1peGluID0ge1xuXHQgICAgY29tcHV0ZWQ6IHtcblx0ICAgICAgdnVlMjogZnVuY3Rpb24gdnVlMigpIHtcblx0ICAgICAgICByZXR1cm4gIXRoaXMuJGRpc3BhdGNoO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfTtcblx0ICBpZiAoIXZ1ZTIpIHtcblx0ICAgIC8vdHJhbnNsYXRlIHZ1ZTIgYXR0cmlidXRlcyB0byB2dWUxXG5cdCAgICBpZiAodnVlLmJlZm9yZUNyZWF0ZSkge1xuXHQgICAgICBtaXhpbi5jcmVhdGUgPSB2dWUuYmVmb3JlQ3JlYXRlO1xuXHQgICAgICBkZWxldGUgdnVlLmJlZm9yZUNyZWF0ZTtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUuYmVmb3JlTW91bnQpIHtcblx0ICAgICAgdnVlLmJlZm9yZUNvbXBpbGUgPSB2dWUuYmVmb3JlTW91bnQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUuYmVmb3JlTW91bnQ7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLm1vdW50ZWQpIHtcblx0ICAgICAgdnVlLnJlYWR5ID0gdnVlLm1vdW50ZWQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUubW91bnRlZDtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgLy90cmFuc2xhdGUgdnVlMSBhdHRyaWJ1dGVzIHRvIHZ1ZTJcblx0ICAgIGlmICh2dWUuYmVmb3JlQ29tcGlsZSkge1xuXHQgICAgICB2dWUuYmVmb3JlTW91bnQgPSB2dWUuYmVmb3JlQ29tcGlsZTtcblx0ICAgICAgZGVsZXRlIHZ1ZS5iZWZvcmVDb21waWxlO1xuXHQgICAgfVxuXHQgICAgaWYgKHZ1ZS5jb21waWxlZCkge1xuXHQgICAgICBtaXhpbi5jb21waWxlZCA9IHZ1ZS5jb21waWxlZDtcblx0ICAgICAgZGVsZXRlIHZ1ZS5jb21waWxlZDtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUucmVhZHkpIHtcblx0ICAgICAgdnVlLm1vdW50ZWQgPSB2dWUucmVhZHk7XG5cdCAgICAgIGRlbGV0ZSB2dWUucmVhZHk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGlmICghdnVlLm1peGlucykge1xuXHQgICAgdnVlLm1peGlucyA9IFtdO1xuXHQgIH1cblx0ICB2dWUubWl4aW5zLnVuc2hpZnQobWl4aW4pO1xuXHQgIHJldHVybiB2dWU7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24ocHJvY2Vzcykgeyd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvKipcclxuXHQgKiBDbGljayBvdXRzaWRlIGRpcmVjdGl2ZVxyXG5cdCAqL1xuXHR2YXIgYmluZGVkID0gW107XG5cdFxuXHRmdW5jdGlvbiBoYW5kbGVyKGUpIHtcblx0ICBiaW5kZWQuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgIGlmICghZWwubm9kZS5jb250YWlucyhlLnRhcmdldCkpIGVsLmNhbGxiYWNrKGUpO1xuXHQgIH0pO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBhZGRMaXN0ZW5lcihub2RlLCBjYWxsYmFjaykge1xuXHQgIGlmICghYmluZGVkLmxlbmd0aCkgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG5cdCAgYmluZGVkLnB1c2goeyBub2RlOiBub2RlLCBjYWxsYmFjazogY2FsbGJhY2sgfSk7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGNhbGxiYWNrKSB7XG5cdCAgYmluZGVkID0gYmluZGVkLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgIHJldHVybiBlbC5ub2RlICE9PSBub2RlID8gdHJ1ZSA6ICFjYWxsYmFjayA/IGZhbHNlIDogZWwuY2FsbGJhY2sgIT09IGNhbGxiYWNrO1xuXHQgIH0pO1xuXHQgIGlmICghYmluZGVkLmxlbmd0aCkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG5cdH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBiaW5kOiBmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICBpZiAodHlwZW9mIGJpbmRpbmcudmFsdWUgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcblx0ICAgICAgICBWdWUudXRpbC53YXJuKCdDbGlja091dHNpZGUgb25seSB3b3JrIHdpdGggYSBmdW5jdGlvbiwgcmVjZWl2ZWQ6IHYtJyArIGJpbmRpbmcubmFtZSArICc9XCInICsgYmluZGluZy5leHByZXNzaW9uICsgJ1wiJyk7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGFkZExpc3RlbmVyKGVsLCBiaW5kaW5nLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGVsLCBiaW5kaW5nKSB7XG5cdCAgICBpZiAoYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSkge1xuXHQgICAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy5vbGRWYWx1ZSk7XG5cdCAgICAgIGFkZExpc3RlbmVyKGVsLCBiaW5kaW5nLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgfVxuXHR9O1xuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg2NykpKVxuXG4vKioqLyB9LFxuLyogNjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXHR2YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cdFxuXHQvLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcblx0Ly8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG5cdC8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcblx0Ly8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblx0XG5cdHZhciBjYWNoZWRTZXRUaW1lb3V0O1xuXHR2YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXHRcblx0ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xuXHR9XG5cdGZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcblx0fVxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHQgICAgfVxuXHQgICAgdHJ5IHtcblx0ICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcblx0ICAgICAgICB9XG5cdCAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcblx0ICAgIH1cblx0fSAoKSlcblx0ZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcblx0ICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG5cdCAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG5cdCAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH1cblx0ICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG5cdCAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcblx0ICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcblx0ICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuXHQgICAgfVxuXHQgICAgdHJ5IHtcblx0ICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG5cdCAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH0gY2F0Y2goZSl7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcblx0ICAgICAgICB9IGNhdGNoKGUpe1xuXHQgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHRcblx0XG5cdH1cblx0ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuXHQgICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG5cdCAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG5cdCAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuXHQgICAgfVxuXHQgICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXHQgICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG5cdCAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH0gY2F0Y2ggKGUpe1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG5cdCAgICAgICAgfSBjYXRjaCAoZSl7XG5cdCAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuXHQgICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0XG5cdFxuXHRcblx0fVxuXHR2YXIgcXVldWUgPSBbXTtcblx0dmFyIGRyYWluaW5nID0gZmFsc2U7XG5cdHZhciBjdXJyZW50UXVldWU7XG5cdHZhciBxdWV1ZUluZGV4ID0gLTE7XG5cdFxuXHRmdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG5cdCAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBkcmFpbmluZyA9IGZhbHNlO1xuXHQgICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcblx0ICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG5cdCAgICB9XG5cdCAgICBpZiAocXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgZHJhaW5RdWV1ZSgpO1xuXHQgICAgfVxuXHR9XG5cdFxuXHRmdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuXHQgICAgaWYgKGRyYWluaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG5cdCAgICBkcmFpbmluZyA9IHRydWU7XG5cdFxuXHQgICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICAgIHdoaWxlKGxlbikge1xuXHQgICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuXHQgICAgICAgIHF1ZXVlID0gW107XG5cdCAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuXHQgICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICAgIH1cblx0ICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG5cdCAgICBkcmFpbmluZyA9IGZhbHNlO1xuXHQgICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHR9XG5cdFxuXHRwcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuXHQgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuXHQgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcblx0ICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG5cdCAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcblx0ICAgIH1cblx0fTtcblx0XG5cdC8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcblx0ZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG5cdCAgICB0aGlzLmZ1biA9IGZ1bjtcblx0ICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcblx0fVxuXHRJdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcblx0fTtcblx0cHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcblx0cHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcblx0cHJvY2Vzcy5lbnYgPSB7fTtcblx0cHJvY2Vzcy5hcmd2ID0gW107XG5cdHByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xuXHRwcm9jZXNzLnZlcnNpb25zID0ge307XG5cdFxuXHRmdW5jdGlvbiBub29wKCkge31cblx0XG5cdHByb2Nlc3Mub24gPSBub29wO1xuXHRwcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcblx0cHJvY2Vzcy5vbmNlID0gbm9vcDtcblx0cHJvY2Vzcy5vZmYgPSBub29wO1xuXHRwcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xuXHRwcm9jZXNzLmVtaXQgPSBub29wO1xuXHRcblx0cHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0XG5cdHByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5cdHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuXHR9O1xuXHRwcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cbi8qKiovIH0sXG4vKiA2OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKHByb2Nlc3MpIHsndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0LyoqXHJcblx0ICogQ2xpY2sgb3V0c2lkZSBkaXJlY3RpdmVcclxuXHQgKi9cblx0dmFyIEhBTkRMRVIgPSAnX3Z1ZV9zY3JvbGxfaGFuZGxlcic7XG5cdHZhciBldmVudHMgPSBbJ3Jlc2l6ZScsICdzY3JvbGwnXTtcblx0XG5cdGZ1bmN0aW9uIGJpbmQoZWwsIGJpbmRpbmcpIHtcblx0ICB1bmJpbmQoZWwpO1xuXHRcblx0ICB2YXIgY2FsbGJhY2sgPSBiaW5kaW5nLnZhbHVlO1xuXHQgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG5cdCAgICAgIFZ1ZS51dGlsLndhcm4oJ0NsaWNrT3V0c2lkZSBvbmx5IHdvcmsgd2l0aCBhIGZ1bmN0aW9uIHZhbHVlLCByZWNlaXZlZDogdi0nICsgYmluZGluZy5uYW1lICsgJz1cIicgKyBiaW5kaW5nLmV4cHJlc3Npb24gKyAnXCInKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgZWxbSEFORExFUl0gPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBjYWxsYmFjayhlKTtcblx0ICAgIH07XG5cdCAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuXHQgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihlLCBlbFtIQU5ETEVSXSwgZmFsc2UpO1xuXHQgICAgfSk7XG5cdCAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICBlbFtIQU5ETEVSXSgpO1xuXHQgICAgfSwgMCk7XG5cdCAgfVxuXHR9XG5cdFxuXHRmdW5jdGlvbiB1bmJpbmQoZWwpIHtcblx0ICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICB9KTtcblx0ICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICBkZWxldGUgZWxbSEFORExFUl07XG5cdH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBiaW5kOiBiaW5kLFxuXHQgIHVuYmluZDogdW5iaW5kLFxuXHQgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGVsLCBiaW5kaW5nKSB7XG5cdCAgICBpZiAoYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSkgYmluZChlbCwgYmluZGluZyk7XG5cdCAgfVxuXHR9O1xuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg2NykpKVxuXG4vKioqLyB9LFxuLyogNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzEpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQWNjb3JkaW9uLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1kNGI3NWE5MlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtZDRiNzVhOTJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBY2NvcmRpb24udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB0eXBlOiB7XG5cdCAgICAgIHR5cGU6IFN0cmluZyxcblx0ICAgICAgZGVmYXVsdDogbnVsbFxuXHQgICAgfSxcblx0ICAgIG9uZUF0QXRpbWU6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogZmFsc2Vcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIG9wZW5DaGlsZDogZnVuY3Rpb24gb3BlbkNoaWxkKGNoaWxkKSB7XG5cdCAgICAgIGlmICh0aGlzLm9uZUF0QXRpbWUpIHtcblx0ICAgICAgICB0aGlzLiRjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICAgICAgICBpZiAoY2hpbGQgIT09IGl0ZW0pIHtcblx0ICAgICAgICAgICAgaXRlbS5vcGVuID0gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9pc0FjY29yZGlvbiA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtZDRiNzVhOTJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA3MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Mylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxBZmZpeC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNWViZGRlYmZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTVlYmRkZWJmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWZmaXgudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9TY3JvbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4KTtcblx0XG5cdHZhciBfU2Nyb2xsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Njcm9sbCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIFNjcm9sbDogX1Njcm9sbDIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIG9mZnNldDoge1xuXHQgICAgICB0eXBlOiBOdW1iZXIsXG5cdCAgICAgIGRlZmF1bHQ6IDBcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhZmZpeGVkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdG9wOiBmdW5jdGlvbiB0b3AoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm9mZnNldCA+IDAgPyB0aGlzLm9mZnNldCArICdweCcgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvYWZmaXgvaW5kZXguanN4I0wyMFxuXHQgICAgY2hlY2tTY3JvbGw6IGZ1bmN0aW9uIGNoZWNrU2Nyb2xsKCkge1xuXHQgICAgICAvLyBpZiBpcyBoaWRkZW4gZG9uJ3QgY2FsY3VsYXRlIGFueXRoaW5nXG5cdCAgICAgIGlmICghKHRoaXMuJGVsLm9mZnNldFdpZHRoIHx8IHRoaXMuJGVsLm9mZnNldEhlaWdodCB8fCB0aGlzLiRlbC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgLy8gZ2V0IHdpbmRvdyBzY3JvbGwgYW5kIGVsZW1lbnQgcG9zaXRpb24gdG8gZGV0ZWN0IGlmIGhhdmUgdG8gYmUgbm9ybWFsIG9yIGFmZml4ZWRcblx0ICAgICAgdmFyIHNjcm9sbCA9IHt9O1xuXHQgICAgICB2YXIgZWxlbWVudCA9IHt9O1xuXHQgICAgICB2YXIgcmVjdCA9IHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBfYXJyID0gWydUb3AnLCAnTGVmdCddO1xuXHQgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcblx0ICAgICAgICB2YXIgdHlwZSA9IF9hcnJbX2ldO1xuXHQgICAgICAgIHZhciB0ID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgIHZhciByZXQgPSB3aW5kb3dbJ3BhZ2UnICsgKHR5cGUgPT09ICdUb3AnID8gJ1knIDogJ1gnKSArICdPZmZzZXQnXTtcblx0ICAgICAgICB2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyB0eXBlO1xuXHQgICAgICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgICAgLy8gaWU2LDcsOCBzdGFuZGFyZCBtb2RlXG5cdCAgICAgICAgICByZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbbWV0aG9kXTtcblx0ICAgICAgICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgICAgICAvLyBxdWlya3MgbW9kZVxuXHQgICAgICAgICAgICByZXQgPSBkb2N1bWVudC5ib2R5W21ldGhvZF07XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHNjcm9sbFt0XSA9IHJldDtcblx0ICAgICAgICBlbGVtZW50W3RdID0gc2Nyb2xsW3RdICsgcmVjdFt0XSAtICh0aGlzLiRlbFsnY2xpZW50JyArIHR5cGVdIHx8IGJvZHlbJ2NsaWVudCcgKyB0eXBlXSB8fCAwKTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZml4ID0gc2Nyb2xsLnRvcCA+IGVsZW1lbnQudG9wIC0gdGhpcy5vZmZzZXQ7XG5cdCAgICAgIGlmICh0aGlzLmFmZml4ZWQgIT09IGZpeCkge1xuXHQgICAgICAgIHRoaXMuYWZmaXhlZCA9IGZpeDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhpZGRlbi1wcmludCBoaWRkZW4teHMgaGlkZGVuLXNtXCJcblx0ICB9LCBbX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNjcm9sbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2Nyb2xsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNoZWNrU2Nyb2xsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjaGVja1Njcm9sbFwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLWRvY3Mtc2lkZWJhclwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgYWZmaXg6IF92bS5hZmZpeGVkXG5cdCAgICB9LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIG1hcmdpblRvcDogX3ZtLnRvcFxuXHQgICAgfSlcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNWViZGRlYmZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA3NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg3Nilcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFsZXJ0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1hZjdjMWY2YVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYWY3YzFmNmFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBbGVydC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiA3NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNzcpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWFmN2MxZjZhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9BbGVydC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWFmN2MxZjZhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9BbGVydC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA3NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZmFkZS1lbnRlci1hY3RpdmUsXFxyXFxuLmZhZGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxufVxcbi5mYWRlLWVudGVyLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBoZWlnaHQ6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcbn1cXG4uYWxlcnQudG9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMzBweDtcXHJcXG4gIG1hcmdpbjogMCBhdXRvO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMTA1MDtcXG59XFxuLmFsZXJ0LnRvcC1yaWdodCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICByaWdodDogNTBweDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQWxlcnQudnVlPzcxYTkxYzFhXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFvREE7O0VBRUEsNkJBQUE7Q0FDQTtBQUNBOztFQUVBLFVBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLGVBQUE7RUFDQSxRQUFBO0VBQ0EsU0FBQTtFQUNBLGNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLGNBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQWxlcnQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDx0cmFuc2l0aW9uIG5hbWU9XFxcImZhZGVcXFwiPlxcclxcbiAgICA8ZGl2IHYtc2hvdz1cXFwidmFsXFxcIiA6Y2xhc3M9XFxcIlsnYWxlcnQnLCAnYWxlcnQtJyt0eXBlLCBwbGFjZW1lbnRdXFxcIiA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aH1cXFwiIHJvbGU9XFxcImFsZXJ0XFxcIj5cXHJcXG4gICAgICA8YnV0dG9uIHYtc2hvdz1cXFwiZGlzbWlzc2FibGVcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9IGZhbHNlXFxcIj5cXHJcXG4gICAgICAgIDxzcGFuPiZ0aW1lczs8L3NwYW4+XFxyXFxuICAgICAgPC9idXR0b24+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gIDwvdHJhbnNpdGlvbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuXFxyXFxudmFyIERVUkFUSU9OID0gMFxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc21pc3NhYmxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBkdXJhdGlvbjoge2RlZmF1bHQ6IERVUkFUSU9OfSxcXHJcXG4gICAgcGxhY2VtZW50OiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IFN0cmluZ31cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICB2YWw6IHRoaXMudmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGR1cmF0aW9uTnVtICgpIHsgcmV0dXJuIGNvZXJjZS5udW1iZXIodGhpcy5kdXJhdGlvbiwgRFVSQVRJT04pIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICB2YWwgKHZhbCkge1xcclxcbiAgICAgIGlmICh2YWwgJiYgdGhpcy5kdXJhdGlvbk51bSA+IDApIHsgdGhpcy5fZGVsYXlDbG9zZSgpIH1cXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XFxyXFxuICAgICAgICB0aGlzLnZhbCA9IHZhbFxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9kZWxheUNsb3NlID0gZGVsYXllcihmdW5jdGlvbiAoKSB7XFxyXFxuICAgICAgdGhpcy52YWwgPSBmYWxzZVxcclxcbiAgICB9LCAnZHVyYXRpb25OdW0nKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmZhZGUtZW50ZXItYWN0aXZlLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcyBlYXNlO1xcclxcbn1cXHJcXG4uZmFkZS1lbnRlcixcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgaGVpZ2h0OiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG59XFxyXFxuLmFsZXJ0LnRvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxyXFxufVxcclxcbi5hbGVydC50b3AtcmlnaHQge1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgcmlnaHQ6IDUwcHg7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogNzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXHJcblx0XHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5cdFx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxyXG5cdCovXHJcblx0Ly8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcclxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGxpc3QgPSBbXTtcclxuXHRcclxuXHRcdC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcclxuXHRcdGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcclxuXHRcdFx0dmFyIHJlc3VsdCA9IFtdO1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpdGVtID0gdGhpc1tpXTtcclxuXHRcdFx0XHRpZihpdGVtWzJdKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaChcIkBtZWRpYSBcIiArIGl0ZW1bMl0gKyBcIntcIiArIGl0ZW1bMV0gKyBcIn1cIik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1bMV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0LmpvaW4oXCJcIik7XHJcblx0XHR9O1xyXG5cdFxyXG5cdFx0Ly8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcclxuXHRcdGxpc3QuaSA9IGZ1bmN0aW9uKG1vZHVsZXMsIG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0aWYodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpXHJcblx0XHRcdFx0bW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgXCJcIl1dO1xyXG5cdFx0XHR2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpZCA9IHRoaXNbaV1bMF07XHJcblx0XHRcdFx0aWYodHlwZW9mIGlkID09PSBcIm51bWJlclwiKVxyXG5cdFx0XHRcdFx0YWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvcihpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaXRlbSA9IG1vZHVsZXNbaV07XHJcblx0XHRcdFx0Ly8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxyXG5cdFx0XHRcdC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IDEwMCUgcGVyZmVjdCBmb3Igd2VpcmQgbWVkaWEgcXVlcnkgY29tYmluYXRpb25zXHJcblx0XHRcdFx0Ly8gIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cclxuXHRcdFx0XHQvLyAgSSBob3BlIHRoaXMgd2lsbCBuZXZlciBvY2N1ciAoSGV5IHRoaXMgd2F5IHdlIGhhdmUgc21hbGxlciBidW5kbGVzKVxyXG5cdFx0XHRcdGlmKHR5cGVvZiBpdGVtWzBdICE9PSBcIm51bWJlclwiIHx8ICFhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XHJcblx0XHRcdFx0XHRpZihtZWRpYVF1ZXJ5ICYmICFpdGVtWzJdKSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmKG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0XHRcdFx0aXRlbVsyXSA9IFwiKFwiICsgaXRlbVsyXSArIFwiKSBhbmQgKFwiICsgbWVkaWFRdWVyeSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHRcdHJldHVybiBsaXN0O1xyXG5cdH07XHJcblxuXG4vKioqLyB9LFxuLyogNzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qXG5cdFx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcblx0XHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG5cdCovXG5cdHZhciBzdHlsZXNJbkRvbSA9IHt9LFxuXHRcdG1lbW9pemUgPSBmdW5jdGlvbihmbikge1xuXHRcdFx0dmFyIG1lbW87XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIG1lbW8gPT09IFwidW5kZWZpbmVkXCIpIG1lbW8gPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0XHRyZXR1cm4gbWVtbztcblx0XHRcdH07XG5cdFx0fSxcblx0XHRpc09sZElFID0gbWVtb2l6ZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiAvbXNpZSBbNi05XVxcYi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtcblx0XHR9KSxcblx0XHRnZXRIZWFkRWxlbWVudCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO1xuXHRcdH0pLFxuXHRcdHNpbmdsZXRvbkVsZW1lbnQgPSBudWxsLFxuXHRcdHNpbmdsZXRvbkNvdW50ZXIgPSAwLFxuXHRcdHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wID0gW107XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGxpc3QsIG9wdGlvbnMpIHtcblx0XHRpZihmYWxzZSkge1xuXHRcdFx0aWYodHlwZW9mIGRvY3VtZW50ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIik7XG5cdFx0fVxuXHRcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0XHQvLyBGb3JjZSBzaW5nbGUtdGFnIHNvbHV0aW9uIG9uIElFNi05LCB3aGljaCBoYXMgYSBoYXJkIGxpbWl0IG9uIHRoZSAjIG9mIDxzdHlsZT5cblx0XHQvLyB0YWdzIGl0IHdpbGwgYWxsb3cgb24gYSBwYWdlXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zLnNpbmdsZXRvbiA9PT0gXCJ1bmRlZmluZWRcIikgb3B0aW9ucy5zaW5nbGV0b24gPSBpc09sZElFKCk7XG5cdFxuXHRcdC8vIEJ5IGRlZmF1bHQsIGFkZCA8c3R5bGU+IHRhZ3MgdG8gdGhlIGJvdHRvbSBvZiA8aGVhZD4uXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zLmluc2VydEF0ID09PSBcInVuZGVmaW5lZFwiKSBvcHRpb25zLmluc2VydEF0ID0gXCJib3R0b21cIjtcblx0XG5cdFx0dmFyIHN0eWxlcyA9IGxpc3RUb1N0eWxlcyhsaXN0KTtcblx0XHRhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcblx0XHRcdHZhciBtYXlSZW1vdmUgPSBbXTtcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXHRcdFx0XHRkb21TdHlsZS5yZWZzLS07XG5cdFx0XHRcdG1heVJlbW92ZS5wdXNoKGRvbVN0eWxlKTtcblx0XHRcdH1cblx0XHRcdGlmKG5ld0xpc3QpIHtcblx0XHRcdFx0dmFyIG5ld1N0eWxlcyA9IGxpc3RUb1N0eWxlcyhuZXdMaXN0KTtcblx0XHRcdFx0YWRkU3R5bGVzVG9Eb20obmV3U3R5bGVzLCBvcHRpb25zKTtcblx0XHRcdH1cblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtYXlSZW1vdmUubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIGRvbVN0eWxlID0gbWF5UmVtb3ZlW2ldO1xuXHRcdFx0XHRpZihkb21TdHlsZS5yZWZzID09PSAwKSB7XG5cdFx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKVxuXHRcdFx0XHRcdFx0ZG9tU3R5bGUucGFydHNbal0oKTtcblx0XHRcdFx0XHRkZWxldGUgc3R5bGVzSW5Eb21bZG9tU3R5bGUuaWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRcblx0ZnVuY3Rpb24gYWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKSB7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblx0XHRcdGlmKGRvbVN0eWxlKSB7XG5cdFx0XHRcdGRvbVN0eWxlLnJlZnMrKztcblx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0ZG9tU3R5bGUucGFydHNbal0oaXRlbS5wYXJ0c1tqXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yKDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRkb21TdHlsZS5wYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIHBhcnRzID0gW107XG5cdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0cGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3R5bGVzSW5Eb21baXRlbS5pZF0gPSB7aWQ6IGl0ZW0uaWQsIHJlZnM6IDEsIHBhcnRzOiBwYXJ0c307XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdFxuXHRmdW5jdGlvbiBsaXN0VG9TdHlsZXMobGlzdCkge1xuXHRcdHZhciBzdHlsZXMgPSBbXTtcblx0XHR2YXIgbmV3U3R5bGVzID0ge307XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gbGlzdFtpXTtcblx0XHRcdHZhciBpZCA9IGl0ZW1bMF07XG5cdFx0XHR2YXIgY3NzID0gaXRlbVsxXTtcblx0XHRcdHZhciBtZWRpYSA9IGl0ZW1bMl07XG5cdFx0XHR2YXIgc291cmNlTWFwID0gaXRlbVszXTtcblx0XHRcdHZhciBwYXJ0ID0ge2NzczogY3NzLCBtZWRpYTogbWVkaWEsIHNvdXJjZU1hcDogc291cmNlTWFwfTtcblx0XHRcdGlmKCFuZXdTdHlsZXNbaWRdKVxuXHRcdFx0XHRzdHlsZXMucHVzaChuZXdTdHlsZXNbaWRdID0ge2lkOiBpZCwgcGFydHM6IFtwYXJ0XX0pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRuZXdTdHlsZXNbaWRdLnBhcnRzLnB1c2gocGFydCk7XG5cdFx0fVxuXHRcdHJldHVybiBzdHlsZXM7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBzdHlsZUVsZW1lbnQpIHtcblx0XHR2YXIgaGVhZCA9IGdldEhlYWRFbGVtZW50KCk7XG5cdFx0dmFyIGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wID0gc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3Bbc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AubGVuZ3RoIC0gMV07XG5cdFx0aWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwidG9wXCIpIHtcblx0XHRcdGlmKCFsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCkge1xuXHRcdFx0XHRoZWFkLmluc2VydEJlZm9yZShzdHlsZUVsZW1lbnQsIGhlYWQuZmlyc3RDaGlsZCk7XG5cdFx0XHR9IGVsc2UgaWYobGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpIHtcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoc3R5bGVFbGVtZW50LCBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5wdXNoKHN0eWxlRWxlbWVudCk7XG5cdFx0fSBlbHNlIGlmIChvcHRpb25zLmluc2VydEF0ID09PSBcImJvdHRvbVwiKSB7XG5cdFx0XHRoZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciAnaW5zZXJ0QXQnLiBNdXN0IGJlICd0b3AnIG9yICdib3R0b20nLlwiKTtcblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcblx0XHRzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdHZhciBpZHggPSBzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5pbmRleE9mKHN0eWxlRWxlbWVudCk7XG5cdFx0aWYoaWR4ID49IDApIHtcblx0XHRcdHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wLnNwbGljZShpZHgsIDEpO1xuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcblx0XHR2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdHN0eWxlRWxlbWVudC50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuXHRcdGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBzdHlsZUVsZW1lbnQpO1xuXHRcdHJldHVybiBzdHlsZUVsZW1lbnQ7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFkZFN0eWxlKG9iaiwgb3B0aW9ucykge1xuXHRcdHZhciBzdHlsZUVsZW1lbnQsIHVwZGF0ZSwgcmVtb3ZlO1xuXHRcblx0XHRpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcblx0XHRcdHZhciBzdHlsZUluZGV4ID0gc2luZ2xldG9uQ291bnRlcisrO1xuXHRcdFx0c3R5bGVFbGVtZW50ID0gc2luZ2xldG9uRWxlbWVudCB8fCAoc2luZ2xldG9uRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKSk7XG5cdFx0XHR1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCBmYWxzZSk7XG5cdFx0XHRyZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3R5bGVFbGVtZW50ID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuXHRcdFx0dXBkYXRlID0gYXBwbHlUb1RhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCk7XG5cdFx0XHRyZW1vdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XG5cdFx0dXBkYXRlKG9iaik7XG5cdFxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGVTdHlsZShuZXdPYmopIHtcblx0XHRcdGlmKG5ld09iaikge1xuXHRcdFx0XHRpZihuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXApXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR1cGRhdGUob2JqID0gbmV3T2JqKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0XG5cdHZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHRleHRTdG9yZSA9IFtdO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gKGluZGV4LCByZXBsYWNlbWVudCkge1xuXHRcdFx0dGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xuXHRcdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG5cdFx0fTtcblx0fSkoKTtcblx0XG5cdGZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcoc3R5bGVFbGVtZW50LCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcblx0XHR2YXIgY3NzID0gcmVtb3ZlID8gXCJcIiA6IG9iai5jc3M7XG5cdFxuXHRcdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcyk7XG5cdFx0XHR2YXIgY2hpbGROb2RlcyA9IHN0eWxlRWxlbWVudC5jaGlsZE5vZGVzO1xuXHRcdFx0aWYgKGNoaWxkTm9kZXNbaW5kZXhdKSBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdFx0aWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHN0eWxlRWxlbWVudC5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGNzc05vZGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gYXBwbHlUb1RhZyhzdHlsZUVsZW1lbnQsIG9iaikge1xuXHRcdHZhciBjc3MgPSBvYmouY3NzO1xuXHRcdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcblx0XHR2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblx0XG5cdFx0aWYgKG1lZGlhKSB7XG5cdFx0XHRzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEpO1xuXHRcdH1cblx0XG5cdFx0aWYgKHNvdXJjZU1hcCkge1xuXHRcdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kZXZ0b29scy9kb2NzL2phdmFzY3JpcHQtZGVidWdnaW5nXG5cdFx0XHQvLyB0aGlzIG1ha2VzIHNvdXJjZSBtYXBzIGluc2lkZSBzdHlsZSB0YWdzIHdvcmsgcHJvcGVybHkgaW4gQ2hyb21lXG5cdFx0XHRjc3MgKz0gJ1xcbi8qIyBzb3VyY2VVUkw9JyArIHNvdXJjZU1hcC5zb3VyY2VzWzBdICsgJyAqLyc7XG5cdFx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNjYwMzg3NVxuXHRcdFx0Y3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIiArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSkgKyBcIiAqL1wiO1xuXHRcdH1cblx0XG5cdFx0aWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG5cdFx0XHRzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aGlsZShzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuXHRcdFx0XHRzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuXHRcdFx0fVxuXHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuXHRcdH1cblx0fVxuXG5cbi8qKiovIH0sXG4vKiA4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgRFVSQVRJT04gPSAwOyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBkaXNtaXNzYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZHVyYXRpb246IHsgZGVmYXVsdDogRFVSQVRJT04gfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB2YWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICB3aWR0aDogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHZhbDogdGhpcy52YWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgZHVyYXRpb25OdW06IGZ1bmN0aW9uIGR1cmF0aW9uTnVtKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5udW1iZXIodGhpcy5kdXJhdGlvbiwgRFVSQVRJT04pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwpIHtcblx0ICAgICAgaWYgKF92YWwgJiYgdGhpcy5kdXJhdGlvbk51bSA+IDApIHtcblx0ICAgICAgICB0aGlzLl9kZWxheUNsb3NlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9kZWxheUNsb3NlID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMudmFsID0gZmFsc2U7XG5cdCAgICB9LCAnZHVyYXRpb25OdW0nKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IFwiZmFkZVwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLnZhbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwidmFsXCJcblx0ICAgIH1dLFxuXHQgICAgY2xhc3M6IFsnYWxlcnQnLCAnYWxlcnQtJyArIF92bS50eXBlLCBfdm0ucGxhY2VtZW50XSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImFsZXJ0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzbWlzc2FibGUpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc21pc3NhYmxlXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gZmFsc2Vcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1hZjdjMWY2YVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDgyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDgzKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODYpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQXNpZGUudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTNhNGJkZTI3XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zYTRiZGUyN1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEFzaWRlLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NCk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtM2E0YmRlMjchLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0FzaWRlLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtM2E0YmRlMjchLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0FzaWRlLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5hc2lkZS1vcGVuIHtcXHJcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzO1xcbn1cXG4uYXNpZGUtb3Blbi5oYXMtcHVzaC1yaWdodCB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTMwMHB4KTtcXG59XFxuLmFzaWRlIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDk7XFxyXFxuICBvdmVyZmxvdzogYXV0bztcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxufVxcbi5hc2lkZS5sZWZ0IHtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogYXV0bztcXG59XFxuLmFzaWRlLnJpZ2h0IHtcXHJcXG4gIGxlZnQ6IGF1dG87XFxyXFxuICByaWdodDogMDtcXG59XFxuLnNsaWRlbGVmdC1lbnRlciB7XFxyXFxuICB0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7XFxufVxcbi5zbGlkZWxlZnQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZWxlZnQtaW4gLjNzO1xcbn1cXG4uc2xpZGVsZWZ0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LW91dCAuM3M7XFxufVxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcbi5zbGlkZXJpZ2h0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVyaWdodC1pbiAuM3M7XFxufVxcbi5zbGlkZXJpZ2h0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVyaWdodC1vdXQgLjNzO1xcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlcmlnaHQtaW4ge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LW91dCB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXG4uYXNpZGU6Zm9jdXMge1xcclxcbiAgICBvdXRsaW5lOiAwO1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcXG4uYXNpZGUge1xcclxcbiAgICBtaW4td2lkdGg6IDI0MHB4O1xcbn1cXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciB7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDE2LjQzcHg7XFxyXFxuICBwYWRkaW5nOiA2cHggMTVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICMzMzdhYjc7XFxyXFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciAuY2xvc2Uge1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAtOHB4O1xcclxcbiAgcGFkZGluZzogNHB4IDhweDtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbiAgZm9udC1zaXplOiAyNXB4O1xcclxcbiAgb3BhY2l0eTogLjg7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1ib2R5IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIge1xcclxcbiAgcGFkZGluZzogMTVweDtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tYmxvY2srLmJ0bi1ibG9jayB7XFxyXFxuICBtYXJnaW4tbGVmdDogMDtcXG59XFxuLmFzaWRlLWJhY2tkcm9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYm90dG9tOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxufVxcbi5hc2lkZS1iYWNrZHJvcC5pbiB7XFxyXFxuICBvcGFjaXR5OiAuNTtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT01MCk7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQXNpZGUudnVlPzU3Mzk2MjFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrRkE7RUFDQSwyQkFBQTtDQUNBO0FBQ0E7RUFDQSw4QkFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLE9BQUE7RUFDQSxVQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7RUFDQSxRQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsU0FBQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7RUFDQSwyQkFBQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLDZCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLHlCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSw2QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7RUFDQSw2QkFBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLDRCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLHlCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSw0QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtBQUNBO0lBQ0EsaUJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxpQ0FBQTtFQUNBLG9CQUFBO0VBQ0Esa0JBQUE7RUFDQSxvQkFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtFQUNBLFlBQUE7RUFDQSxnQkFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxjQUFBO0NBQ0E7QUFDQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLDhCQUFBO0NBQ0E7QUFDQTtFQUNBLGlCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7Q0FDQTtBQUNBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLFFBQUE7RUFDQSxjQUFBO0VBQ0EsV0FBQTtFQUNBLDZCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLDBCQUFBO0NBQ0FcIixcImZpbGVcIjpcIkFzaWRlLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8dHJhbnNpdGlvbiA6bmFtZT1cXFwiJ3NsaWRlJyArIHBsYWNlbWVudFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlXFxcIiB2LWlmPVxcXCJzaG93XFxcIiA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aCsncHgnfVxcXCIgOmNsYXNzPVxcXCJwbGFjZW1lbnRcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWRpYWxvZ1xcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1jb250ZW50XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXNpZGUtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9J3RyaWdnZXJfY2xvc2UnPjxzcGFuPiZ0aW1lczs8L3NwYW4+PC9idXR0b24+XFxyXFxuICAgICAgICAgICAgPGg0IGNsYXNzPVxcXCJhc2lkZS10aXRsZVxcXCI+PHNsb3QgbmFtZT1cXFwiaGVhZGVyXFxcIj57eyBoZWFkZXIgfX08L3Nsb3Q+PC9oND5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWJvZHlcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gIDwvdHJhbnNpdGlvbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtnZXRTY3JvbGxCYXJXaWR0aH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGhlYWRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHBsYWNlbWVudDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ3JpZ2h0J30sXFxyXFxuICAgIHNob3c6IHt0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZX0sXFxyXFxuICAgIHdpZHRoOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzMjB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgc2hvdyAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KHRoaXMuc2hvdyA/ICdvcGVuJyA6ICdjbG9zZScpXFxyXFxuICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHlcXHJcXG4gICAgICBjb25zdCBzY3JvbGxCYXJXaWR0aCA9IGdldFNjcm9sbEJhcldpZHRoKClcXHJcXG4gICAgICBpZiAodmFsKSB7XFxyXFxuICAgICAgICBpZiAoIXRoaXMuX2JhY2tkcm9wKSB7XFxyXFxuICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCdcXHJcXG4gICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fYmFja2Ryb3ApXFxyXFxuICAgICAgICBib2R5LmNsYXNzTGlzdC5hZGQoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XFxyXFxuICAgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gc2Nyb2xsQmFyV2lkdGggKyAncHgnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XFxyXFxuICAgICAgICB2YXIgeCA9IHRoaXMuX2JhY2tkcm9wLmNsaWVudEhlaWdodFxcclxcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZCgnaW4nKVxcclxcbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkub24oJ2NsaWNrJywgKCkgPT4gdGhpcy50cmlnZ2VyX2Nsb3NlKCkpXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLm9uKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xcclxcbiAgICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vZmYoKVxcclxcbiAgICAgICAgICB0cnkge1xcclxcbiAgICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMCdcXHJcXG4gICAgICAgICAgICBib2R5LnJlbW92ZUNoaWxkKHRoaXMuX2JhY2tkcm9wKVxcclxcbiAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gbnVsbFxcclxcbiAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCdcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHRyaWdnZXIgKCkge1xcclxcbiAgICAgIHJldHVybiB7XFxyXFxuICAgICAgICBjbG9zZTogKCkgPT4gdGhpcy50cmlnZ2VyX2Nsb3NlKCksXFxyXFxuICAgICAgICBvcGVuOiAoKSA9PiB0aGlzLnRyaWdnZXJfb3BlbigpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB0cmlnZ2VyX2Nsb3NlICgpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCAnY2xvc2UnIClcXHJcXG4gICAgfSxcXHJcXG4gICAgdHJpZ2dlcl9vcGVuKCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoICdvcGVuJyApXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgdGhpcy4kZW1pdCgndHJpZ2dlcicsICgpID0+IHRoaXMudHJpZ2dlcilcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5hc2lkZS1vcGVuIHtcXHJcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzO1xcclxcbn1cXHJcXG4uYXNpZGUtb3Blbi5oYXMtcHVzaC1yaWdodCB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTMwMHB4KTtcXHJcXG59XFxyXFxuLmFzaWRlIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDk7XFxyXFxuICBvdmVyZmxvdzogYXV0bztcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxyXFxufVxcclxcbi5hc2lkZS5sZWZ0IHtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogYXV0bztcXHJcXG59XFxyXFxuLmFzaWRlLnJpZ2h0IHtcXHJcXG4gIGxlZnQ6IGF1dG87XFxyXFxuICByaWdodDogMDtcXHJcXG59XFxyXFxuLnNsaWRlbGVmdC1lbnRlciB7XFxyXFxuICB0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxufVxcclxcbi5zbGlkZWxlZnQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZWxlZnQtaW4gLjNzO1xcclxcbn1cXHJcXG4uc2xpZGVsZWZ0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LW91dCAuM3M7XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG4uc2xpZGVyaWdodC1lbnRlci1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtaW4gLjNzO1xcclxcbn1cXHJcXG4uc2xpZGVyaWdodC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtb3V0IC4zcztcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxufVxcclxcbi5hc2lkZTpmb2N1cyB7XFxyXFxuICAgIG91dGxpbmU6IDA7XFxyXFxufVxcclxcbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xcclxcbiAgLmFzaWRlIHtcXHJcXG4gICAgbWluLXdpZHRoOiAyNDBweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciB7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDE2LjQzcHg7XFxyXFxuICBwYWRkaW5nOiA2cHggMTVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICMzMzdhYjc7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciAuY2xvc2Uge1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAtOHB4O1xcclxcbiAgcGFkZGluZzogNHB4IDhweDtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbiAgZm9udC1zaXplOiAyNXB4O1xcclxcbiAgb3BhY2l0eTogLjg7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1ib2R5IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIge1xcclxcbiAgcGFkZGluZzogMTVweDtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tYmxvY2srLmJ0bi1ibG9jayB7XFxyXFxuICBtYXJnaW4tbGVmdDogMDtcXHJcXG59XFxyXFxuLmFzaWRlLWJhY2tkcm9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYm90dG9tOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxyXFxufVxcclxcbi5hc2lkZS1iYWNrZHJvcC5pbiB7XFxyXFxuICBvcGFjaXR5OiAuNTtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT01MCk7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiA4NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdyaWdodCcgfSxcblx0ICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMzIwIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCwgb2xkKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQodGhpcy5zaG93ID8gJ29wZW4nIDogJ2Nsb3NlJyk7XG5cdCAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcblx0ICAgICAgdmFyIHNjcm9sbEJhcldpZHRoID0gKDAsIF91dGlscy5nZXRTY3JvbGxCYXJXaWR0aCkoKTtcblx0ICAgICAgaWYgKHZhbCkge1xuXHQgICAgICAgIGlmICghdGhpcy5fYmFja2Ryb3ApIHtcblx0ICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCc7XG5cdCAgICAgICAgYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9iYWNrZHJvcCk7XG5cdCAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XG5cdCAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4Jztcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxuXHQgICAgICAgIHZhciB4ID0gdGhpcy5fYmFja2Ryb3AuY2xpZW50SGVpZ2h0O1xuXHQgICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ2luJyk7XG5cdCAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fYmFja2Ryb3ApLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpcy50cmlnZ2VyX2Nsb3NlKCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fYmFja2Ryb3ApLm9uKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoX3RoaXMuX2JhY2tkcm9wKS5vZmYoKTtcblx0ICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpO1xuXHQgICAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcwJztcblx0ICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZChfdGhpcy5fYmFja2Ryb3ApO1xuXHQgICAgICAgICAgICBfdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuXHQgICAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICB0cmlnZ2VyOiBmdW5jdGlvbiB0cmlnZ2VyKCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzMi50cmlnZ2VyX2Nsb3NlKCk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBvcGVuOiBmdW5jdGlvbiBvcGVuKCkge1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzMi50cmlnZ2VyX29wZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICB9LFxuXHQgICAgdHJpZ2dlcl9jbG9zZTogZnVuY3Rpb24gdHJpZ2dlcl9jbG9zZSgpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnY2xvc2UnKTtcblx0ICAgIH0sXG5cdCAgICB0cmlnZ2VyX29wZW46IGZ1bmN0aW9uIHRyaWdnZXJfb3BlbigpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnb3BlbicpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgIHRoaXMuJGVtaXQoJ3RyaWdnZXInLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiBfdGhpczMudHJpZ2dlcjtcblx0ICAgIH0pO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogJ3NsaWRlJyArIF92bS5wbGFjZW1lbnRcblx0ICAgIH1cblx0ICB9LCBbKF92bS5zaG93KSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGVcIixcblx0ICAgIGNsYXNzOiBfdm0ucGxhY2VtZW50LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ud2lkdGggKyAncHgnXG5cdCAgICB9KVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWRpYWxvZ1wiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtY29udGVudFwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtaGVhZGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS50cmlnZ2VyX2Nsb3NlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnaDQnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhc2lkZS10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl92KF92bS5fcyhfdm0uaGVhZGVyKSldKV0sIDIpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtYm9keVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXSldKSA6IF92bS5fZSgpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtM2E0YmRlMjdcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA4NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OClcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxCdXR0b25Hcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMTI1ZWIwYzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTEyNWViMGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQnV0dG9uR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBidXR0b25zOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBqdXN0aWZpZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZlcnRpY2FsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBidG5Hcm91cDogZnVuY3Rpb24gYnRuR3JvdXAoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIC8vIHRoaXMgd2lsbCB1cGRhdGUgRVhURVJOQUwgdi1tb2RlbCB3aGVuIG91ciB2YWwgY2hhbmdlc1xuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIF92YWwpO1xuXHQgICAgfSxcblx0XG5cdCAgICAvLyB0aGlzIHdpbGwgdXBkYXRlIG91ciBJTlRFUk5BTCB2YWwsIHdoZW4gc29tZXRoaW5nIGV4dGVybmFsIGNoYW5nZXMgb3VyIHYtbW9kZWxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogODkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgJ2J0bi1ncm91cCc6IF92bS5idXR0b25zLCAnYnRuLWdyb3VwLWp1c3RpZmllZCc6IF92bS5qdXN0aWZpZWQsICdidG4tZ3JvdXAtdmVydGljYWwnOiBfdm0udmVydGljYWxcblx0ICAgIH0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImRhdGEtdG9nZ2xlXCI6IF92bS5idXR0b25zICYmICdidXR0b25zJ1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMTI1ZWIwYzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA5MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg5MSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXENhcm91c2VsLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtMzIyZGVlNDFcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTMyMmRlZTQxXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zMjJkZWU0MVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIENhcm91c2VsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDkxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMzIyZGVlNDEmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0Nhcm91c2VsLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMzIyZGVlNDEmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0Nhcm91c2VsLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDkyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5jYXJvdXNlbC1jb250cm9sW2RhdGEtdi0zMjJkZWU0MV0ge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0Nhcm91c2VsLnZ1ZT8yZjQ0NjM0MlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBNEdBO0VBQ0EsZ0JBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2Fyb3VzZWwudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG48ZGl2IGNsYXNzPVxcXCJjYXJvdXNlbCBzbGlkZVxcXCIgZGF0YS1yaWRlPVxcXCJjYXJvdXNlbFxcXCI+XFxyXFxuICA8IS0tIEluZGljYXRvcnMgLS0+XFxyXFxuICA8b2wgY2xhc3M9XFxcImNhcm91c2VsLWluZGljYXRvcnNcXFwiIHYtc2hvdz1cXFwiaW5kaWNhdG9yc1xcXCI+XFxyXFxuICAgIDxsaSB2LWZvcj1cXFwiKGluZGljYXRvcixpKSBpbiBpbmRpY2F0b3JfbGlzdFxcXCIgQGNsaWNrPVxcXCJpbmRpY2F0b3JDbGljayhpKVxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmkgPT09IGluZGV4fVxcXCI+PHNwYW4+PC9zcGFuPjwvbGk+XFxyXFxuICA8L29sPlxcclxcbiAgPCEtLSBXcmFwcGVyIGZvciBzbGlkZXMgLS0+XFxyXFxuICA8ZGl2IGNsYXNzPVxcXCJjYXJvdXNlbC1pbm5lclxcXCIgcm9sZT1cXFwibGlzdGJveFxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gIDwvZGl2PlxcclxcbiAgPCEtLSBDb250cm9scyAtLT5cXHJcXG4gIDxkaXYgdi1zaG93PVxcXCJjb250cm9sc1xcXCIgY2xhc3M9XFxcImNhcm91c2VsLWNvbnRyb2xzIGhpZGRlbi14c1xcXCI+XFxyXFxuICAgIDxhIGNsYXNzPVxcXCJsZWZ0IGNhcm91c2VsLWNvbnRyb2xcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCIgQGNsaWNrPVxcXCJwcmV2XFxcIj5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnRcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvYT5cXHJcXG4gICAgPGEgY2xhc3M9XFxcInJpZ2h0IGNhcm91c2VsLWNvbnRyb2xcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCIgQGNsaWNrPVxcXCJuZXh0XFxcIj5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0XFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICA8L2E+XFxyXFxuICA8L2Rpdj5cXHJcXG48L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG4vLyBsZXQgY29lcmNlID0ge1xcclxcbi8vICAgaW50ZXJ2YWw6ICdudW1iZXInXFxyXFxuLy8gfVxcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGluZGljYXRvcnM6IHtcXHJcXG4gICAgICB0eXBlOiBCb29sZWFuLFxcclxcbiAgICAgIGRlZmF1bHQ6IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgY29udHJvbHM6IHtcXHJcXG4gICAgICB0eXBlOiBCb29sZWFuLFxcclxcbiAgICAgIGRlZmF1bHQ6IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgaW50ZXJ2YWw6IHtcXHJcXG4gICAgICB0eXBlOiBOdW1iZXIsXFxyXFxuICAgICAgZGVmYXVsdDogNTAwMFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgaW5kaWNhdG9yX2xpc3Q6IFtdLFxcclxcbiAgICAgIGluZGV4OiAwLFxcclxcbiAgICAgIGlzQW5pbWF0aW5nOiBmYWxzZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKG5ld1ZhbCwgb2xkVmFsKSB7XFxyXFxuICAgICAgdGhpcy5zbGlkZShuZXdWYWwgPiBvbGRWYWwgPyAnbGVmdCcgOiAncmlnaHQnLCBuZXdWYWwsIG9sZFZhbClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaW5kaWNhdG9yQ2xpY2sgKGluZGV4KSB7XFxyXFxuICAgICAgaWYgKHRoaXMuaXNBbmltYXRpbmcgfHwgdGhpcy5pbmRleCA9PT0gaW5kZXgpIHJldHVybiBmYWxzZVxcclxcbiAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5pbmRleCA9IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIHNsaWRlIChkaXJlY3Rpb24sIG5leHQsIHByZXYpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuJGVsKSB7IHJldHVybiB9XFxyXFxuICAgICAgY29uc3QgJHNsaWRlciA9ICQoJy5pdGVtJywgdGhpcy4kZWwpXFxyXFxuICAgICAgaWYgKCEkc2xpZGVyLmxlbmd0aCkgeyByZXR1cm4gfVxcclxcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gJHNsaWRlcltuZXh0XSB8fCAkc2xpZGVyWzBdXFxyXFxuICAgICAgJChzZWxlY3RlZCkuYWRkQ2xhc3MoZGlyZWN0aW9uID09PSAnbGVmdCcgPyAnbmV4dCcgOiAncHJldicpXFxyXFxuICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxcclxcbiAgICAgIHZhciB4ID0gc2VsZWN0ZWQuY2xpZW50SGVpZ2h0XFxyXFxuICAgICAgJChbJHNsaWRlcltwcmV2XSwgc2VsZWN0ZWRdKS5hZGRDbGFzcyhkaXJlY3Rpb24pLm9uKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xcclxcbiAgICAgICAgJHNsaWRlci5vZmYoJ3RyYW5zaXRpb25lbmQnKS5jbGFzc05hbWUgPSAnaXRlbSdcXHJcXG4gICAgICAgICQoc2VsZWN0ZWQpLmFkZENsYXNzKCdhY3RpdmUnKVxcclxcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgbmV4dCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ICsgMSA8ICQoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCA/IHRoaXMuaW5kZXggKz0gMSA6IHRoaXMuaW5kZXggPSAwXFxyXFxuICAgIH0sXFxyXFxuICAgIHByZXYgKCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwgfHwgdGhpcy5pc0FuaW1hdGluZykgeyByZXR1cm4gZmFsc2UgfVxcclxcbiAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5pbmRleCA9PT0gMCA/IHRoaXMuaW5kZXggPSAkKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggLSAxIDogdGhpcy5pbmRleCAtPSAxXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZUludGVydmFsICh2YWwpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdmFsID0gdGhpcy5faW50ZXJ2YWxJRCB9XFxyXFxuICAgICAgaWYodGhpcy5faW50ZXJ2YWxJRCkge1xcclxcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbElEKVxcclxcbiAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVydmFsSURcXHJcXG4gICAgICB9XFxyXFxuICAgICAgaWYodmFsICYmIHRoaXMuaW50ZXJ2YWwgPiAwKSB7XFxyXFxuICAgICAgICB0aGlzLl9pbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwodGhpcy5uZXh0LCB0aGlzLmludGVydmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpXFxyXFxuICAgICQodGhpcy4kZWwpLm9uKCdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSkpLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy50b2dnbGVJbnRlcnZhbCh0cnVlKSlcXHJcXG4gIH0sXFxyXFxuICBiZWZvcmVEZXN0cm95ICgpIHtcXHJcXG4gICAgdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSlcXHJcXG4gICAgJCh0aGlzLiRlbCkub2ZmKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5jYXJvdXNlbC1jb250cm9sIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDkzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly8gbGV0IGNvZXJjZSA9IHtcblx0Ly8gICBpbnRlcnZhbDogJ251bWJlcidcblx0Ly8gfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBpbmRpY2F0b3JzOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IHRydWVcblx0ICAgIH0sXG5cdCAgICBjb250cm9sczoge1xuXHQgICAgICB0eXBlOiBCb29sZWFuLFxuXHQgICAgICBkZWZhdWx0OiB0cnVlXG5cdCAgICB9LFxuXHQgICAgaW50ZXJ2YWw6IHtcblx0ICAgICAgdHlwZTogTnVtYmVyLFxuXHQgICAgICBkZWZhdWx0OiA1MDAwXG5cdCAgICB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kaWNhdG9yX2xpc3Q6IFtdLFxuXHQgICAgICBpbmRleDogMCxcblx0ICAgICAgaXNBbmltYXRpbmc6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBpbmRleDogZnVuY3Rpb24gaW5kZXgobmV3VmFsLCBvbGRWYWwpIHtcblx0ICAgICAgdGhpcy5zbGlkZShuZXdWYWwgPiBvbGRWYWwgPyAnbGVmdCcgOiAncmlnaHQnLCBuZXdWYWwsIG9sZFZhbCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBpbmRpY2F0b3JDbGljazogZnVuY3Rpb24gaW5kaWNhdG9yQ2xpY2soaW5kZXgpIHtcblx0ICAgICAgaWYgKHRoaXMuaXNBbmltYXRpbmcgfHwgdGhpcy5pbmRleCA9PT0gaW5kZXgpIHJldHVybiBmYWxzZTtcblx0ICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcblx0ICAgIH0sXG5cdCAgICBzbGlkZTogZnVuY3Rpb24gc2xpZGUoZGlyZWN0aW9uLCBuZXh0LCBwcmV2KSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMuJGVsKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciAkc2xpZGVyID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5pdGVtJywgdGhpcy4kZWwpO1xuXHQgICAgICBpZiAoISRzbGlkZXIubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBzZWxlY3RlZCA9ICRzbGlkZXJbbmV4dF0gfHwgJHNsaWRlclswXTtcblx0ICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoc2VsZWN0ZWQpLmFkZENsYXNzKGRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJ25leHQnIDogJ3ByZXYnKTtcblx0ICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxuXHQgICAgICB2YXIgeCA9IHNlbGVjdGVkLmNsaWVudEhlaWdodDtcblx0ICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoWyRzbGlkZXJbcHJldl0sIHNlbGVjdGVkXSkuYWRkQ2xhc3MoZGlyZWN0aW9uKS5vbigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAkc2xpZGVyLm9mZigndHJhbnNpdGlvbmVuZCcpLmNsYXNzTmFtZSA9ICdpdGVtJztcblx0ICAgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShzZWxlY3RlZCkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXHQgICAgICAgIF90aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG5cdCAgICAgIGlmICghdGhpcy4kZWwgfHwgdGhpcy5pc0FuaW1hdGluZykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5pbmRleCArIDEgPCAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLml0ZW0nLCB0aGlzLiRlbCkubGVuZ3RoID8gdGhpcy5pbmRleCArPSAxIDogdGhpcy5pbmRleCA9IDA7XG5cdCAgICB9LFxuXHQgICAgcHJldjogZnVuY3Rpb24gcHJldigpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLmluZGV4ID09PSAwID8gdGhpcy5pbmRleCA9ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggLSAxIDogdGhpcy5pbmRleCAtPSAxO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZUludGVydmFsOiBmdW5jdGlvbiB0b2dnbGVJbnRlcnZhbCh2YWwpIHtcblx0ICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgdmFsID0gdGhpcy5faW50ZXJ2YWxJRDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5faW50ZXJ2YWxJRCkge1xuXHQgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWxJRCk7XG5cdCAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVydmFsSUQ7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbCAmJiB0aGlzLmludGVydmFsID4gMCkge1xuXHQgICAgICAgIHRoaXMuX2ludGVydmFsSUQgPSBzZXRJbnRlcnZhbCh0aGlzLm5leHQsIHRoaXMuaW50ZXJ2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgdGhpcy50b2dnbGVJbnRlcnZhbCh0cnVlKTtcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuJGVsKS5vbignbW91c2VlbnRlcicsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzMi50b2dnbGVJbnRlcnZhbChmYWxzZSk7XG5cdCAgICB9KS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzMi50b2dnbGVJbnRlcnZhbCh0cnVlKTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIHRoaXMudG9nZ2xlSW50ZXJ2YWwoZmFsc2UpO1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy4kZWwpLm9mZignbW91c2VlbnRlciBtb3VzZWxlYXZlJyk7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogOTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2Fyb3VzZWwgc2xpZGVcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiZGF0YS1yaWRlXCI6IFwiY2Fyb3VzZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ29sJywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmluZGljYXRvcnMpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImluZGljYXRvcnNcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1pbmRpY2F0b3JzXCJcblx0ICB9LCBfdm0uX2woKF92bS5pbmRpY2F0b3JfbGlzdCksIGZ1bmN0aW9uKGluZGljYXRvciwgaSkge1xuXHQgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgYWN0aXZlOiBpID09PSBfdm0uaW5kZXhcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLmluZGljYXRvckNsaWNrKGkpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdzcGFuJyldKVxuXHQgIH0pKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1pbm5lclwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwibGlzdGJveFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY29udHJvbHMpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNvbnRyb2xzXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2Fyb3VzZWwtY29udHJvbHMgaGlkZGVuLXhzXCJcblx0ICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibGVmdCBjYXJvdXNlbC1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnByZXZcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2EnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJyaWdodCBjYXJvdXNlbC1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLm5leHRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0XCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIyZGVlNDFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA5NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg5Nilcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXENoZWNrYm94LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtNjkyMmJmMjRcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTY5MjJiZjI0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi02OTIyYmYyNFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIENoZWNrYm94LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDk2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Nyk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjkyMmJmMjQmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0NoZWNrYm94LnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjkyMmJmMjQmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0NoZWNrYm94LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDk3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbmxhYmVsLmNoZWNrYm94W2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxOHB4O1xcbn1cXG5sYWJlbC5jaGVja2JveCA+IGlucHV0W2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHotaW5kZXg6IC0xO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICBtYXJnaW46IDA7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4ycmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgbGluZS1oZWlnaHQ6MXJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjM1cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxufVxcbmxhYmVsLmNoZWNrYm94Om5vdCguYWN0aXZlKSA+IC5pY29uW2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjNjZhZmU5O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxubGFiZWwuY2hlY2tib3guYWN0aXZlID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCM2FXUjBhRDBpTnlJZ2FHVnBaMmgwUFNJM0lqNDhjR0YwYUNCbWFXeHNQU0lqWm1abUlpQmtQU0p0TlM0M015d3dMalV5YkMwekxqRXlOREl5TERNdU16UXhOakZzTFRFdU16TTRPVFVzTFRFdU5ETXlNVEpzTFRFdU1qUTVOamtzTVM0ek16WTJOV3d5TGpVNE9EWXpMREl1TnpZNE56WnNOQzR6TnpNNUxDMDBMalkzT0RJMmJDMHhMakkwT1RZNUxDMHhMak16TmpZMWJEQXNNR3d3TGpBd01EQXlMREF1TURBd01ERjZJaTgrUEM5emRtYyspO1xcbn1cXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgLmJ0bi1kZWZhdWx0W2RhdGEtdi02OTIyYmYyNF0geyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTtcXG59XFxubGFiZWwuY2hlY2tib3guZGlzYWJsZWRbZGF0YS12LTY5MjJiZjI0XSxcXHJcXG5sYWJlbC5jaGVja2JveC5yZWFkb25seVtkYXRhLXYtNjkyMmJmMjRdLFxcclxcbi5idG4ucmVhZG9ubHlbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NjUpO1xcclxcbiAgYm94LXNoYWRvdzogbm9uZTtcXHJcXG4gIG9wYWNpdHk6IC42NTtcXG59XFxubGFiZWwuYnRuID4gaW5wdXRbdHlwZT1jaGVja2JveF1bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQ2hlY2tib3gudnVlPzU4YTFlNWM0XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF1RkE7RUFDQSxtQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSxVQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFFBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtFQUNBLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSxzQkFBQTtFQUNBLDZCQUFBO0VBQ0EsbUNBQUE7RUFDQSx5QkFBQTtDQUNBO0FBQ0E7RUFDQSx1QkFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7RUFDQSwwQkFBQTtFQUNBLDBFQUFBO0NBQ0E7QUFDQTtFQUNBLDJCQUFBO0VBQ0Esa1pBQUE7Q0FDQTtBQUNBLHNEQUFBLHdCQUFBO0NBQUE7QUFFQTs7O0VBR0EsMEJBQUE7RUFDQSxpQkFBQTtFQUNBLGFBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0NBQ0FcIixcImZpbGVcIjpcIkNoZWNrYm94LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8YSA6aXM9XFxcImlzQnV0dG9uPydhJzonbGFiZWwnXFxcIiBAY2xpY2s9XFxcInRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbaXNCdXR0b24/J2J0biBidG4tJyt0eXBlQ29sb3I6J29wZW4gY2hlY2tib3ggJyt0eXBlQ29sb3Ise2FjdGl2ZTpjaGVja2VkLGRpc2FibGVkOmRpc2FibGVkLHJlYWRvbmx5OnJlYWRvbmx5fV1cXFwiPlxcclxcbiAgICA8aW5wdXQgdi1pZj1cXFwibmFtZVxcXCIgdHlwZT1cXFwiaGlkZGVuXFxcIiA6bmFtZT1cXFwibmFtZVxcXCIgOnZhbHVlPVxcXCJjaGVja2VkP3RydWVWYWx1ZTpmYWxzZVZhbHVlXFxcIiAvPlxcclxcbiAgICA8c3BhbiB2LWlmPVxcXCIhaXNCdXR0b25cXFwiIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbY2hlY2tlZD8nYnRuLScrdHlwZUNvbG9yOicnLHtiZzp0eXBlQ29sb3I9PT0nZGVmYXVsdCd9XVxcXCI+PC9zcGFuPlxcclxcbiAgICA8c3BhbiB2LWlmPVxcXCIhaXNCdXR0b24mJmNoZWNrZWQmJnR5cGVDb2xvcj09PSdkZWZhdWx0J1xcXCIgY2xhc3M9XFxcImljb25cXFwiPjwvc3Bhbj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgPC9hPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBidXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBmYWxzZVZhbHVlOiB7ZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHRydWVWYWx1ZToge2RlZmF1bHQ6IHRydWV9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBmYWxzZX1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjaGVja2VkOiAodGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWUpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBpbkdyb3VwICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuYnRuR3JvdXAgJiYgIXRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCB9LFxcclxcbiAgICBpc0J1dHRvbiAoKSB7IHJldHVybiB0aGlzLmJ1dHRvbiB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucykgfSxcXHJcXG4gICAgaXNGYWxzZSAoKSB7IHJldHVybiB0aGlzLnZhbHVlID09PSB0aGlzLmZhbHNlVmFsdWUgfSxcXHJcXG4gICAgaXNUcnVlICgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT09IHRoaXMudHJ1ZVZhbHVlIH0sXFxyXFxuICAgIHBhcmVudFZhbHVlICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC52YWwgfSxcXHJcXG4gICAgdHlwZUNvbG9yICgpIHsgcmV0dXJuICh0aGlzLnR5cGUgfHwgKHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSkpIHx8ICdkZWZhdWx0JyB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgY2hlY2tlZCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB2YXIgdmFsdWUgPSB2YWwgPyB0aGlzLnRydWVWYWx1ZSA6IHRoaXMuZmFsc2VWYWx1ZVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB2YWwpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XFxyXFxuICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJlbnRWYWx1ZSAodmFsKSB7XFxyXFxuICAgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICAgIHBhcmVudC5fY2hlY2tib3hHcm91cCA9IHRydWVcXHJcXG4gICAgICBpZiAoIShwYXJlbnQudmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7IHBhcmVudC52YWwgPSBbXSB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICAvLyBjYWxsZWQgQCBtb3VudGVkKCksIG9yIHdoZW5ldmVyICRwYXJlbnQudmFsIGNoYW5nZXNcXHJcXG4gICAgLy8gc3luYyBvdXIgc3RhdGUgd2l0aCB0aGUgJHBhcmVudC52YWxcXHJcXG4gICAgdXBkYXRlRnJvbVBhcmVudCgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XFxyXFxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodGhpcy50cnVlVmFsdWUpXFxyXFxuICAgICAgICB0aGlzLmNoZWNrZWQgPSB+aW5kZXhcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIC8vIGNhbGxlZCB3aGVuIG91ciBjaGVja2VkIHN0YXRlIGNoYW5nZXNcXHJcXG4gICAgdXBkYXRlUGFyZW50KCkge1xcclxcbiAgICAgIGlmICh0aGlzLmluR3JvdXApIHtcXHJcXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuJHBhcmVudC52YWwuaW5kZXhPZih0aGlzLnRydWVWYWx1ZSlcXHJcXG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWQgJiYgIX5pbmRleCkgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHRoaXMudHJ1ZVZhbHVlKVxcclxcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWRcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbmxhYmVsLmNoZWNrYm94IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmctbGVmdDogMThweDtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3ggPiBpbnB1dCB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3ggPiAuaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4ycmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgbGluZS1oZWlnaHQ6MXJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjM1cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94Om5vdCguYWN0aXZlKSA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCM2FXUjBhRDBpTnlJZ2FHVnBaMmgwUFNJM0lqNDhjR0YwYUNCbWFXeHNQU0lqWm1abUlpQmtQU0p0TlM0M015d3dMalV5YkMwekxqRXlOREl5TERNdU16UXhOakZzTFRFdU16TTRPVFVzTFRFdU5ETXlNVEpzTFRFdU1qUTVOamtzTVM0ek16WTJOV3d5TGpVNE9EWXpMREl1TnpZNE56WnNOQzR6TnpNNUxDMDBMalkzT0RJMmJDMHhMakkwT1RZNUxDMHhMak16TmpZMWJEQXNNR3d3TGpBd01EQXlMREF1TURBd01ERjZJaTgrUEM5emRtYyspO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgLmJ0bi1kZWZhdWx0IHsgZmlsdGVyOiBicmlnaHRuZXNzKDc1JSk7IH1cXHJcXG5cXHJcXG5sYWJlbC5jaGVja2JveC5kaXNhYmxlZCxcXHJcXG5sYWJlbC5jaGVja2JveC5yZWFkb25seSxcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcclxcbn1cXHJcXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPWNoZWNrYm94XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiA5OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGZhbHNlVmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdHJ1ZVZhbHVlOiB7IGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB2YWx1ZTogeyBkZWZhdWx0OiBmYWxzZSB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2hlY2tlZDogdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluR3JvdXA6IGZ1bmN0aW9uIGluR3JvdXAoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LmJ0bkdyb3VwICYmICF0aGlzLiRwYXJlbnQuX3JhZGlvR3JvdXA7XG5cdCAgICB9LFxuXHQgICAgaXNCdXR0b246IGZ1bmN0aW9uIGlzQnV0dG9uKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICBpc0ZhbHNlOiBmdW5jdGlvbiBpc0ZhbHNlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5mYWxzZVZhbHVlO1xuXHQgICAgfSxcblx0ICAgIGlzVHJ1ZTogZnVuY3Rpb24gaXNUcnVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LnZhbDtcblx0ICAgIH0sXG5cdCAgICB0eXBlQ29sb3I6IGZ1bmN0aW9uIHR5cGVDb2xvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIGNoZWNrZWQ6IGZ1bmN0aW9uIGNoZWNrZWQodmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gdmFsID8gdGhpcy50cnVlVmFsdWUgOiB0aGlzLmZhbHNlVmFsdWU7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcblx0ICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJlbnRWYWx1ZTogZnVuY3Rpb24gcGFyZW50VmFsdWUodmFsKSB7XG5cdCAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgY2hlY2tlZCA9IHZhbCA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcblx0ICAgICAgICB0aGlzLmNoZWNrZWQgPSBjaGVja2VkO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgICBwYXJlbnQuX2NoZWNrYm94R3JvdXAgPSB0cnVlO1xuXHQgICAgICBpZiAoIShwYXJlbnQudmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7XG5cdCAgICAgICAgcGFyZW50LnZhbCA9IFtdO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XG5cdCAgfSxcblx0XG5cdCAgbWV0aG9kczoge1xuXHQgICAgLy8gY2FsbGVkIEAgbW91bnRlZCgpLCBvciB3aGVuZXZlciAkcGFyZW50LnZhbCBjaGFuZ2VzXG5cdCAgICAvLyBzeW5jIG91ciBzdGF0ZSB3aXRoIHRoZSAkcGFyZW50LnZhbFxuXHQgICAgdXBkYXRlRnJvbVBhcmVudDogZnVuY3Rpb24gdXBkYXRlRnJvbVBhcmVudCgpIHtcblx0ICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICAgIHZhciBpbmRleCA9IHRoaXMuJHBhcmVudC52YWwuaW5kZXhPZih0aGlzLnRydWVWYWx1ZSk7XG5cdCAgICAgICAgdGhpcy5jaGVja2VkID0gfmluZGV4O1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHRcblx0ICAgIC8vIGNhbGxlZCB3aGVuIG91ciBjaGVja2VkIHN0YXRlIGNoYW5nZXNcblx0ICAgIHVwZGF0ZVBhcmVudDogZnVuY3Rpb24gdXBkYXRlUGFyZW50KCkge1xuXHQgICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudHJ1ZVZhbHVlKTtcblx0ICAgICAgICBpZiAodGhpcy5jaGVja2VkICYmICF+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwucHVzaCh0aGlzLnRydWVWYWx1ZSk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnNwbGljZShpbmRleCwgMSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcblx0ICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDk5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoX3ZtLmlzQnV0dG9uID8gJ2EnIDogJ2xhYmVsJywge1xuXHQgICAgdGFnOiBcImFcIixcblx0ICAgIGNsYXNzOiBbX3ZtLmlzQnV0dG9uID8gJ2J0biBidG4tJyArIF92bS50eXBlQ29sb3IgOiAnb3BlbiBjaGVja2JveCAnICsgX3ZtLnR5cGVDb2xvciwge1xuXHQgICAgICBhY3RpdmU6IF92bS5jaGVja2VkLFxuXHQgICAgICBkaXNhYmxlZDogX3ZtLmRpc2FibGVkLFxuXHQgICAgICByZWFkb25seTogX3ZtLnJlYWRvbmx5XG5cdCAgICB9XSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnRvZ2dsZVxuXHQgICAgfVxuXHQgIH0sIFsoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5jaGVja2VkID8gX3ZtLnRydWVWYWx1ZSA6IF92bS5mYWxzZVZhbHVlXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKCFfdm0uaXNCdXR0b24pID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbiBkcm9wZG93bi10b2dnbGVcIixcblx0ICAgIGNsYXNzOiBbX3ZtLmNoZWNrZWQgPyAnYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJycsIHtcblx0ICAgICAgYmc6IF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0J1xuXHQgICAgfV1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoIV92bS5pc0J1dHRvbiAmJiBfdm0uY2hlY2tlZCAmJiBfdm0udHlwZUNvbG9yID09PSAnZGVmYXVsdCcpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY5MjJiZjI0XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcRGF0ZXBpY2tlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNDc3YjhlNWRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTQ3N2I4ZTVkXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRGF0ZXBpY2tlci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDc3YjhlNWQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0RhdGVwaWNrZXIudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi00NzdiOGU1ZCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vRGF0ZXBpY2tlci52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmRhdGVwaWNrZXIge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5pbnB1dC5kYXRlcGlja2VyLWlucHV0LndpdGgtcmVzZXQtYnV0dG9uIHtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDI1cHg7XFxufVxcbi5kYXRlcGlja2VyID4gYnV0dG9uLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5kYXRlcGlja2VyID4gYnV0dG9uLmNsb3NlOmZvY3VzIHtcXHJcXG4gIG9wYWNpdHk6IC4yO1xcbn1cXG4uZGF0ZXBpY2tlci1wb3B1cCB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgYmFja2dyb3VuZDogI2ZmZjtcXHJcXG4gIG1hcmdpbi10b3A6IDJweDtcXHJcXG4gIHotaW5kZXg6IDEwMDA7XFxyXFxuICBib3gtc2hhZG93OiAwIDZweCAxMnB4IHJnYmEoMCwwLDAsMC4xNzUpO1xcbn1cXG4uZGF0ZXBpY2tlci1pbm5lciB7XFxyXFxuICB3aWR0aDogMjE4cHg7XFxufVxcbi5kYXRlcGlja2VyLWJvZHkge1xcclxcbiAgcGFkZGluZzogMTBweCAxMHB4O1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHAsXFxyXFxuLmRhdGVwaWNrZXItY3RybCBzcGFuLFxcclxcbi5kYXRlcGlja2VyLWJvZHkgc3BhbiB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICB3aWR0aDogMjhweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyOHB4O1xcclxcbiAgaGVpZ2h0OiAyOHB4O1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHAge1xcclxcbiAgd2lkdGg6IDY1JTtcXG59XFxuLmRhdGVwaWNrZXItY3RybCBzcGFuIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuIHtcXHJcXG4gIHdpZHRoOiA0OHB4O1xcclxcbiAgaGVpZ2h0OiA1MHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDQ1cHg7XFxufVxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7XFxyXFxuICBjdXJzb3I6IG5vdC1hbGxvd2VkIWltcG9ydGFudDtcXG59XFxuLmRlY2FkZVJhbmdlIHNwYW46Zmlyc3QtY2hpbGQsXFxyXFxuLmRlY2FkZVJhbmdlIHNwYW46bGFzdC1jaGlsZCxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUsXFxyXFxuLmRhdGVwaWNrZXItaXRlbS1ncmF5IHtcXHJcXG4gIGNvbG9yOiAjOTk5O1xcbn1cXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmU6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlIHtcXHJcXG4gIGJhY2tncm91bmQ6IHJnYig1MCwgMTE4LCAxNzcpIWltcG9ydGFudDtcXHJcXG4gIGNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Uge1xcclxcbiAgbWFyZ2luLXRvcDogMTBweFxcbn1cXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBzcGFuLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2Ugc3BhbiB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3Bhbjpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHA6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItY3RybCBpOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWhvdmVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3IgOiAjZWVlZWVlO1xcbn1cXG4uZGF0ZXBpY2tlci13ZWVrUmFuZ2Ugc3BhbiB7XFxyXFxuICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuLmRhdGVwaWNrZXItbGFiZWwge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxyXFxuICBwYWRkaW5nOiA3cHggMDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItY3RybCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBoZWlnaHQ6IDMwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzBweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4ubW9udGgtYnRuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDpub25lO1xcclxcbiAgLW1vei11c2VyLXNlbGVjdDpub25lO1xcclxcbiAgLW1zLXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICB1c2VyLXNlbGVjdDpub25lO1xcbn1cXG4uZGF0ZXBpY2tlci1wcmVCdG4ge1xcclxcbiAgbGVmdDogMnB4O1xcbn1cXG4uZGF0ZXBpY2tlci1uZXh0QnRuIHtcXHJcXG4gIHJpZ2h0OiAycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvRGF0ZXBpY2tlci52dWU/NTIwMDZmNmNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQWlWQTtFQUNBLG1CQUFBO0VBQ0Esc0JBQUE7Q0FDQTtBQUNBO0VBQ0Esb0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLGlCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxjQUFBO0VBQ0EseUNBQUE7Q0FDQTtBQUNBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7OztFQUdBLHNCQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBO0VBQ0EsYUFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtDQUNBO0FBQ0E7RUFDQSxrQ0FBQTtFQUNBLDhCQUFBO0NBQ0E7QUFDQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUVBOztFQUVBLHdDQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBOzs7O0VBSUEsZ0JBQUE7Q0FDQTtBQUNBOzs7OztFQUtBLDJCQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLDBCQUFBO0VBQ0EsaUJBQUE7RUFDQSxlQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0VBQ0EseUJBQUE7RUFDQSxzQkFBQTtFQUNBLHFCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0EsVUFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0NBQ0FcIixcImZpbGVcIjpcIkRhdGVwaWNrZXIudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXJcXFwiPlxcclxcbiAgICA8aW5wdXQgY2xhc3M9XFxcImZvcm0tY29udHJvbCBkYXRlcGlja2VyLWlucHV0XFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIlxcclxcbiAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICA6Y2xhc3M9XFxcInsnd2l0aC1yZXNldC1idXR0b24nOiBjbGVhckJ1dHRvbn1cXFwiXFxyXFxuICAgICAgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aH1cXFwiXFxyXFxuICAgICAgQGNsaWNrPVxcXCJpbnB1dENsaWNrXFxcIlxcclxcbiAgICAvPlxcclxcbiAgICA8YnV0dG9uIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWxcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9ICcnXFxcIj5cXHJcXG4gICAgICA8c3Bhbj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICA8L2J1dHRvbj5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1wb3B1cFxcXCIgdi1zaG93PVxcXCJkaXNwbGF5RGF5Vmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dE1vbnRoQ2xpY2soMClcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcIm5leHRCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0TW9udGhDbGljaygxKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxwIEBjbGljaz1cXFwic3dpdGNoTW9udGhWaWV3XFxcIj57e3N0cmluZ2lmeURheUhlYWRlcihjdXJyRGF0ZSl9fTwvcD5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItd2Vla1JhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiB2LWZvcj1cXFwidyBpbiB0ZXh0LmRheXNPZldlZWtcXFwiPnt7d319PC9zcGFuPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1kYXRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIHYtZm9yPVxcXCJkIGluIGRhdGVSYW5nZVxcXCIgOmNsYXNzPVxcXCJkLnNjbGFzc1xcXCIgQGNsaWNrPVxcXCJkYXlTZWxlY3QoZClcXFwiPnt7ZC50ZXh0fX08L3NwYW4+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlNb250aFZpZXdcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItaW5uZXJcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1jdHJsXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcInByZUJ0bkNsYXNzZXNcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIiBAY2xpY2s9XFxcInByZU5leHRZZWFyQ2xpY2soMClcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcIm5leHRCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0WWVhckNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHAgQGNsaWNrPVxcXCJzd2l0Y2hEZWNhZGVWaWV3XFxcIj57e3N0cmluZ2lmeVllYXJIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiKG0sIGluZGV4KSBpbiB0ZXh0Lm1vbnRoc1xcXCI+XFxyXFxuICAgICAgICAgICAgICA8c3BhbiB2LXRleHQ9XFxcIm0uc3Vic3RyKDAsMylcXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6XFxyXFxuICAgICAgICAgICAgICAgICAgKHRleHQubW9udGhzW3BhcnNlKHZhbCkuZ2V0TW9udGgoKV0gPT09IG0pICYmXFxyXFxuICAgICAgICAgICAgICAgICAgY3VyckRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gcGFyc2UodmFsKS5nZXRGdWxsWWVhcigpfVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgQGNsaWNrPVxcXCJtb250aFNlbGVjdChpbmRleClcXFwiXFxyXFxuICAgICAgICAgICAgICA+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlZZWFyVmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHA+e3tzdHJpbmdpZnlEZWNhZGVIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2UgZGVjYWRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiZGVjYWRlIGluIGRlY2FkZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6cGFyc2UodmFsKS5nZXRGdWxsWWVhcigpID09PSBkZWNhZGUudGV4dH1cXFwiXFxyXFxuICAgICAgICAgICAgICAgIHYtdGV4dD1cXFwiZGVjYWRlLnRleHRcXFwiXFxyXFxuICAgICAgICAgICAgICAgIEBjbGljay5zdG9wPVxcXCJ5ZWFyU2VsZWN0KGRlY2FkZS50ZXh0KVxcXCJcXHJcXG4gICAgICAgICAgICAgID48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHt0cmFuc2xhdGlvbnN9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuLy8gaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICB2YWx1ZToge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGZvcm1hdDoge2RlZmF1bHQ6ICdNTS9kZC95eXl5J30sXFxyXFxuICAgIGRpc2FibGVkRGF5c09mV2Vlazoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGNsZWFyQnV0dG9uOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGljb25zRm9udDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2dseXBoaWNvbid9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgY3VyckRhdGU6IG5ldyBEYXRlKCksXFxyXFxuICAgICAgZGF0ZVJhbmdlOiBbXSxcXHJcXG4gICAgICBkZWNhZGVSYW5nZTogW10sXFxyXFxuICAgICAgZGlzcGxheURheVZpZXc6IGZhbHNlLFxcclxcbiAgICAgIGRpc3BsYXlNb250aFZpZXc6IGZhbHNlLFxcclxcbiAgICAgIGRpc3BsYXlZZWFyVmlldzogZmFsc2UsXFxyXFxuICAgICAgdmFsOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjdXJyRGF0ZSAoKSB7XFxyXFxuICAgICAgdGhpcy5nZXREYXRlUmFuZ2UoKVxcclxcbiAgICB9LFxcclxcbiAgICBmb3JtYXQgKCkge1xcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICB9LFxcclxcbiAgICB2YWx1ZSAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsICE9PSB2YWwpIHsgdGhpcy52YWwgPSB2YWwgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgdGV4dCAoKSB7XFxyXFxuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpXFxyXFxuICAgIH0sXFxyXFxuICAgIHByZUJ0bkNsYXNzZXMgKCkge1xcclxcbiAgICAgIHJldHVybiBgZGF0ZXBpY2tlci1wcmVCdG4gJHt0aGlzLmljb25zRm9udH0gJHt0aGlzLmljb25zRm9udH0tY2hldnJvbi1sZWZ0YFxcclxcbiAgICB9LFxcclxcbiAgICBuZXh0QnRuQ2xhc3NlcyAoKSB7XFxyXFxuICAgICAgcmV0dXJuIGBkYXRlcGlja2VyLW5leHRCdG4gJHt0aGlzLmljb25zRm9udH0gJHt0aGlzLmljb25zRm9udH0tY2hldnJvbi1yaWdodGBcXHJcXG4gICAgfSxcXHJcXG4gICAgZGlzYWJsZWREYXlzQXJyYXkgKCkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF5c09mV2Vlay5tYXAoZCA9PiBwYXJzZUludChkLCAxMCkpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGNsb3NlICgpIHtcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICB9LFxcclxcbiAgICBpbnB1dENsaWNrICgpIHtcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbCkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKVxcclxcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlNb250aFZpZXcgfHwgdGhpcy5kaXNwbGF5WWVhclZpZXcpIHtcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gIXRoaXMuZGlzcGxheURheVZpZXdcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHByZU5leHREZWNhZGVDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKClcXHJcXG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKClcXHJcXG5cXHJcXG4gICAgICBpZiAoZmxhZyA9PT0gMCkge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgLSAxMCwgbW9udGhzLCBkYXRlKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEwLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0TW9udGhDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICBjb25zdCBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZShwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCwgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0WWVhckNsaWNrIChmbGFnKSB7XFxyXFxuICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciAtIDEsIG1vbnRocywgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB5ZWFyU2VsZWN0ICh5ZWFyKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZGF5U2VsZWN0IChkYXkpIHtcXHJcXG4gICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBkYXkuZGF0ZVxcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKVxcclxcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzd2l0Y2hNb250aFZpZXcgKCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgc3dpdGNoRGVjYWRlVmlldyAoKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgbW9udGhTZWxlY3QgKGluZGV4KSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksIGluZGV4LCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZ2V0WWVhck1vbnRoICh5ZWFyLCBtb250aCkge1xcclxcbiAgICAgIGlmIChtb250aCA+IDExKSB7XFxyXFxuICAgICAgICB5ZWFyKytcXHJcXG4gICAgICAgIG1vbnRoID0gMFxcclxcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XFxyXFxuICAgICAgICB5ZWFyLS1cXHJcXG4gICAgICAgIG1vbnRoID0gMTFcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIHt5ZWFyOiB5ZWFyLCBtb250aDogbW9udGh9XFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeURlY2FkZUhlYWRlciAoZGF0ZSkge1xcclxcbiAgICAgIGNvbnN0IHllYXJTdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKVxcclxcbiAgICAgIGNvbnN0IGZpcnN0WWVhck9mRGVjYWRlID0geWVhclN0ci5zdWJzdHJpbmcoMCwgeWVhclN0ci5sZW5ndGggLSAxKSArIDBcXHJcXG4gICAgICBjb25zdCBsYXN0WWVhck9mRGVjYWRlID0gcGFyc2VJbnQoZmlyc3RZZWFyT2ZEZWNhZGUsIDEwKSArIDEwXFxyXFxuICAgICAgcmV0dXJuIGZpcnN0WWVhck9mRGVjYWRlICsgJy0nICsgbGFzdFllYXJPZkRlY2FkZVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlEYXlIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldICsgJyAnICsgZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgIH0sXFxyXFxuICAgIHBhcnNlTW9udGggKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldXFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeVllYXJIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeSAoZGF0ZSwgZm9ybWF0ID0gdGhpcy5mb3JtYXQpIHtcXHJcXG4gICAgICBpZiAoIWRhdGUpIGRhdGUgPSB0aGlzLnBhcnNlKClcXHJcXG4gICAgICBpZiAoIWRhdGUpIHJldHVybiAnJ1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDFcXHJcXG4gICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRoTmFtZSA9IHRoaXMucGFyc2VNb250aChkYXRlKVxcclxcbiAgICAgIHJldHVybiBmb3JtYXRcXHJcXG4gICAgICAgIC5yZXBsYWNlKC95eXl5L2csIHllYXIpXFxyXFxuICAgICAgICAucmVwbGFjZSgveXkvZywgeWVhcilcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTU1NL2csIG1vbnRoTmFtZSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTU0vZywgbW9udGhOYW1lLnN1YnN0cmluZygwLCAzKSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NKD8hYSkvZywgbW9udGgpXFxyXFxuICAgICAgICAucmVwbGFjZSgvZGQvZywgKCcwJyArIGRheSkuc2xpY2UoLTIpKVxcclxcbiAgICAgICAgLnJlcGxhY2UoL2QvZywgZGF5KVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZSAoc3RyKSB7XFxyXFxuICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkIHx8IHN0ciA9PT0gbnVsbCkgeyBzdHIgPSB0aGlzLnZhbCB9XFxyXFxuICAgICAgbGV0IGRhdGUgPSBzdHIubGVuZ3RoID09PSAxMCAmJiAodGhpcy5mb3JtYXQgPT09ICdkZC1NTS15eXl5JyB8fCB0aGlzLmZvcm1hdCA9PT0gJ2RkL01NL3l5eXknKSA/XFxyXFxuICAgICAgICBuZXcgRGF0ZShzdHIuc3Vic3RyaW5nKDYsIDEwKSwgc3RyLnN1YnN0cmluZygzLCA1KS0xLCBzdHIuc3Vic3RyaW5nKDAsIDIpKSA6XFxyXFxuICAgICAgICBuZXcgRGF0ZShzdHIpXFxyXFxuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0RnVsbFllYXIoKSkgPyBuZXcgRGF0ZSgpIDogZGF0ZVxcclxcbiAgICB9LFxcclxcbiAgICBnZXREYXlDb3VudCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBjb25zdCBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdXFxyXFxuICAgICAgaWYgKG1vbnRoID09PSAxKSB7XFxyXFxuICAgICAgICBpZiAoKHllYXIgJSA0MDAgPT09IDApIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSkge1xcclxcbiAgICAgICAgICByZXR1cm4gMjlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGRpY3RbbW9udGhdXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldERhdGVSYW5nZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIGNvbnN0IHRpbWUgPSB7XFxyXFxuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXFxyXFxuICAgICAgICBtb250aDogdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLFxcclxcbiAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9ICh5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCkgLSAxXFxyXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XFxyXFxuICAgICAgICB0aGlzLmRlY2FkZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKVxcclxcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcXHJcXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XFxyXFxuICAgICAgICBmaXJzdERheVdlZWsgPSA3XFxyXFxuICAgICAgfVxcclxcbiAgICAgIGNvbnN0IGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpXFxyXFxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcXHJcXG4gICAgICAgIGNvbnN0IHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSlcXHJcXG4gICAgICAgIGNvbnN0IHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aClcXHJcXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF5VGV4dCA9IHByZXZNb250aERheUNvdW50IC0gZmlyc3REYXlXZWVrICsgaSArIDFcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KVxcclxcbiAgICAgICAgICBsZXQgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7dGV4dDogZGF5VGV4dCwgZGF0ZSwgc2NsYXNzIH0pXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRheUNvdW50OyBpKyspIHtcXHJcXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIGkpXFxyXFxuICAgICAgICBsZXQgc2NsYXNzID0gJydcXHJcXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICBpZiAoaSA9PSB0aW1lLmRheSAmJiBkYXRlLmdldEZ1bGxZZWFyKCkgPT0gdGltZS55ZWFyICYmIGRhdGUuZ2V0TW9udGgoKSA9PSB0aW1lLm1vbnRoKXtcXHJcXG4gICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlJ1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7dGV4dDogaSwgZGF0ZSwgc2NsYXNzfSlcXHJcXG4gICAgICB9XFxyXFxuXFxyXFxuICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlLmxlbmd0aCA8IDQyKSB7XFxyXFxuICAgICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcXHJcXG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpXFxyXFxuXFxyXFxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXFxyXFxuICAgICAgICAgIGxldCBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXFxyXFxuICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSdcXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHt0ZXh0OiBpLCBkYXRlLCBzY2xhc3N9KVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcylcXHJcXG4gICAgdGhpcy5jdXJyRGF0ZSA9IHRoaXMucGFyc2UodGhpcy52YWwpIHx8IHRoaXMucGFyc2UobmV3IERhdGUoKSlcXHJcXG4gICAgdGhpcy5fYmx1ciA9IGUgPT4ge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKVxcclxcbiAgICAgICAgdGhpcy5jbG9zZSgpXFxyXFxuICAgIH1cXHJcXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JsdXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxufVxcclxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDEwMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHQvLyBpbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB2YWx1ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGZvcm1hdDogeyBkZWZhdWx0OiAnTU0vZGQveXl5eScgfSxcblx0ICAgIGRpc2FibGVkRGF5c09mV2VlazogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG5cdCAgICAgICAgcmV0dXJuIFtdO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBpY29uc0ZvbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZ2x5cGhpY29uJyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY3VyckRhdGU6IG5ldyBEYXRlKCksXG5cdCAgICAgIGRhdGVSYW5nZTogW10sXG5cdCAgICAgIGRlY2FkZVJhbmdlOiBbXSxcblx0ICAgICAgZGlzcGxheURheVZpZXc6IGZhbHNlLFxuXHQgICAgICBkaXNwbGF5TW9udGhWaWV3OiBmYWxzZSxcblx0ICAgICAgZGlzcGxheVllYXJWaWV3OiBmYWxzZSxcblx0ICAgICAgdmFsOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBjdXJyRGF0ZTogZnVuY3Rpb24gY3VyckRhdGUoKSB7XG5cdCAgICAgIHRoaXMuZ2V0RGF0ZVJhbmdlKCk7XG5cdCAgICB9LFxuXHQgICAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQoKSB7XG5cdCAgICAgIHRoaXMudmFsID0gdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSk7XG5cdCAgICB9LFxuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdGV4dDogZnVuY3Rpb24gdGV4dCgpIHtcblx0ICAgICAgcmV0dXJuICgwLCBfdXRpbHMudHJhbnNsYXRpb25zKSh0aGlzLmxhbmcpO1xuXHQgICAgfSxcblx0ICAgIHByZUJ0bkNsYXNzZXM6IGZ1bmN0aW9uIHByZUJ0bkNsYXNzZXMoKSB7XG5cdCAgICAgIHJldHVybiAnZGF0ZXBpY2tlci1wcmVCdG4gJyArIHRoaXMuaWNvbnNGb250ICsgJyAnICsgdGhpcy5pY29uc0ZvbnQgKyAnLWNoZXZyb24tbGVmdCc7XG5cdCAgICB9LFxuXHQgICAgbmV4dEJ0bkNsYXNzZXM6IGZ1bmN0aW9uIG5leHRCdG5DbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gJ2RhdGVwaWNrZXItbmV4dEJ0biAnICsgdGhpcy5pY29uc0ZvbnQgKyAnICcgKyB0aGlzLmljb25zRm9udCArICctY2hldnJvbi1yaWdodCc7XG5cdCAgICB9LFxuXHQgICAgZGlzYWJsZWREYXlzQXJyYXk6IGZ1bmN0aW9uIGRpc2FibGVkRGF5c0FycmF5KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERheXNPZldlZWsubWFwKGZ1bmN0aW9uIChkKSB7XG5cdCAgICAgICAgcmV0dXJuIHBhcnNlSW50KGQsIDEwKTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIGlucHV0Q2xpY2s6IGZ1bmN0aW9uIGlucHV0Q2xpY2soKSB7XG5cdCAgICAgIHRoaXMuY3VyckRhdGUgPSB0aGlzLnBhcnNlKHRoaXMudmFsKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgICBpZiAodGhpcy5kaXNwbGF5TW9udGhWaWV3IHx8IHRoaXMuZGlzcGxheVllYXJWaWV3KSB7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSAhdGhpcy5kaXNwbGF5RGF5Vmlldztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHREZWNhZGVDbGljazogZnVuY3Rpb24gcHJlTmV4dERlY2FkZUNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMTAsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxMCwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHRNb250aENsaWNrOiBmdW5jdGlvbiBwcmVOZXh0TW9udGhDbGljayhmbGFnKSB7XG5cdCAgICAgIHZhciB5ZWFyID0gdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgICB2YXIgbW9udGggPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSk7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKTtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwcmVOZXh0WWVhckNsaWNrOiBmdW5jdGlvbiBwcmVOZXh0WWVhckNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMSwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB5ZWFyU2VsZWN0OiBmdW5jdGlvbiB5ZWFyU2VsZWN0KHllYXIpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpO1xuXHQgICAgfSxcblx0ICAgIGRheVNlbGVjdDogZnVuY3Rpb24gZGF5U2VsZWN0KGRheSkge1xuXHQgICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gZGF5LmRhdGU7XG5cdCAgICAgICAgdGhpcy52YWwgPSB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKTtcblx0ICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzd2l0Y2hNb250aFZpZXc6IGZ1bmN0aW9uIHN3aXRjaE1vbnRoVmlldygpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHN3aXRjaERlY2FkZVZpZXc6IGZ1bmN0aW9uIHN3aXRjaERlY2FkZVZpZXcoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IHRydWU7XG5cdCAgICB9LFxuXHQgICAgbW9udGhTZWxlY3Q6IGZ1bmN0aW9uIG1vbnRoU2VsZWN0KGluZGV4KSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKSwgaW5kZXgsIHRoaXMuY3VyckRhdGUuZ2V0RGF0ZSgpKTtcblx0ICAgIH0sXG5cdCAgICBnZXRZZWFyTW9udGg6IGZ1bmN0aW9uIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuXHQgICAgICBpZiAobW9udGggPiAxMSkge1xuXHQgICAgICAgIHllYXIrKztcblx0ICAgICAgICBtb250aCA9IDA7XG5cdCAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XG5cdCAgICAgICAgeWVhci0tO1xuXHQgICAgICAgIG1vbnRoID0gMTE7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHsgeWVhcjogeWVhciwgbW9udGg6IG1vbnRoIH07XG5cdCAgICB9LFxuXHQgICAgc3RyaW5naWZ5RGVjYWRlSGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlEZWNhZGVIZWFkZXIoZGF0ZSkge1xuXHQgICAgICB2YXIgeWVhclN0ciA9IGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpO1xuXHQgICAgICB2YXIgZmlyc3RZZWFyT2ZEZWNhZGUgPSB5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMDtcblx0ICAgICAgdmFyIGxhc3RZZWFyT2ZEZWNhZGUgPSBwYXJzZUludChmaXJzdFllYXJPZkRlY2FkZSwgMTApICsgMTA7XG5cdCAgICAgIHJldHVybiBmaXJzdFllYXJPZkRlY2FkZSArICctJyArIGxhc3RZZWFyT2ZEZWNhZGU7XG5cdCAgICB9LFxuXHQgICAgc3RyaW5naWZ5RGF5SGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlEYXlIZWFkZXIoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldICsgJyAnICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgfSxcblx0ICAgIHBhcnNlTW9udGg6IGZ1bmN0aW9uIHBhcnNlTW9udGgoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeVllYXJIZWFkZXI6IGZ1bmN0aW9uIHN0cmluZ2lmeVllYXJIZWFkZXIoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGRhdGUpIHtcblx0ICAgICAgdmFyIGZvcm1hdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdGhpcy5mb3JtYXQ7XG5cdFxuXHQgICAgICBpZiAoIWRhdGUpIGRhdGUgPSB0aGlzLnBhcnNlKCk7XG5cdCAgICAgIGlmICghZGF0ZSkgcmV0dXJuICcnO1xuXHQgICAgICB2YXIgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgICAgdmFyIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcblx0ICAgICAgdmFyIGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHQgICAgICB2YXIgbW9udGhOYW1lID0gdGhpcy5wYXJzZU1vbnRoKGRhdGUpO1xuXHQgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoL3l5eXkvZywgeWVhcikucmVwbGFjZSgveXkvZywgeWVhcikucmVwbGFjZSgvTU1NTS9nLCBtb250aE5hbWUpLnJlcGxhY2UoL01NTS9nLCBtb250aE5hbWUuc3Vic3RyaW5nKDAsIDMpKS5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSkucmVwbGFjZSgvTSg/IWEpL2csIG1vbnRoKS5yZXBsYWNlKC9kZC9nLCAoJzAnICsgZGF5KS5zbGljZSgtMikpLnJlcGxhY2UoL2QvZywgZGF5KTtcblx0ICAgIH0sXG5cdCAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG5cdCAgICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCB8fCBzdHIgPT09IG51bGwpIHtcblx0ICAgICAgICBzdHIgPSB0aGlzLnZhbDtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZGF0ZSA9IHN0ci5sZW5ndGggPT09IDEwICYmICh0aGlzLmZvcm1hdCA9PT0gJ2RkLU1NLXl5eXknIHx8IHRoaXMuZm9ybWF0ID09PSAnZGQvTU0veXl5eScpID8gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSkgLSAxLCBzdHIuc3Vic3RyaW5nKDAsIDIpKSA6IG5ldyBEYXRlKHN0cik7XG5cdCAgICAgIHJldHVybiBpc05hTihkYXRlLmdldEZ1bGxZZWFyKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG5cdCAgICB9LFxuXHQgICAgZ2V0RGF5Q291bnQ6IGZ1bmN0aW9uIGdldERheUNvdW50KHllYXIsIG1vbnRoKSB7XG5cdCAgICAgIHZhciBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuXHQgICAgICBpZiAobW9udGggPT09IDEpIHtcblx0ICAgICAgICBpZiAoeWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB7XG5cdCAgICAgICAgICByZXR1cm4gMjk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBkaWN0W21vbnRoXTtcblx0ICAgIH0sXG5cdCAgICBnZXREYXRlUmFuZ2U6IGZ1bmN0aW9uIGdldERhdGVSYW5nZSgpIHtcblx0ICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXTtcblx0ICAgICAgdGhpcy5kZWNhZGVSYW5nZSA9IFtdO1xuXHQgICAgICB2YXIgdGltZSA9IHtcblx0ICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXG5cdCAgICAgICAgbW9udGg6IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSxcblx0ICAgICAgICBkYXk6IHRoaXMuY3VyckRhdGUuZ2V0RGF0ZSgpXG5cdCAgICAgIH07XG5cdCAgICAgIHZhciB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKCk7XG5cdCAgICAgIHZhciBmaXJzdFllYXJPZkRlY2FkZSA9IHllYXJTdHIuc3Vic3RyaW5nKDAsIHllYXJTdHIubGVuZ3RoIC0gMSkgKyAwIC0gMTtcblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG5cdCAgICAgICAgdGhpcy5kZWNhZGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgIHRleHQ6IGZpcnN0WWVhck9mRGVjYWRlICsgaVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIDEpO1xuXHQgICAgICB2YXIgZmlyc3REYXlXZWVrID0gY3Vyck1vbnRoRmlyc3REYXkuZ2V0RGF5KCkgKyAxO1xuXHQgICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XG5cdCAgICAgICAgZmlyc3REYXlXZWVrID0gNztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZGF5Q291bnQgPSB0aGlzLmdldERheUNvdW50KHRpbWUueWVhciwgdGltZS5tb250aCk7XG5cdCAgICAgIGlmIChmaXJzdERheVdlZWsgPiAxKSB7XG5cdCAgICAgICAgdmFyIHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSk7XG5cdCAgICAgICAgdmFyIHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCk7XG5cdCAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGZpcnN0RGF5V2VlazsgX2krKykge1xuXHQgICAgICAgICAgdmFyIGRheVRleHQgPSBwcmV2TW9udGhEYXlDb3VudCAtIGZpcnN0RGF5V2VlayArIF9pICsgMTtcblx0ICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUocHJlTW9udGgueWVhciwgcHJlTW9udGgubW9udGgsIGRheVRleHQpO1xuXHQgICAgICAgICAgdmFyIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZ3JheSc7XG5cdCAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcblx0ICAgICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goeyB0ZXh0OiBkYXlUZXh0LCBkYXRlOiBkYXRlLCBzY2xhc3M6IHNjbGFzcyB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8PSBkYXlDb3VudDsgX2kyKyspIHtcblx0ICAgICAgICB2YXIgX2RhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIF9pMik7XG5cdCAgICAgICAgdmFyIF9zY2xhc3MgPSAnJztcblx0ICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICBfc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKF9pMiA9PSB0aW1lLmRheSAmJiBfZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBfZGF0ZS5nZXRNb250aCgpID09IHRpbWUubW9udGgpIHtcblx0ICAgICAgICAgIF9zY2xhc3MgPSAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHsgdGV4dDogX2kyLCBkYXRlOiBfZGF0ZSwgc2NsYXNzOiBfc2NsYXNzIH0pO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBpZiAodGhpcy5kYXRlUmFuZ2UubGVuZ3RoIDwgNDIpIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoTmVlZCA9IDQyIC0gdGhpcy5kYXRlUmFuZ2UubGVuZ3RoO1xuXHQgICAgICAgIHZhciBuZXh0TW9udGggPSB0aGlzLmdldFllYXJNb250aCh0aW1lLnllYXIsIHRpbWUubW9udGggKyAxKTtcblx0XG5cdCAgICAgICAgZm9yICh2YXIgX2kzID0gMTsgX2kzIDw9IG5leHRNb250aE5lZWQ7IF9pMysrKSB7XG5cdCAgICAgICAgICB2YXIgX2RhdGUyID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgX2kzKTtcblx0ICAgICAgICAgIHZhciBfc2NsYXNzMiA9ICdkYXRlcGlja2VyLWl0ZW0tZ3JheSc7XG5cdCAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlMi5nZXREYXkoKSkgPiAtMSkge1xuXHQgICAgICAgICAgICBfc2NsYXNzMiA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSc7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHsgdGV4dDogX2kzLCBkYXRlOiBfZGF0ZTIsIHNjbGFzczogX3NjbGFzczIgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcyk7XG5cdCAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbCkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKTtcblx0ICAgIHRoaXMuX2JsdXIgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZiAoIV90aGlzLiRlbC5jb250YWlucyhlLnRhcmdldCkpIF90aGlzLmNsb3NlKCk7XG5cdCAgICB9O1xuXHQgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2wgZGF0ZXBpY2tlci1pbnB1dFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgJ3dpdGgtcmVzZXQtYnV0dG9uJzogX3ZtLmNsZWFyQnV0dG9uXG5cdCAgICB9LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ud2lkdGhcblx0ICAgIH0pLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwidGV4dFwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlclxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uaW5wdXRDbGljayxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS52YWwgPSAnJ1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzcGxheURheVZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlEYXlWaWV3XCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1wb3B1cFwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1pbm5lclwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1ib2R5XCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWN0cmxcIlxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLnByZUJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dE1vbnRoQ2xpY2soMClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLm5leHRCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRNb250aENsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywge1xuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uc3dpdGNoTW9udGhWaWV3XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURheUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItd2Vla1JhbmdlXCJcblx0ICB9LCBfdm0uX2woKF92bS50ZXh0LmRheXNPZldlZWspLCBmdW5jdGlvbih3KSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdihfdm0uX3ModykpXSlcblx0ICB9KSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1kYXRlUmFuZ2VcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLmRhdGVSYW5nZSksIGZ1bmN0aW9uKGQpIHtcblx0ICAgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGNsYXNzOiBkLnNjbGFzcyxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLmRheVNlbGVjdChkKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3MoZC50ZXh0KSldKVxuXHQgIH0pKV0pXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzcGxheU1vbnRoVmlldyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiZGlzcGxheU1vbnRoVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRZZWFyQ2xpY2soMClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLm5leHRCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRZZWFyQ2xpY2soMSlcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3AnLCB7XG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5zd2l0Y2hEZWNhZGVWaWV3XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeVllYXJIZWFkZXIoX3ZtLmN1cnJEYXRlKSkpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2VcIlxuXHQgIH0sIFtfdm0uX2woKF92bS50ZXh0Lm1vbnRocyksIGZ1bmN0aW9uKG0sIGluZGV4KSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOlxuXHQgICAgICAgIChfdm0udGV4dC5tb250aHNbX3ZtLnBhcnNlKF92bS52YWwpLmdldE1vbnRoKCldID09PSBtKSAmJlxuXHQgICAgICAgIF92bS5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpID09PSBfdm0ucGFyc2UoX3ZtLnZhbCkuZ2V0RnVsbFllYXIoKVxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidGV4dENvbnRlbnRcIjogX3ZtLl9zKG0uc3Vic3RyKDAsIDMpKVxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICBfdm0ubW9udGhTZWxlY3QoaW5kZXgpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9KV1cblx0ICB9KV0sIDIpXSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5kaXNwbGF5WWVhclZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlZZWFyVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHREZWNhZGVDbGljaygwKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ubmV4dEJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dERlY2FkZUNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURlY2FkZUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItbW9udGhSYW5nZSBkZWNhZGVSYW5nZVwiXG5cdCAgfSwgW192bS5fbCgoX3ZtLmRlY2FkZVJhbmdlKSwgZnVuY3Rpb24oZGVjYWRlKSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOiBfdm0ucGFyc2UoX3ZtLnZhbCkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHRcblx0ICAgICAgfSxcblx0ICAgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgICBcInRleHRDb250ZW50XCI6IF92bS5fcyhkZWNhZGUudGV4dClcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICAgX3ZtLnllYXJTZWxlY3QoZGVjYWRlLnRleHQpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9KV1cblx0ICB9KV0sIDIpXSldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDc3YjhlNWRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA2KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxEcm9wZG93bi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzliZTEwNzJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTM5YmUxMDcyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRHJvcGRvd24udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBzaXplOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICB2YXIgc2hvdyA9IHRoaXMudmFsdWU7XG5cdCAgICByZXR1cm4geyBzaG93OiBzaG93IH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHNob3c6IGZ1bmN0aW9uIHNob3codmFsKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBidXR0b25TaXplOiBmdW5jdGlvbiBidXR0b25TaXplKCkge1xuXHQgICAgICByZXR1cm4gflsnbGcnLCAnc20nLCAneHMnXS5pbmRleE9mKHRoaXMuc2l6ZSkgPyAnYnRuLScgKyB0aGlzLnNpemUgOiAnJztcblx0ICAgIH0sXG5cdCAgICBpbklucHV0OiBmdW5jdGlvbiBpbklucHV0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50Ll9pbnB1dDtcblx0ICAgIH0sXG5cdCAgICBpc0xpOiBmdW5jdGlvbiBpc0xpKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50Ll9pc1RhYnMgfHwgdGhpcy4kcGFyZW50Ll9uYXZiYXIgfHwgdGhpcy4kcGFyZW50Lm1lbnU7XG5cdCAgICB9LFxuXHQgICAgbWVudTogZnVuY3Rpb24gbWVudSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLiRwYXJlbnQgfHwgdGhpcy4kcGFyZW50Lm5hdmJhcjtcblx0ICAgIH0sXG5cdCAgICBzbG90czogZnVuY3Rpb24gc2xvdHMoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zbG90Q29udGVudHM7XG5cdCAgICB9LFxuXHQgICAgc3VibWVudTogZnVuY3Rpb24gc3VibWVudSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiAodGhpcy4kcGFyZW50Lm1lbnUgfHwgdGhpcy4kcGFyZW50LnN1Ym1lbnUpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcblx0ICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuXHQgICAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3c7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCd1bCcsIHRoaXMuJGVsKS5vbignY2xpY2snLCAnbGk+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIF90aGlzLnNob3cgPSBmYWxzZTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCd1bCcsIHRoaXMuJGVsKS5vZmYoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uaXNMaSA/ICdsaScgOiAnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJjbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1jbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmJsdXIpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImJsdXJcIlxuXHQgICAgfV0sXG5cdCAgICB0YWc6IFwiZGl2XCIsXG5cdCAgICBjbGFzczogW3tcblx0ICAgICAgb3BlbjogX3ZtLnNob3csXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIGRyb3Bkb3duOiBfdm0uaXNMaSxcblx0ICAgICAgJ2lucHV0LWdyb3VwLWJ0bic6IF92bS5pbklucHV0LFxuXHQgICAgICAnYnRuLWdyb3VwJzogIV92bS5pc0xpICYmICFfdm0uaW5JbnB1dFxuXHQgICAgfV1cblx0ICB9LCBbX3ZtLl90KFwiYmVmb3JlXCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmlzTGkpID8gX3ZtLl9jKCdhJywge1xuXHQgICAgY2xhc3M6IFsnZHJvcGRvd24tdG9nZ2xlJywgX3ZtLmJ1dHRvblNpemUsIHtcblx0ICAgICAgZGlzYWJsZWQ6IF92bS5kaXNhYmxlZFxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwia2V5dXBcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5zaG93ID0gZmFsc2Vcblx0ICAgICAgfSxcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJidXR0b25cIiwgW192bS5fdihfdm0uX3MoX3ZtLnRleHQpKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJldFwiXG5cdCAgfSldLCAyKSA6IF92bS5fYygnYnV0dG9uJywge1xuXHQgICAgY2xhc3M6IFsnYnRuIGJ0bi0nICsgX3ZtLnR5cGUsIF92bS5idXR0b25TaXplLCAnZHJvcGRvd24tdG9nZ2xlJ10sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJidXR0b25cIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZXNjXCIsIDI3KSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uc2hvdyA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiYnV0dG9uXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50ZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2FyZXRcIlxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRyb3Bkb3duLW1lbnVcIiwgW192bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zOWJlMTA3MlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEwOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEZvcm1Hcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzllYjQwMGFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTc5ZWI0MDBhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRm9ybUdyb3VwLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vIGxldCBjb2VyY2UgPSB7XG5cdC8vICAgICBlbnRlclN1Ym1pdDogJ2Jvb2xlYW4nLFxuXHQvLyAgICAgaWNvbjogJ2Jvb2xlYW4nXG5cdC8vIH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZW50ZXJTdWJtaXQ6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogZmFsc2Vcblx0ICAgIH0sXG5cdCAgICBpY29uOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9LFxuXHQgICAgbGFuZzoge1xuXHQgICAgICB0eXBlOiBTdHJpbmcsXG5cdCAgICAgIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoaWxkcmVuOiBbXSxcblx0ICAgICAgdmFsaWQ6IG51bGwsXG5cdCAgICAgIHRpbWVvdXQ6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbGlkOiBmdW5jdGlvbiB2YWxpZCh2YWwsIG9sZCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuXHQgICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuXHQgICAgICB0aGlzLmNoaWxkcmVuLnNvbWUoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgdmFyIHYgPSBlbC52YWxpZGF0ZSA/IGVsLnZhbGlkYXRlKCkgOiBlbC52YWxpZCAhPT0gdW5kZWZpbmVkID8gZWwudmFsaWQgOiBlbC5yZXF1aXJlZCAmJiAhflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKGVsLnZhbHVlKTtcblx0ICAgICAgICBpZiAoIXYpIHZhbGlkID0gZmFsc2U7XG5cdCAgICAgICAgcmV0dXJuICF2YWxpZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMudmFsaWQgPSB2YWxpZDtcblx0ICAgICAgcmV0dXJuIHZhbGlkID09PSB0cnVlO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2Zvcm1Hcm91cCA9IHRydWU7XG5cdCAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtR3JvdXApIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybUdyb3VwKSB7XG5cdCAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy52YWxpZGF0ZSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDExMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03OWViNDAwYVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEzKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEZvcm1WYWxpZGF0b3IudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWI5ZjU3YzQ2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1iOWY1N2M0NlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEZvcm1WYWxpZGF0b3IudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTEyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBlbnRlclN1Ym1pdDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgaWNvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgdmFsdWU6IG51bGxcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGlsZHJlbjogW10sXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuXHQgICAgICB2YXIgaW52YWxpZCA9ICF0aGlzLmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbC52YWxpZGF0ZSA/IGVsLnZhbGlkYXRlKCkgOiBlbC52YWxpZCAhPT0gdW5kZWZpbmVkID8gZWwudmFsaWQgOiBlbC5yZXF1aXJlZCAmJiAhflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKGVsLnZhbHVlKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMudmFsaWQgPSAhaW52YWxpZDtcblx0ICAgICAgcmV0dXJuICFpbnZhbGlkO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2Zvcm1WYWxpZGF0b3IgPSB0cnVlO1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcblx0ICAgIH1cblx0ICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy52YWxpZGF0ZSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDExMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1iOWY1N2M0NlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMTUpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTcpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE4KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXElucHV0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtNjUyYWQ3YjlcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTY1MmFkN2I5XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi02NTJhZDdiOVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIElucHV0LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDExNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE2KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02NTJhZDdiOSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vSW5wdXQudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02NTJhZDdiOSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vSW5wdXQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTE2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5mb3JtLWdyb3VwW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5sYWJlbH4uY2xvc2VbZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICB0b3A6IDI1cHg7XFxufVxcbi5pbnB1dC1ncm91cD4uaWNvbltkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxyXFxuICB3aWR0aDowO1xcclxcbiAgei1pbmRleDogMztcXG59XFxuLmNsb3NlW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICB6LWluZGV4OiAyO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMzRweDtcXHJcXG4gIGhlaWdodDogMzRweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzNHB4O1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uaGFzLWZlZWRiYWNrIC5jbG9zZVtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHJpZ2h0OiAyMHB4O1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0lucHV0LnZ1ZT81NmNlMTY5ZFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBMFFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsVUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EsUUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiSW5wdXQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIDpjbGFzcz1cXFwie3ZhbGlkYXRlOmNhblZhbGlkYXRlLCdoYXMtZmVlZGJhY2snOmljb24sJ2hhcy1lcnJvcic6Y2FuVmFsaWRhdGUmJnZhbGlkPT09ZmFsc2UsJ2hhcy1zdWNjZXNzJzpjYW5WYWxpZGF0ZSYmdmFsaWR9XFxcIj5cXHJcXG4gICAgPHNsb3QgbmFtZT1cXFwibGFiZWxcXFwiPjxsYWJlbCB2LWlmPVxcXCJsYWJlbFxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7bGFiZWx9fTwvbGFiZWw+PC9zbG90PlxcclxcbiAgICA8ZGl2IHYtaWY9XFxcIiRzbG90cy5iZWZvcmV8fCRzbG90cy5hZnRlclxcXCIgY2xhc3M9XFxcImlucHV0LWdyb3VwXFxcIj5cXHJcXG4gICAgICA8c2xvdCBuYW1lPVxcXCJiZWZvcmVcXFwiPjwvc2xvdD5cXHJcXG4gICAgICA8dGV4dGFyZWEgOmlzPVxcXCJ0eXBlPT0ndGV4dGFyZWEnP3R5cGU6J2lucHV0J1xcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIDpjb2xzPVxcXCJjb2xzXFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAgIDpsaXN0PVxcXCJpZF9kYXRhbGlzdFxcXCJcXHJcXG4gICAgICAgIDptYXg9XFxcImF0dHIobWF4KVxcXCJcXHJcXG4gICAgICAgIDptYXhsZW5ndGg9XFxcIm1heGxlbmd0aFxcXCJcXHJcXG4gICAgICAgIDptaW49XFxcImF0dHIobWluKVxcXCJcXHJcXG4gICAgICAgIDpuYW1lPVxcXCJuYW1lXFxcIlxcclxcbiAgICAgICAgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICAgIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiXFxyXFxuICAgICAgICA6cmVxdWlyZWQ9XFxcInJlcXVpcmVkXFxcIlxcclxcbiAgICAgICAgOnJvd3M9XFxcInJvd3NcXFwiXFxyXFxuICAgICAgICA6c3RlcD1cXFwic3RlcFxcXCJcXHJcXG4gICAgICAgIDp0aXRsZT1cXFwiYXR0cih0aXRsZSlcXFwiXFxyXFxuICAgICAgICA6dHlwZT1cXFwidHlwZT09J3RleHRhcmVhJz9udWxsOnR5cGVcXFwiXFxyXFxuICAgICAgICB2LW1vZGVsPVxcXCJ2YWxcXFwiXFxyXFxuICAgICAgICBAYmx1cj1cXFwiZW1pdFxcXCIgQGZvY3VzPVxcXCJlbWl0XFxcIiBAaW5wdXQ9XFxcImVtaXRcXFwiXFxyXFxuICAgICAgICBAa2V5dXAuZW50ZXI9XFxcInR5cGUhPSd0ZXh0YXJlYScmJmVudGVyU3VibWl0JiZzdWJtaXQoKVxcXCJcXHJcXG4gICAgICA+PC90ZXh0YXJlYT5cXHJcXG4gICAgICA8ZGl2IHYtaWY9XFxcImNsZWFyQnV0dG9uICYmIHZhbHVlXFxcIiA6Y2xhc3M9XFxcIntpY29uOmljb259XFxcIj5cXHJcXG4gICAgICAgIDxzcGFuIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJ2YWx1ZSA9ICcnXFxcIj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICAgIDxkaXYgdi1pZj1cXFwiaWNvblxcXCIgY2xhc3M9XFxcImljb25cXFwiPlxcclxcbiAgICAgICAgPHNwYW4gdi1pZj1cXFwiaWNvbiYmdmFsaWQhPT1udWxsXFxcIiA6Y2xhc3M9XFxcIlsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsJ2dseXBoaWNvbi0nKyh2YWxpZD8nb2snOidyZW1vdmUnKV1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiYWZ0ZXJcXFwiPjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XFxyXFxuICAgICAgPHRleHRhcmVhIDppcz1cXFwidHlwZT09J3RleHRhcmVhJz90eXBlOidpbnB1dCdcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICA6Y29scz1cXFwiY29sc1xcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgICA6bGlzdD1cXFwiaWRfZGF0YWxpc3RcXFwiXFxyXFxuICAgICAgICA6bWF4PVxcXCJhdHRyKG1heClcXFwiXFxyXFxuICAgICAgICA6bWF4bGVuZ3RoPVxcXCJtYXhsZW5ndGhcXFwiXFxyXFxuICAgICAgICA6bWluPVxcXCJhdHRyKG1pbilcXFwiXFxyXFxuICAgICAgICA6bmFtZT1cXFwibmFtZVxcXCJcXHJcXG4gICAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOnJlcXVpcmVkPVxcXCJyZXF1aXJlZFxcXCJcXHJcXG4gICAgICAgIDpyb3dzPVxcXCJyb3dzXFxcIlxcclxcbiAgICAgICAgOnN0ZXA9XFxcInN0ZXBcXFwiXFxyXFxuICAgICAgICA6dGl0bGU9XFxcImF0dHIodGl0bGUpXFxcIlxcclxcbiAgICAgICAgOnR5cGU9XFxcInR5cGU9PSd0ZXh0YXJlYSc/bnVsbDp0eXBlXFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgICAgQGJsdXI9XFxcImVtaXRcXFwiIEBmb2N1cz1cXFwiZW1pdFxcXCIgQGlucHV0PVxcXCJlbWl0XFxcIlxcclxcbiAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ0eXBlIT0ndGV4dGFyZWEnJiZlbnRlclN1Ym1pdCYmc3VibWl0KClcXFwiXFxyXFxuICAgICAgPjwvdGV4dGFyZWE+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiY2xlYXJCdXR0b24gJiYgdmFsXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwidmFsID0gJydcXFwiPiZ0aW1lczs8L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiaWNvbiYmdmFsaWQhPT1udWxsXFxcIiA6Y2xhc3M9XFxcIlsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsJ2dseXBoaWNvbi0nKyh2YWxpZD8nb2snOidyZW1vdmUnKV1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgIDxkYXRhbGlzdCB2LWlmPVxcXCJpZF9kYXRhbGlzdFxcXCIgOmlkPVxcXCJpZF9kYXRhbGlzdFxcXCI+XFxyXFxuICAgICAgPG9wdGlvbiB2LWZvcj1cXFwib3BjIGluIG9wdGlvbnNcXFwiIDp2YWx1ZT1cXFwib3BjXFxcIj48L29wdGlvbj5cXHJcXG4gICAgPC9kYXRhbGlzdD5cXHJcXG4gICAgPGRpdiB2LWlmPVxcXCJzaG93SGVscFxcXCIgY2xhc3M9XFxcImhlbHAtYmxvY2tcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7aGVscH19PC9kaXY+XFxyXFxuICAgIDxkaXYgdi1pZj1cXFwic2hvd0Vycm9yXFxcIiBjbGFzcz1cXFwiaGVscC1ibG9jayB3aXRoLWVycm9yc1xcXCIgQGNsaWNrPVxcXCJmb2N1c1xcXCI+e3tlcnJvclRleHR9fTwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Y29lcmNlLCBkZWxheWVyLCB0cmFuc2xhdGlvbnN9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG52YXIgREVMQVkgPSAzMDBcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBjbGVhckJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgY29sczoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGRhdGFsaXN0OiB7dHlwZTogQXJyYXksIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBkaXNhYmxlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZW50ZXJTdWJtaXQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGVycm9yOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgaGVscDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGhpZGVIZWxwOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIGljb246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGxhYmVsOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgbGFuZzoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbmF2aWdhdG9yLmxhbmd1YWdlfSxcXHJcXG4gICAgbWFzazogbnVsbCxcXHJcXG4gICAgbWFza0RlbGF5OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDB9LFxcclxcbiAgICBtYXRjaDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1heDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1heGxlbmd0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1pbjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1pbmxlbmd0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBwYXR0ZXJuOiB7ZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHJlcXVpcmVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICByb3dzOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzfSxcXHJcXG4gICAgc3RlcDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0J30sXFxyXFxuICAgIHVybDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHVybE1hcDoge3R5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsaWRhdGlvbkRlbGF5OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAyNTB9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgb3B0aW9uczogdGhpcy5kYXRhbGlzdCxcXHJcXG4gICAgICB2YWwsXFxyXFxuICAgICAgdmFsaWQ6IG51bGwsXFxyXFxuICAgICAgdGltZW91dDogbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgY2FuVmFsaWRhdGUgKCkgeyByZXR1cm4gIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHkgJiYgKHRoaXMucmVxdWlyZWQgfHwgdGhpcy5yZWdleCB8fCB0aGlzLm5hdGl2ZVZhbGlkYXRlIHx8IHRoaXMubWF0Y2ggIT09IG51bGwpIH0sXFxyXFxuICAgIGVycm9yVGV4dCAoKSB7XFxyXFxuICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZVxcclxcbiAgICAgIGxldCBlcnJvciA9IFt0aGlzLmVycm9yXVxcclxcbiAgICAgIGlmICghdmFsdWUgJiYgdGhpcy5yZXF1aXJlZCkgZXJyb3IucHVzaCgnKCcgKyB0aGlzLnRleHQucmVxdWlyZWQudG9Mb3dlckNhc2UoKSArICcpJylcXHJcXG4gICAgICBpZiAodmFsdWUgJiYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSkgZXJyb3IucHVzaCgnKCcgKyB0aGlzLnRleHQubWluTGVuZ3RoLnRvTG93ZXJDYXNlKCkgKyAnOiAnICsgdGhpcy5taW5sZW5ndGggKyAnKScpXFxyXFxuICAgICAgcmV0dXJuIGVycm9yLmpvaW4oJyAnKVxcclxcbiAgICB9LFxcclxcbiAgICBpZF9kYXRhbGlzdCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0aGlzLmRhdGFsaXN0IGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIGlmICghdGhpcy5faWRfZGF0YWxpc3QpIHtcXHJcXG4gICAgICAgICAgaWYgKCF0aGlzLiRyb290LmlkX2RhdGFsaXN0KSB7IHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QgPSAwIH1cXHJcXG4gICAgICAgICAgdGhpcy5faWRfZGF0YWxpc3QgPSAnaW5wdXQtZGF0YWxpc3QnICsgdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCsrXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICByZXR1cm4gdGhpcy5faWRfZGF0YWxpc3RcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIG51bGxcXHJcXG4gICAgfSxcXHJcXG4gICAgaW5wdXQgKCkgeyByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dCB9LFxcclxcbiAgICBuYXRpdmVWYWxpZGF0ZSAoKSB7IHJldHVybiAodGhpcy5pbnB1dCB8fCB7fSkuY2hlY2tWYWxpZGl0eSAmJiAoflsndXJsJywgJ2VtYWlsJ10uaW5kZXhPZih0aGlzLnR5cGUudG9Mb3dlckNhc2UoKSkgfHwgdGhpcy5taW4gfHwgdGhpcy5tYXgpIH0sXFxyXFxuICAgIHJlZ2V4ICgpIHsgcmV0dXJuIGNvZXJjZS5wYXR0ZXJuKHRoaXMucGF0dGVybikgfSxcXHJcXG4gICAgc2hvd0Vycm9yICgpIHsgcmV0dXJuIHRoaXMuZXJyb3IgJiYgdGhpcy52YWxpZCA9PT0gZmFsc2UgfSxcXHJcXG4gICAgc2hvd0hlbHAgKCkgeyByZXR1cm4gdGhpcy5oZWxwICYmICghdGhpcy5zaG93RXJyb3IgfHwgIXRoaXMuaGlkZUhlbHApIH0sXFxyXFxuICAgIHRleHQgKCkgeyByZXR1cm4gdHJhbnNsYXRpb25zKHRoaXMubGFuZykgfSxcXHJcXG4gICAgdGl0bGUgKCkgeyByZXR1cm4gdGhpcy5lcnJvclRleHQgfHwgdGhpcy5oZWxwIHx8ICcnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBkYXRhbGlzdCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQgJiYgdmFsIGluc3RhbmNlb2YgQXJyYXkpIHsgdGhpcy5vcHRpb25zID0gdmFsIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgbWF0Y2ggKHZhbCkgeyB0aGlzLmV2YWwoKSB9LFxcclxcbiAgICBvcHRpb25zICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdXJsICh2YWwpIHtcXHJcXG4gICAgICB0aGlzLl91cmwoKVxcclxcbiAgICB9LFxcclxcbiAgICB2YWwgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XFxyXFxuICAgICAgICBpZiAodGhpcy5tYXNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcXHJcXG4gICAgICAgICAgdmFsID0gdGhpcy5tYXNrKHZhbCB8fCAnJylcXHJcXG4gICAgICAgICAgaWYgKHRoaXMudmFsICE9PSB2YWwpIHtcXHJcXG4gICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dC5tYXNrKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5tYXNrKVxcclxcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQubWFzayA9IHNldFRpbWVvdXQoKCkgPT4ge1xcclxcbiAgICAgICAgICAgICAgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgICAgICAgICB9LCBpc05hTih0aGlzLm1hc2tEZWxheSkgPyAwIDogdGhpcy5tYXNrRGVsYXkpXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuZXZhbCgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB2YWxpZCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpXFxyXFxuICAgICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LnZhbGlkYXRlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7IHRoaXMudmFsID0gdmFsIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgYXR0ciAodmFsdWUpIHtcXHJcXG4gICAgICByZXR1cm4gflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gbnVsbCA6IHZhbHVlXFxyXFxuICAgIH0sXFxyXFxuICAgIGVtaXQgKGUpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KGUudHlwZSwgZS50eXBlID09ICdpbnB1dCcgPyBlLnRhcmdldC52YWx1ZSA6IGUpXFxyXFxuICAgICAgaWYgKGUudHlwZSA9PT0gJ2JsdXInICYmIHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGV2YWwgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpXFxyXFxuICAgICAgaWYgKCF0aGlzLmNhblZhbGlkYXRlKSB7XFxyXFxuICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKVxcclxcbiAgICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBudWxsXFxyXFxuICAgICAgICB9LCB0aGlzLnZhbGlkYXRpb25EZWxheSlcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGZvY3VzICgpIHsgdGhpcy5pbnB1dC5mb2N1cygpIH0sXFxyXFxuICAgIHN1Ym1pdCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuJHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICAgIGlmICh0aGlzLmlucHV0LmZvcm0pIHtcXHJcXG4gICAgICAgIGNvbnN0IGludmFsaWRzID0gJCgnLmZvcm0tZ3JvdXAudmFsaWRhdGU6bm90KC5oYXMtc3VjY2VzcyknLCB0aGlzLmlucHV0LmZvcm0pXFxyXFxuICAgICAgICBpZiAoaW52YWxpZHMubGVuZ3RoKSB7XFxyXFxuICAgICAgICAgIGludmFsaWRzLmZpbmQoJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcpWzBdLmZvY3VzKClcXHJcXG4gICAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICAgIHRoaXMuaW5wdXQuZm9ybS5zdWJtaXQoKVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWRhdGUgKCkge1xcclxcbiAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkgeyByZXR1cm4gdHJ1ZSB9XFxyXFxuICAgICAgbGV0IHZhbHVlID0gKHRoaXMudmFsIHx8ICcnKS50cmltKClcXHJcXG4gICAgICBpZiAoIXZhbHVlKSB7IHJldHVybiAhdGhpcy5yZXF1aXJlZCB9XFxyXFxuICAgICAgaWYgKHRoaXMubWF0Y2ggIT09IG51bGwpIHsgcmV0dXJuIHRoaXMubWF0Y2ggPT09IHZhbHVlIH1cXHJcXG4gICAgICBpZiAodmFsdWUubGVuZ3RoIDwgdGhpcy5taW5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICBpZiAodGhpcy5uYXRpdmVWYWxpZGF0ZSAmJiAhdGhpcy5pbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICBpZiAodGhpcy5yZWdleCkge1xcclxcbiAgICAgICAgaWYgKCEodGhpcy5yZWdleCBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdGhpcy5yZWdleCh0aGlzLnZhbCkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWwpKSkgeyByZXR1cm4gZmFsc2UgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgICByZXR1cm4gdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICByZXNldCgpIHtcXHJcXG4gICAgICB0aGlzLnZhbHVlID0gJydcXHJcXG4gICAgICB0aGlzLnZhbGlkID0gbnVsbFxcclxcbiAgICAgIGlmICh0aGlzLl90aW1lb3V0Lm1hc2spIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0Lm1hc2spXFxyXFxuICAgICAgaWYgKHRoaXMuX3RpbWVvdXQuZXZhbCkgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQuZXZhbClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9pbnB1dCA9IHRydWVcXHJcXG4gICAgdGhpcy5fdGltZW91dCA9IHt9XFxyXFxuICAgIGxldCBwYXJlbnQgPSB0aGlzLiRwYXJlbnRcXHJcXG4gICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7IHBhcmVudCA9IHBhcmVudC4kcGFyZW50IH1cXHJcXG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcXHJcXG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKVxcclxcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudFxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuX3VybCA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuJGh0dHAgfHwgdGhpcy5fbG9hZGluZykgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy4kaHR0cC5nZXQodGhpcy51cmwpLnRoZW4ocmVzcG9uc2UgPT4ge1xcclxcbiAgICAgICAgdmFyIGRhdGEgPSByZXNwb25zZS5kYXRhIGluc3RhbmNlb2YgQXJyYXkgPyByZXNwb25zZS5kYXRhIDogW11cXHJcXG4gICAgICAgIHRyeSB7IGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpIH0gY2F0Y2ggKGUpIHt9XFxyXFxuICAgICAgICBpZiAodGhpcy51cmxNYXApIHsgZGF0YSA9IGRhdGEubWFwKHRoaXMudXJsTWFwKSB9XFxyXFxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBkYXRhXFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIH0sIHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSwgREVMQVkpXFxyXFxuICAgIGlmICh0aGlzLnVybCkgdGhpcy5fdXJsKClcXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgLy8gJCh0aGlzLmlucHV0KS5vbignZm9jdXMnLCBlID0+IHsgdGhpcy4kZW1pdCgnZm9jdXMnLCBlKSB9KS5vbignYmx1cicsIGUgPT4ge1xcclxcbiAgICAvLyAgIGlmICh0aGlzLmNhblZhbGlkYXRlKSB7IHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKCkgfVxcclxcbiAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxcclxcbiAgICAvLyB9KVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXFxyXFxuICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcXHJcXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKVxcclxcbiAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpXFxyXFxuICAgIH1cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlIHNjb3BlZD5cXHJcXG4uZm9ybS1ncm91cCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxufVxcclxcbmxhYmVsfi5jbG9zZSB7XFxyXFxuICB0b3A6IDI1cHg7XFxyXFxufVxcclxcbi5pbnB1dC1ncm91cD4uaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcclxcbiAgd2lkdGg6MDtcXHJcXG4gIHotaW5kZXg6IDM7XFxyXFxufVxcclxcbi5jbG9zZSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5oYXMtZmVlZGJhY2sgLmNsb3NlIHtcXHJcXG4gIHJpZ2h0OiAyMHB4O1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTE3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdHZhciBERUxBWSA9IDMwMDtcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgY2xlYXJCdXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGNvbHM6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBkYXRhbGlzdDogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGVudGVyU3VibWl0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBlcnJvcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGhlbHA6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBoaWRlSGVscDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBpY29uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBsYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIG1hc2s6IG51bGwsXG5cdCAgICBtYXNrRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDAgfSxcblx0ICAgIG1hdGNoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWF4OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWF4bGVuZ3RoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWluOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWlubGVuZ3RoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHBhdHRlcm46IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgcmVxdWlyZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHJvd3M6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzIH0sXG5cdCAgICBzdGVwOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0JyB9LFxuXHQgICAgdXJsOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdXJsTWFwOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB2YWxpZGF0aW9uRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAyNTAgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgb3B0aW9uczogdGhpcy5kYXRhbGlzdCxcblx0ICAgICAgdmFsOiB2YWwsXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBjYW5WYWxpZGF0ZTogZnVuY3Rpb24gY2FuVmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSAmJiAodGhpcy5yZXF1aXJlZCB8fCB0aGlzLnJlZ2V4IHx8IHRoaXMubmF0aXZlVmFsaWRhdGUgfHwgdGhpcy5tYXRjaCAhPT0gbnVsbCk7XG5cdCAgICB9LFxuXHQgICAgZXJyb3JUZXh0OiBmdW5jdGlvbiBlcnJvclRleHQoKSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG5cdCAgICAgIHZhciBlcnJvciA9IFt0aGlzLmVycm9yXTtcblx0ICAgICAgaWYgKCF2YWx1ZSAmJiB0aGlzLnJlcXVpcmVkKSBlcnJvci5wdXNoKCcoJyArIHRoaXMudGV4dC5yZXF1aXJlZC50b0xvd2VyQ2FzZSgpICsgJyknKTtcblx0ICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSBlcnJvci5wdXNoKCcoJyArIHRoaXMudGV4dC5taW5MZW5ndGgudG9Mb3dlckNhc2UoKSArICc6ICcgKyB0aGlzLm1pbmxlbmd0aCArICcpJyk7XG5cdCAgICAgIHJldHVybiBlcnJvci5qb2luKCcgJyk7XG5cdCAgICB9LFxuXHQgICAgaWRfZGF0YWxpc3Q6IGZ1bmN0aW9uIGlkX2RhdGFsaXN0KCkge1xuXHQgICAgICBpZiAodGhpcy50eXBlICE9PSAndGV4dGFyZWEnICYmIHRoaXMuZGF0YWxpc3QgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIGlmICghdGhpcy5faWRfZGF0YWxpc3QpIHtcblx0ICAgICAgICAgIGlmICghdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCkge1xuXHQgICAgICAgICAgICB0aGlzLiRyb290LmlkX2RhdGFsaXN0ID0gMDtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuX2lkX2RhdGFsaXN0ID0gJ2lucHV0LWRhdGFsaXN0JyArIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QrKztcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2lkX2RhdGFsaXN0O1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfSxcblx0ICAgIGlucHV0OiBmdW5jdGlvbiBpbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgbmF0aXZlVmFsaWRhdGU6IGZ1bmN0aW9uIG5hdGl2ZVZhbGlkYXRlKCkge1xuXHQgICAgICByZXR1cm4gKHRoaXMuaW5wdXQgfHwge30pLmNoZWNrVmFsaWRpdHkgJiYgKH5bJ3VybCcsICdlbWFpbCddLmluZGV4T2YodGhpcy50eXBlLnRvTG93ZXJDYXNlKCkpIHx8IHRoaXMubWluIHx8IHRoaXMubWF4KTtcblx0ICAgIH0sXG5cdCAgICByZWdleDogZnVuY3Rpb24gcmVnZXgoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLnBhdHRlcm4odGhpcy5wYXR0ZXJuKTtcblx0ICAgIH0sXG5cdCAgICBzaG93RXJyb3I6IGZ1bmN0aW9uIHNob3dFcnJvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZXJyb3IgJiYgdGhpcy52YWxpZCA9PT0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvd0hlbHA6IGZ1bmN0aW9uIHNob3dIZWxwKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5oZWxwICYmICghdGhpcy5zaG93RXJyb3IgfHwgIXRoaXMuaGlkZUhlbHApO1xuXHQgICAgfSxcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICB0aXRsZTogZnVuY3Rpb24gdGl0bGUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmVycm9yVGV4dCB8fCB0aGlzLmhlbHAgfHwgJyc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgZGF0YWxpc3Q6IGZ1bmN0aW9uIGRhdGFsaXN0KHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB2YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIHRoaXMub3B0aW9ucyA9IHZhbDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1hdGNoOiBmdW5jdGlvbiBtYXRjaCh2YWwpIHtcblx0ICAgICAgdGhpcy5ldmFsKCk7XG5cdCAgICB9LFxuXHQgICAgb3B0aW9uczogZnVuY3Rpb24gb3B0aW9ucyh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHVybDogZnVuY3Rpb24gdXJsKHZhbCkge1xuXHQgICAgICB0aGlzLl91cmwoKTtcblx0ICAgIH0sXG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICAgIGlmIChfdmFsICE9PSBvbGQpIHtcblx0ICAgICAgICBpZiAodGhpcy5tYXNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICAgIF92YWwgPSB0aGlzLm1hc2soX3ZhbCB8fCAnJyk7XG5cdCAgICAgICAgICBpZiAodGhpcy52YWwgIT09IF92YWwpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQubWFzayA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgIF90aGlzLnZhbCA9IF92YWw7XG5cdCAgICAgICAgICAgIH0sIGlzTmFOKHRoaXMubWFza0RlbGF5KSA/IDAgOiB0aGlzLm1hc2tEZWxheSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXZhbCgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsaWQ6IGZ1bmN0aW9uIHZhbGlkKHZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lzdmFsaWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKTtcblx0ICAgICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LnZhbGlkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBhdHRyOiBmdW5jdGlvbiBhdHRyKHZhbHVlKSB7XG5cdCAgICAgIHJldHVybiB+WycnLCBudWxsLCB1bmRlZmluZWRdLmluZGV4T2YodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBudWxsIDogdmFsdWU7XG5cdCAgICB9LFxuXHQgICAgZW1pdDogZnVuY3Rpb24gZW1pdChlKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoZS50eXBlLCBlLnR5cGUgPT0gJ2lucHV0JyA/IGUudGFyZ2V0LnZhbHVlIDogZSk7XG5cdCAgICAgIGlmIChlLnR5cGUgPT09ICdibHVyJyAmJiB0aGlzLmNhblZhbGlkYXRlKSB7XG5cdCAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGV2YWw6IGZ1bmN0aW9uIF9ldmFsKCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgICBpZiAoIXRoaXMuY2FuVmFsaWRhdGUpIHtcblx0ICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIF90aGlzMi52YWxpZCA9IF90aGlzMi52YWxpZGF0ZSgpO1xuXHQgICAgICAgICAgX3RoaXMyLl90aW1lb3V0LmV2YWwgPSBudWxsO1xuXHQgICAgICAgIH0sIHRoaXMudmFsaWRhdGlvbkRlbGF5KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcblx0ICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuXHQgICAgfSxcblx0ICAgIHN1Ym1pdDogZnVuY3Rpb24gc3VibWl0KCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLmlucHV0LmZvcm0pIHtcblx0ICAgICAgICB2YXIgaW52YWxpZHMgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLmZvcm0tZ3JvdXAudmFsaWRhdGU6bm90KC5oYXMtc3VjY2VzcyknLCB0aGlzLmlucHV0LmZvcm0pO1xuXHQgICAgICAgIGlmIChpbnZhbGlkcy5sZW5ndGgpIHtcblx0ICAgICAgICAgIGludmFsaWRzLmZpbmQoJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcpWzBdLmZvY3VzKCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuaW5wdXQuZm9ybS5zdWJtaXQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG5cdCAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciB2YWx1ZSA9ICh0aGlzLnZhbCB8fCAnJykudHJpbSgpO1xuXHQgICAgICBpZiAoIXZhbHVlKSB7XG5cdCAgICAgICAgcmV0dXJuICF0aGlzLnJlcXVpcmVkO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLm1hdGNoICE9PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2ggPT09IHZhbHVlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbmxlbmd0aCkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5uYXRpdmVWYWxpZGF0ZSAmJiAhdGhpcy5pbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMucmVnZXgpIHtcblx0ICAgICAgICBpZiAoISh0aGlzLnJlZ2V4IGluc3RhbmNlb2YgRnVuY3Rpb24gPyB0aGlzLnJlZ2V4KHRoaXMudmFsKSA6IHRoaXMucmVnZXgudGVzdCh0aGlzLnZhbCkpKSB7XG5cdCAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLnZhbGlkID0gbnVsbDtcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lucHV0ID0gdHJ1ZTtcblx0ICAgIHRoaXMuX3RpbWVvdXQgPSB7fTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgICAgdGhpcy5fdXJsID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdCAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICBpZiAoX3RoaXMzLnVybE1hcCkge1xuXHQgICAgICAgICAgZGF0YSA9IGRhdGEubWFwKF90aGlzMy51cmxNYXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBfdGhpczMub3B0aW9ucyA9IGRhdGE7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LCBERUxBWSk7XG5cdCAgICBpZiAodGhpcy51cmwpIHRoaXMuX3VybCgpO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIC8vICQodGhpcy5pbnB1dCkub24oJ2ZvY3VzJywgZSA9PiB7IHRoaXMuJGVtaXQoJ2ZvY3VzJywgZSkgfSkub24oJ2JsdXInLCBlID0+IHtcblx0ICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XG5cdCAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxuXHQgICAgLy8gfSlcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1ncm91cFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgdmFsaWRhdGU6IF92bS5jYW5WYWxpZGF0ZSwgJ2hhcy1mZWVkYmFjayc6IF92bS5pY29uLCAnaGFzLWVycm9yJzogX3ZtLmNhblZhbGlkYXRlICYmIF92bS52YWxpZCA9PT0gZmFsc2UsICdoYXMtc3VjY2Vzcyc6IF92bS5jYW5WYWxpZGF0ZSAmJiBfdm0udmFsaWRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwibGFiZWxcIiwgWyhfdm0ubGFiZWwpID8gX3ZtLl9jKCdsYWJlbCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNvbnRyb2wtbGFiZWxcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmJlZm9yZSB8fCBfdm0uJHNsb3RzLmFmdGVyKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaW5wdXQtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJiZWZvcmVcIiksIF92bS5fdihcIiBcIiksIF92bS5fYyhfdm0udHlwZSA9PSAndGV4dGFyZWEnID8gX3ZtLnR5cGUgOiAnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgdGFnOiBcInRleHRhcmVhXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiY29sc1wiOiBfdm0uY29scyxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIFwibGlzdFwiOiBfdm0uaWRfZGF0YWxpc3QsXG5cdCAgICAgIFwibWF4XCI6IF92bS5hdHRyKF92bS5tYXgpLFxuXHQgICAgICBcIm1heGxlbmd0aFwiOiBfdm0ubWF4bGVuZ3RoLFxuXHQgICAgICBcIm1pblwiOiBfdm0uYXR0cihfdm0ubWluKSxcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJvd3NcIjogX3ZtLnJvd3MsXG5cdCAgICAgIFwic3RlcFwiOiBfdm0uc3RlcCxcblx0ICAgICAgXCJ0aXRsZVwiOiBfdm0uYXR0cihfdm0udGl0bGUpLFxuXHQgICAgICBcInR5cGVcIjogX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IG51bGwgOiBfdm0udHlwZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImZvY3VzXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImlucHV0XCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfSwgX3ZtLmVtaXRdLFxuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS50eXBlICE9ICd0ZXh0YXJlYScgJiYgX3ZtLmVudGVyU3VibWl0ICYmIF92bS5zdWJtaXQoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uY2xlYXJCdXR0b24gJiYgX3ZtLnZhbHVlKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgaWNvbjogX3ZtLmljb25cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbHVlID0gJydcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pY29uKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSwgWyhfdm0uaWNvbiAmJiBfdm0udmFsaWQgIT09IG51bGwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IFsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsaWQgPyAnb2snIDogJ3JlbW92ZScpXSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYWZ0ZXJcIildLCAyKSA6IFtfdm0uX2MoX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IF92bS50eXBlIDogJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIHRhZzogXCJ0ZXh0YXJlYVwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImNvbHNcIjogX3ZtLmNvbHMsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBcImxpc3RcIjogX3ZtLmlkX2RhdGFsaXN0LFxuXHQgICAgICBcIm1heFwiOiBfdm0uYXR0cihfdm0ubWF4KSxcblx0ICAgICAgXCJtYXhsZW5ndGhcIjogX3ZtLm1heGxlbmd0aCxcblx0ICAgICAgXCJtaW5cIjogX3ZtLmF0dHIoX3ZtLm1pbiksXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXIsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcInJlcXVpcmVkXCI6IF92bS5yZXF1aXJlZCxcblx0ICAgICAgXCJyb3dzXCI6IF92bS5yb3dzLFxuXHQgICAgICBcInN0ZXBcIjogX3ZtLnN0ZXAsXG5cdCAgICAgIFwidGl0bGVcIjogX3ZtLmF0dHIoX3ZtLnRpdGxlKSxcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlID09ICd0ZXh0YXJlYScgPyBudWxsIDogX3ZtLnR5cGVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0udmFsKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJmb2N1c1wiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJpbnB1dFwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH0sIF92bS5lbWl0XSxcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udHlwZSAhPSAndGV4dGFyZWEnICYmIF92bS5lbnRlclN1Ym1pdCAmJiBfdm0uc3VibWl0KClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9ICcnXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmljb24gJiYgX3ZtLnZhbGlkICE9PSBudWxsKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCAnZ2x5cGhpY29uLScgKyAoX3ZtLnZhbGlkID8gJ29rJyA6ICdyZW1vdmUnKV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKV0sIF92bS5fdihcIiBcIiksIChfdm0uaWRfZGF0YWxpc3QpID8gX3ZtLl9jKCdkYXRhbGlzdCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiaWRcIjogX3ZtLmlkX2RhdGFsaXN0XG5cdCAgICB9XG5cdCAgfSwgX3ZtLl9sKChfdm0ub3B0aW9ucyksIGZ1bmN0aW9uKG9wYykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnb3B0aW9uJywge1xuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidmFsdWVcIjogb3BjXG5cdCAgICAgIH1cblx0ICAgIH0pXG5cdCAgfSkpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uc2hvd0hlbHApID8gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoZWxwLWJsb2NrXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5mb2N1c1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWxwKSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLnNob3dFcnJvcikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmVycm9yVGV4dCkpXSkgOiBfdm0uX2UoKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY1MmFkN2I5XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcTW9kYWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWZlN2Q1ZGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1mZTdkNWRjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE1vZGFsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5tb2RhbCB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbn1cXG4ubW9kYWwuaW4ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjUpO1xcbn1cXG4ubW9kYWwuem9vbSAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdG9wOiAzMDBweDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4zcztcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzO1xcbn1cXG4ubW9kYWwuem9vbS5pbiAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgb3BhY2l0eTogMTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9Nb2RhbC52dWU/MWZkZDYyNjBcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXNHQTtFQUNBLDBCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0NBQ0E7QUFDQTtFQUNBLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSwwQkFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLDBCQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7RUFDQSx5QkFBQTtFQUNBLHdCQUFBO0VBQ0Esb0JBQUE7RUFDQSw2Q0FBQTtFQUNBLHFDQUFBO0VBQ0EsV0FBQTtDQUNBXCIsXCJmaWxlXCI6XCJNb2RhbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByb2xlPVxcXCJkaWFsb2dcXFwiIDpjbGFzcz1cXFwiWydtb2RhbCcsZWZmZWN0XVxcXCIgQGNsaWNrPVxcXCJiYWNrZHJvcCYmYWN0aW9uKGZhbHNlLDEpXFxcIiBAdHJhbnNpdGlvbmVuZD1cXFwidHJhbnNpdGlvbiA9IGZhbHNlXFxcIj5cXHJcXG4gICAgPGRpdiA6Y2xhc3M9XFxcIlsnbW9kYWwtZGlhbG9nJyx7J21vZGFsLWxnJzpsYXJnZSwnbW9kYWwtc20nOnNtYWxsfV1cXFwiIHJvbGU9XFxcImRvY3VtZW50XFxcIiA6c3R5bGU9XFxcInt3aWR0aDogb3B0aW9uYWxXaWR0aH1cXFwiIEBjbGljay5zdG9wPVxcXCJhY3Rpb24obnVsbClcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcImFjdGlvbihmYWxzZSwyKVxcXCI+PHNwYW4+JnRpbWVzOzwvc3Bhbj48L2J1dHRvbj5cXHJcXG4gICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj48c2xvdCBuYW1lPVxcXCJ0aXRsZVxcXCI+e3t0aXRsZX19PC9zbG90PjwvaDQ+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9zbG90PlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtYm9keVxcXCI+PGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+PHNsb3Q+PC9zbG90PjwvZGl2Pjwvc2xvdD5cXHJcXG4gICAgICAgIDxzbG90IG5hbWU9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIEBjbGljaz1cXFwiYWN0aW9uKGZhbHNlLDMpXFxcIj57eyBjYW5jZWxUZXh0IH19PC9idXR0b24+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwiYWN0aW9uKHRydWUsNClcXFwiPnt7IG9rVGV4dCB9fTwvYnV0dG9uPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgIDwvc2xvdD5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtnZXRTY3JvbGxCYXJXaWR0aH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBiYWNrZHJvcDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWV9LFxcclxcbiAgICBjYWxsYmFjazoge3R5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgY2FuY2VsVGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJ30sXFxyXFxuICAgIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxhcmdlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBva1RleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnfSxcXHJcXG4gICAgc21hbGw6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHRpdGxlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJ30sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWV9LFxcclxcbiAgICB3aWR0aDoge2RlZmF1bHQ6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgdHJhbnNpdGlvbjogZmFsc2UsXFxyXFxuICAgICAgdmFsOiBudWxsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBvcHRpb25hbFdpZHRoICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy53aWR0aCA9PT0gbnVsbCkge1xcclxcbiAgICAgICAgcmV0dXJuIG51bGxcXHJcXG4gICAgICB9IGVsc2UgaWYgKE51bWJlci5pc0ludGVnZXIodGhpcy53aWR0aCkpIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoICsgJ3B4J1xcclxcbiAgICAgIH1cXHJcXG4gICAgICByZXR1cm4gdGhpcy53aWR0aFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgdHJhbnNpdGlvbiAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSBvbGQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBjb25zdCBlbCA9IHRoaXMuJGVsXFxyXFxuICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHlcXHJcXG4gICAgICBpZiAodmFsKSB7Ly9zdGFydGluZ1xcclxcbiAgICAgICAgaWYgKHRoaXMudmFsKSB7XFxyXFxuICAgICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1jb250ZW50JykuZm9jdXMoKVxcclxcbiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xcclxcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGVsLmNsYXNzTGlzdC5hZGQoJ2luJyksIDApXFxyXFxuICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICAgIGlmIChnZXRTY3JvbGxCYXJXaWR0aCgpICE9PSAwKSB7XFxyXFxuICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBnZXRTY3JvbGxCYXJXaWR0aCgpICsgJ3B4J1xcclxcbiAgICAgICAgICB9XFxyXFxuICAgICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpbicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfSBlbHNlIHsvL2VuZGluZ1xcclxcbiAgICAgICAgdGhpcy4kZW1pdCh0aGlzLnZhbCA/ICdvcGVuZWQnIDogJ2Nsb3NlZCcpXFxyXFxuICAgICAgICBpZiAoIXRoaXMudmFsKSB7XFxyXFxuICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcXHJcXG4gICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsXFxyXFxuICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB2YWwgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgaWYgKG9sZCA9PT0gbnVsbCA/IHZhbCA9PT0gdHJ1ZSA6IHZhbCAhPT0gb2xkKSB0aGlzLnRyYW5zaXRpb24gPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgYWN0aW9uICh2YWwscCkge1xcclxcbiAgICAgIGlmICh2YWwgPT09IG51bGwpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBpZiAodmFsICYmIHRoaXMuY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbikgdGhpcy5jYWxsYmFjaygpXFxyXFxuICAgICAgdGhpcy4kZW1pdCh2YWwgPyAnb2snIDogJ2NhbmNlbCcscClcXHJcXG4gICAgICB0aGlzLnZhbCA9IHZhbCB8fCBmYWxzZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMudmFsID0gdGhpcy52YWx1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG48c3R5bGU+XFxyXFxuLm1vZGFsIHtcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxufVxcclxcbi5tb2RhbC5pbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7XFxyXFxufVxcclxcbi5tb2RhbC56b29tIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0b3A6IDMwMHB4O1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxuICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxufVxcclxcbi5tb2RhbC56b29tLmluIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICBvcGFjaXR5OiAxO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfaXNJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjMpO1xuXHRcblx0dmFyIF9pc0ludGVnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJbnRlZ2VyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJhY2tkcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGNhbGxiYWNrOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjYW5jZWxUZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJyB9LFxuXHQgICAgZWZmZWN0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFyZ2U6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG9rVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnIH0sXG5cdCAgICBzbWFsbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHRyYW5zaXRpb246IGZhbHNlLFxuXHQgICAgICB2YWw6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIG9wdGlvbmFsV2lkdGg6IGZ1bmN0aW9uIG9wdGlvbmFsV2lkdGgoKSB7XG5cdCAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgIH0gZWxzZSBpZiAoKDAsIF9pc0ludGVnZXIyLmRlZmF1bHQpKHRoaXMud2lkdGgpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24odmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCA9PT0gb2xkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIGlmICh2YWwpIHtcblx0ICAgICAgICAvL3N0YXJ0aW5nXG5cdCAgICAgICAgaWYgKHRoaXMudmFsKSB7XG5cdCAgICAgICAgICBlbC5xdWVyeVNlbGVjdG9yKCcubW9kYWwtY29udGVudCcpLmZvY3VzKCk7XG5cdCAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0ICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZWwuY2xhc3NMaXN0LmFkZCgnaW4nKTtcblx0ICAgICAgICAgIH0sIDApO1xuXHQgICAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgICBpZiAoKDAsIF91dGlscy5nZXRTY3JvbGxCYXJXaWR0aCkoKSAhPT0gMCkge1xuXHQgICAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCkgKyAncHgnO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpbicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAvL2VuZGluZ1xuXHQgICAgICAgIHRoaXMuJGVtaXQodGhpcy52YWwgPyAnb3BlbmVkJyA6ICdjbG9zZWQnKTtcblx0ICAgICAgICBpZiAoIXRoaXMudmFsKSB7XG5cdCAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHQgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsO1xuXHQgICAgICAgICAgYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICAgIGlmIChvbGQgPT09IG51bGwgPyBfdmFsID09PSB0cnVlIDogX3ZhbCAhPT0gb2xkKSB0aGlzLnRyYW5zaXRpb24gPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMudmFsID0gdmFsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYWN0aW9uOiBmdW5jdGlvbiBhY3Rpb24odmFsLCBwKSB7XG5cdCAgICAgIGlmICh2YWwgPT09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbCAmJiB0aGlzLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHRoaXMuY2FsbGJhY2soKTtcblx0ICAgICAgdGhpcy4kZW1pdCh2YWwgPyAnb2snIDogJ2NhbmNlbCcsIHApO1xuXHQgICAgICB0aGlzLnZhbCA9IHZhbCB8fCBmYWxzZTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTIzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMTI0KSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMTI0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5OdW1iZXIuaXNJbnRlZ2VyO1xuXG4vKioqLyB9LFxuLyogMTI1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7aXNJbnRlZ2VyOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNil9KTtcblxuLyoqKi8gfSxcbi8qIDEyNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpXG5cdCAgLCBmbG9vciAgICA9IE1hdGguZmxvb3I7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KXtcblx0ICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEyNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydtb2RhbCcsIF92bS5lZmZlY3RdLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwiZGlhbG9nXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5iYWNrZHJvcCAmJiBfdm0uYWN0aW9uKGZhbHNlLCAxKVxuXHQgICAgICB9LFxuXHQgICAgICBcInRyYW5zaXRpb25lbmRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnRyYW5zaXRpb24gPSBmYWxzZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsnbW9kYWwtZGlhbG9nJywge1xuXHQgICAgICAnbW9kYWwtbGcnOiBfdm0ubGFyZ2UsXG5cdCAgICAgICdtb2RhbC1zbSc6IF92bS5zbWFsbFxuXHQgICAgfV0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS5vcHRpb25hbFdpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRvY3VtZW50XCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICBfdm0uYWN0aW9uKG51bGwpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1jb250ZW50XCJcblx0ICB9LCBbX3ZtLl90KFwibW9kYWwtaGVhZGVyXCIsIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uYWN0aW9uKGZhbHNlLCAyKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnaDQnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcInRpdGxlXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXSldLCAyKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fdChcIm1vZGFsLWJvZHlcIiwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibW9kYWwtYm9keVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJtb2RhbC1mb290ZXJcIiwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibW9kYWwtZm9vdGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4gYnRuLWRlZmF1bHRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uYWN0aW9uKGZhbHNlLCAzKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmNhbmNlbFRleHQpKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJ0biBidG4tcHJpbWFyeVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5hY3Rpb24odHJ1ZSwgNClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5va1RleHQpKV0pXSldKV0sIDIpXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mZTdkNWRjOFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEyOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXE5hdmJhci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzhmMDYxOWVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTM4ZjA2MTllXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gTmF2YmFyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdkZWZhdWx0JyB9LFxuXHQgICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfSxcblx0ICAgIGNvbnRhaW5lcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpZDogJ2JzLWV4YW1wbGUtbmF2YmFyLWNvbGxhcHNlLTEnLFxuXHQgICAgICBjb2xsYXBzZWQ6IHRydWUsXG5cdCAgICAgIHN0eWxlczoge31cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHNsb3RzOiBmdW5jdGlvbiBzbG90cygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3Nsb3RDb250ZW50cztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZUNvbGxhcHNlOiBmdW5jdGlvbiB0b2dnbGVDb2xsYXBzZShlKSB7XG5cdCAgICAgIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9uYXZiYXIgPSB0cnVlO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgdHJ5IHtcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgJGRyb3Bkb3duID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bj5bZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsIF90aGlzLiRlbCkucGFyZW50KCk7XG5cdCAgICAgICAgaWYgKCRkcm9wZG93bikge1xuXHQgICAgICAgICAgJGRyb3Bkb3duLm9uKCdjbGljaycsICcuZHJvcGRvd24tdG9nZ2xlJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub24oJ2NsaWNrJywgJy5kcm9wZG93bi1tZW51PmxpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub25CbHVyKGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgICRkcm9wZG93bi5lYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG5cdCAgICAgICAgICAgICAgaWYgKCFjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KSgpO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGZpbmRpbmcgZHJvcGRvd24nKTtcblx0ICAgIH1cblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub24oJ2NsaWNrIHRvdWNoc3RhcnQnLCAnbGk6bm90KC5kcm9wZG93bik+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIF90aGlzLmNvbGxhcHNlZCA9IHRydWU7XG5cdCAgICAgIH0sIDIwMCk7XG5cdCAgICB9KS5vbkJsdXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCFfdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKSB7XG5cdCAgICAgICAgX3RoaXMuY29sbGFwc2VkID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICB2YXIgaGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0O1xuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAndG9wJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdUb3AgPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZUNvbGxhcHNlKGUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bicsIHRoaXMuJGVsKS5vZmYoJ2NsaWNrJykub2ZmQmx1cigpO1xuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub2ZmKCdjbGljaycpO1xuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXInLCAnbmF2YmFyLScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudCA9PT0gJ3N0YXRpYycgPyAnbmF2YmFyLXN0YXRpYy10b3AnIDogJ25hdmJhci1maXhlZC0nICsgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogX3ZtLmNvbnRhaW5lciA9PT0gJ2ZsdWlkJyA/ICdjb250YWluZXItZmx1aWQnIDogJ2NvbnRhaW5lcidcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXZiYXItaGVhZGVyXCJcblx0ICB9LCBbKCFfdm0uJHNsb3RzLmNvbGxhcHNlKSA/IF92bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2YmFyLXRvZ2dsZSBjb2xsYXBzZWRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiLFxuXHQgICAgICBcImFyaWEtZXhwYW5kZWRcIjogXCJmYWxzZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlQ29sbGFwc2Vcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Itb25seVwiXG5cdCAgfSwgW192bS5fdihcIlRvZ2dsZSBuYXZpZ2F0aW9uXCIpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24tYmFyXCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbi1iYXJcIlxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uLWJhclwiXG5cdCAgfSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJjb2xsYXBzZVwiKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYnJhbmRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXItY29sbGFwc2UnLCB7XG5cdCAgICAgIGNvbGxhcHNlOiBfdm0uY29sbGFwc2VkXG5cdCAgICB9XVxuXHQgIH0sIFtfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2IG5hdmJhci1uYXZcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmxlZnQpID8gX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdiBuYXZiYXItbmF2IG5hdmJhci1sZWZ0XCJcblx0ICB9LCBbX3ZtLl90KFwibGVmdFwiKV0sIDIpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLnJpZ2h0KSA/IF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXYgbmF2YmFyLW5hdiBuYXZiYXItcmlnaHRcIlxuXHQgIH0sIFtfdm0uX3QoXCJyaWdodFwiKV0sIDIpIDogX3ZtLl9lKCldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzhmMDYxOWVcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxPcHRpb24udnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQyMDg4MTE2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00MjA4ODExNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE9wdGlvbi52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7IHZhbHVlOiBudWxsIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7IGxvYWRpbmc6IHRydWUgfTtcblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAodGhpcy4kcGFyZW50Ll9zZWxlY3QpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRwYXJlbnQub3B0aW9ucykge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC5vcHRpb25zID0gW107XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGVsID0ge307XG5cdCAgICAgIGVsW3RoaXMuJHBhcmVudC5vcHRpb25zTGFiZWxdID0gdGhpcy4kZWwuaW5uZXJIVE1MO1xuXHQgICAgICBlbFt0aGlzLiRwYXJlbnQub3B0aW9uc1ZhbHVlXSA9IHRoaXMudmFsdWU7XG5cdCAgICAgIHRoaXMuJHBhcmVudC5vcHRpb25zLnB1c2goZWwpO1xuXHQgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnNvbGUud2Fybignb3B0aW9ucyBvbmx5IHdvcmsgaW5zaWRlIGEgc2VsZWN0IGNvbXBvbmVudCcpO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gKF92bS5sb2FkaW5nKSA/IF92bS5fYygnbGknLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpIDogX3ZtLl9lKClcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDIwODgxMTZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTM1KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTM3KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzOClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQYW5lbC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWIxZTA0NjFhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUGFuZWwudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTM1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzYpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWIxZTA0NjFhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9QYW5lbC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWIxZTA0NjFhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9QYW5lbC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjY29yZGlvbi10b2dnbGUge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uY29sbGFwc2UtZW50ZXItYWN0aXZlLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIC41cyBlYXNlO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuLmNvbGxhcHNlLWVudGVyLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcbn1cXHJcXG5cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1BhbmVsLnZ1ZT82MGU3OThlMlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBeUVBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBOztFQUVBLHlCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBOztDQUdBXCIsXCJmaWxlXCI6XCJQYW5lbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiA6Y2xhc3M9XFxcIlsncGFuZWwnLHBhbmVsVHlwZV1cXFwiPlxcclxcbiAgICA8ZGl2IDpjbGFzcz1cXFwiWydwYW5lbC1oZWFkaW5nJyx7J2FjY29yZGlvbi10b2dnbGUnOmluQWNjb3JkaW9ufV1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJpbkFjY29yZGlvbiYmdG9nZ2xlKClcXFwiPlxcclxcbiAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGg0IGNsYXNzPVxcXCJwYW5lbC10aXRsZVxcXCI+e3sgaGVhZGVyIH19PC9oND48L3Nsb3Q+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8dHJhbnNpdGlvblxcclxcbiAgICAgIG5hbWU9XFxcImNvbGxhcHNlXFxcIlxcclxcbiAgICAgIEBlbnRlcj1cXFwiZW50ZXJcXFwiXFxyXFxuICAgICAgQGFmdGVyLWVudGVyPVxcXCJhZnRlckVudGVyXFxcIlxcclxcbiAgICAgIEBiZWZvcmUtbGVhdmU9XFxcImJlZm9yZUxlYXZlXFxcIlxcclxcbiAgICA+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtY29sbGFwc2VcXFwiIHYtaWY9XFxcIm9wZW5cXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtYm9keVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L3RyYW5zaXRpb24+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgaGVhZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgaXNPcGVuOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQgOiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgb3BlbjogdGhpcy5pc09wZW5cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGlzT3BlbiggdmFsICkge1xcclxcbiAgICAgIHRoaXMub3BlbiA9IHZhbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgaW5BY2NvcmRpb24gKCkgeyByZXR1cm4gdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5faXNBY2NvcmRpb24gfSxcXHJcXG4gICAgcGFuZWxUeXBlICgpIHsgcmV0dXJuICdwYW5lbC0nICsgKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSB8fCAnZGVmYXVsdCcpIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gIXRoaXMub3BlblxcclxcbiAgICAgIGlmICh0aGlzLmluQWNjb3JkaW9uKSB7XFxyXFxuICAgICAgICB0aGlzLiRwYXJlbnQub3BlbkNoaWxkKHRoaXMpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBlbnRlciAoZWwpIHtcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0bydcXHJcXG4gICAgICB2YXIgZW5kV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKGVsKS5oZWlnaHRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnMHB4J1xcclxcbiAgICAgIGVsLm9mZnNldEhlaWdodCAvLyBmb3JjZSByZXBhaW50XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZW5kV2lkdGg7XFxyXFxuICAgIH0sXFxyXFxuICAgIGFmdGVyRW50ZXIgKGVsKSB7XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXFxyXFxuICAgIH0sXFxyXFxuICAgIGJlZm9yZUxlYXZlIChlbCkge1xcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodFxcclxcbiAgICAgIGVsLm9mZnNldEhlaWdodCAvLyBmb3JjZSByZXBhaW50XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCdcXHJcXG4gICAgfSxcXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaXNPcGVuID09PSBudWxsKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gIXRoaXMuaW5BY2NvcmRpb25cXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmFjY29yZGlvbi10b2dnbGUge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG4uY29sbGFwc2UtZW50ZXItYWN0aXZlLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIC41cyBlYXNlO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG59XFxyXFxuLmNvbGxhcHNlLWVudGVyLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTM3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgaGVhZGVyOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgaXNPcGVuOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBvcGVuOiB0aGlzLmlzT3BlblxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICB3YXRjaDoge1xuXHQgICAgaXNPcGVuOiBmdW5jdGlvbiBpc09wZW4odmFsKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBpbkFjY29yZGlvbjogZnVuY3Rpb24gaW5BY2NvcmRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50Ll9pc0FjY29yZGlvbjtcblx0ICAgIH0sXG5cdCAgICBwYW5lbFR5cGU6IGZ1bmN0aW9uIHBhbmVsVHlwZSgpIHtcblx0ICAgICAgcmV0dXJuICdwYW5lbC0nICsgKHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLm9wZW4gPSAhdGhpcy5vcGVuO1xuXHQgICAgICBpZiAodGhpcy5pbkFjY29yZGlvbikge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC5vcGVuQ2hpbGQodGhpcyk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBlbnRlcjogZnVuY3Rpb24gZW50ZXIoZWwpIHtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuXHQgICAgICB2YXIgZW5kV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKGVsKS5oZWlnaHQ7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuXHQgICAgICBlbC5vZmZzZXRIZWlnaHQ7IC8vIGZvcmNlIHJlcGFpbnRcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZW5kV2lkdGg7XG5cdCAgICB9LFxuXHQgICAgYWZ0ZXJFbnRlcjogZnVuY3Rpb24gYWZ0ZXJFbnRlcihlbCkge1xuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG5cdCAgICB9LFxuXHQgICAgYmVmb3JlTGVhdmU6IGZ1bmN0aW9uIGJlZm9yZUxlYXZlKGVsKSB7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodDtcblx0ICAgICAgZWwub2Zmc2V0SGVpZ2h0OyAvLyBmb3JjZSByZXBhaW50XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIGlmICh0aGlzLmlzT3BlbiA9PT0gbnVsbCkge1xuXHQgICAgICB0aGlzLm9wZW4gPSAhdGhpcy5pbkFjY29yZGlvbjtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncGFuZWwnLCBfdm0ucGFuZWxUeXBlXVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiBbJ3BhbmVsLWhlYWRpbmcnLCB7XG5cdCAgICAgICdhY2NvcmRpb24tdG9nZ2xlJzogX3ZtLmluQWNjb3JkaW9uXG5cdCAgICB9XSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLmluQWNjb3JkaW9uICYmIF92bS50b2dnbGUoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdoNCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLXRpdGxlXCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0uaGVhZGVyKSldKV0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImNvbGxhcHNlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImVudGVyXCI6IF92bS5lbnRlcixcblx0ICAgICAgXCJhZnRlci1lbnRlclwiOiBfdm0uYWZ0ZXJFbnRlcixcblx0ICAgICAgXCJiZWZvcmUtbGVhdmVcIjogX3ZtLmJlZm9yZUxlYXZlXG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ub3BlbikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWNvbGxhcHNlXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJwYW5lbC1ib2R5XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTQwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0NClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQb3BvdmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0yNDY1YmY1NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMjQ2NWJmNTRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQb3BvdmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE0MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0yNDY1YmY1NCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vUG9wb3Zlci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTI0NjViZjU0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Qb3BvdmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4ucG9wb3Zlci50b3AsXFxyXFxuLnBvcG92ZXIubGVmdCxcXHJcXG4ucG9wb3Zlci5yaWdodCxcXHJcXG4ucG9wb3Zlci5ib3R0b20ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcbi5zY2FsZS1lbnRlciB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtaW4gMC4xNXMgZWFzZS1pbjtcXG59XFxuLnNjYWxlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtb3V0IDAuMTVzIGVhc2Utb3V0O1xcbn1cXG5Aa2V5ZnJhbWVzIHNjYWxlLWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzY2FsZS1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1BvcG92ZXIudnVlP2U2MTY5NjNhXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF5QkE7Ozs7RUFJQSxlQUFBO0NBQ0E7QUFDQTtFQUNBLGlDQUFBO0NBQ0E7QUFDQTtFQUNBLG1DQUFBO0NBQ0E7QUFDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLG9CQUFBO0lBQ0EsV0FBQTtDQUNBO0NBQ0E7QUFDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLG9CQUFBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlBvcG92ZXIudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWydwb3BvdmVyJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImFycm93XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxoMyBjbGFzcz1cXFwicG9wb3Zlci10aXRsZVxcXCIgdi1pZj1cXFwidGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcInRpdGxlXFxcIj57e3RpdGxlfX08L3Nsb3Q+PC9oMz5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInBvcG92ZXItY29udGVudFxcXCI+PHNsb3QgbmFtZT1cXFwiY29udGVudFxcXCI+PHNwYW4gdi1odG1sPVxcXCJjb250ZW50XFxcIj48L3NwYW4+PC9zbG90PjwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L3RyYW5zaXRpb24+XFxyXFxuICA8L3NwYW4+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCBQb3BvdmVyTWl4aW4gZnJvbSAnLi91dGlscy9wb3BvdmVyTWl4aW5zLmpzJ1xcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIG1peGluczogW1BvcG92ZXJNaXhpbl0sXFxyXFxuICBwcm9wczoge1xcclxcbiAgICB0cmlnZ2VyOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLnBvcG92ZXIudG9wLFxcclxcbi5wb3BvdmVyLmxlZnQsXFxyXFxuLnBvcG92ZXIucmlnaHQsXFxyXFxuLnBvcG92ZXIuYm90dG9tIHtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbn1cXHJcXG4uc2NhbGUtZW50ZXIge1xcclxcbiAgYW5pbWF0aW9uOnNjYWxlLWluIDAuMTVzIGVhc2UtaW47XFxyXFxufVxcclxcbi5zY2FsZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNjYWxlLW91dCAwLjE1cyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzY2FsZS1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzY2FsZS1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9wb3BvdmVyTWl4aW5zID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDMpO1xuXHRcblx0dmFyIF9wb3BvdmVyTWl4aW5zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BvcG92ZXJNaXhpbnMpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBtaXhpbnM6IFtfcG9wb3Zlck1peGluczIuZGVmYXVsdF0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxNDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGNvbnRlbnQ6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZmFkZScgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndG9wJyB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgdG9wOiAwLFxuXHQgICAgICBsZWZ0OiAwLFxuXHQgICAgICBzaG93OiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgZXZlbnRzOiBmdW5jdGlvbiBldmVudHMoKSB7XG5cdCAgICAgIHJldHVybiB7IGNvbnRleHRtZW51OiBbJ2NvbnRleHRtZW51J10sIGhvdmVyOiBbJ21vdXNlbGVhdmUnLCAnbW91c2VlbnRlciddLCBmb2N1czogWydibHVyJywgJ2ZvY3VzJ10gfVt0aGlzLnRyaWdnZXJdIHx8IFsnY2xpY2snXTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJlZm9yZUVudGVyOiBmdW5jdGlvbiBiZWZvcmVFbnRlcigpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMucG9zaXRpb24oKTtcblx0ICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIF90aGlzLnBvc2l0aW9uKCk7XG5cdCAgICAgIH0sIDMwKTtcblx0ICAgIH0sXG5cdCAgICBwb3NpdGlvbjogZnVuY3Rpb24gcG9zaXRpb24oKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBwb3BvdmVyID0gX3RoaXMyLiRyZWZzLnBvcG92ZXI7XG5cdCAgICAgICAgdmFyIHRyaWdnZXIgPSBfdGhpczIuJHJlZnMudHJpZ2dlci5jaGlsZHJlblswXTtcblx0ICAgICAgICBzd2l0Y2ggKF90aGlzMi5wbGFjZW1lbnQpIHtcblx0ICAgICAgICAgIGNhc2UgJ3RvcCc6XG5cdCAgICAgICAgICAgIF90aGlzMi5sZWZ0ID0gdHJpZ2dlci5vZmZzZXRMZWZ0IC0gcG9wb3Zlci5vZmZzZXRXaWR0aCAvIDIgKyB0cmlnZ2VyLm9mZnNldFdpZHRoIC8gMjtcblx0ICAgICAgICAgICAgX3RoaXMyLnRvcCA9IHRyaWdnZXIub2Zmc2V0VG9wIC0gcG9wb3Zlci5vZmZzZXRIZWlnaHQ7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAnbGVmdCc6XG5cdCAgICAgICAgICAgIF90aGlzMi5sZWZ0ID0gdHJpZ2dlci5vZmZzZXRMZWZ0IC0gcG9wb3Zlci5vZmZzZXRXaWR0aDtcblx0ICAgICAgICAgICAgX3RoaXMyLnRvcCA9IHRyaWdnZXIub2Zmc2V0VG9wICsgdHJpZ2dlci5vZmZzZXRIZWlnaHQgLyAyIC0gcG9wb3Zlci5vZmZzZXRIZWlnaHQgLyAyO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgJ3JpZ2h0Jzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgKyB0cmlnZ2VyLm9mZnNldFdpZHRoO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodCAvIDIgLSBwb3BvdmVyLm9mZnNldEhlaWdodCAvIDI7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAnYm90dG9tJzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoIC8gMiArIHRyaWdnZXIub2Zmc2V0V2lkdGggLyAyO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodDtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1dyb25nIHBsYWNlbWVudCBwcm9wJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHBvcG92ZXIuc3R5bGUudG9wID0gX3RoaXMyLnRvcCArICdweCc7XG5cdCAgICAgICAgcG9wb3Zlci5zdHlsZS5sZWZ0ID0gX3RoaXMyLmxlZnQgKyAncHgnO1xuXHQgICAgICB9KTtcblx0ICAgIH0sXG5cdCAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZShlKSB7XG5cdCAgICAgIGlmIChlICYmIHRoaXMudHJpZ2dlciA9PT0gJ2NvbnRleHRtZW51JykgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICBpZiAodGhpcy5zaG93KSB0aGlzLmJlZm9yZUVudGVyKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cdFxuXHQgICAgdmFyIHRyaWdnZXIgPSB0aGlzLiRyZWZzLnRyaWdnZXIuY2hpbGRyZW5bMF07XG5cdCAgICBpZiAoIXRyaWdnZXIpIHJldHVybiBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgZmluZCB0cmlnZ2VyIHYtZWwgaW4geW91ciBjb21wb25lbnQgdGhhdCB1c2VzIHBvcG92ZXJNaXhpbi4nKTtcblx0XG5cdCAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnICYmICF+dHJpZ2dlci50YWJJbmRleCkge1xuXHQgICAgICB0cmlnZ2VyID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJ2EsaW5wdXQsc2VsZWN0LHRleHRhcmVhLGJ1dHRvbicsIHRyaWdnZXIpO1xuXHQgICAgICBpZiAoIXRyaWdnZXIubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0cmlnZ2VyKS5vbihldmVudCwgX3RoaXMzLnRvZ2dsZSk7XG5cdCAgICB9KTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fdHJpZ2dlcikgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fdHJpZ2dlcikub2ZmKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTQ0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWydwb3BvdmVyJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhcnJvd1wiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0udGl0bGUpID8gX3ZtLl9jKCdoMycsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBvcG92ZXItdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3QoXCJ0aXRsZVwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJwb3BvdmVyLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJjb250ZW50XCIsIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMjQ2NWJmNTRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ2KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0Nylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQcm9ncmVzc2Jhci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNjhhYTMzNzVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTY4YWEzMzc1XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUHJvZ3Jlc3NiYXIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQ2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYW5pbWF0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhYmVsOiB7IGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBub3c6IHsgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHN0cmlwZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBsYWJlbEJvb2w6IGZ1bmN0aW9uIGxhYmVsQm9vbCgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLmxhYmVsKTtcblx0ICAgIH0sXG5cdCAgICBub3dOdW06IGZ1bmN0aW9uIG5vd051bSgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UubnVtYmVyKHRoaXMubm93KTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxNDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncHJvZ3Jlc3MtYmFyJywgJ3Byb2dyZXNzLWJhci0nICsgX3ZtLnR5cGUsIHtcblx0ICAgICAgYWN0aXZlOiBfdm0uYW5pbWF0ZWQsXG5cdCAgICAgICdwcm9ncmVzcy1iYXItc3RyaXBlZCc6IF92bS5zdHJpcGVkXG5cdCAgICB9XSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLm5vd051bSArICclJ1xuXHQgICAgfSksXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInRleHRDb250ZW50XCI6IF92bS5fcyhfdm0ubGFiZWxCb29sID8gX3ZtLm5vd051bSArICclJyA6IG51bGwpXG5cdCAgICB9XG5cdCAgfSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNjhhYTMzNzVcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTQ5KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUxKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Milcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxSYWRpby52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzRjZmQ5MmNcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTc0Y2ZkOTJjXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUmFkaW8udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQ5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTApO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTc0Y2ZkOTJjIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9SYWRpby52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTc0Y2ZkOTJjIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9SYWRpby52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnJhZGlvIHsgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0IHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjE1cmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuN3JlbTtcXHJcXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxyXFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZC1zaXplOiA1MCUgNTAlO1xcbn1cXG4ucmFkaW86bm90KC5hY3RpdmUpID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2JiYjtcXG59XFxuLnJhZGlvID4gbGFiZWwgPiBpbnB1dDpmb2N1cyB+IC5pY29uIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjNjZhZmU5O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxuLnJhZGlvLmFjdGl2ZSA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1zaXplOiAxcmVtIDFyZW07XFxyXFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p4emRtY2dkbVZ5YzJsdmJqMGlNUzR4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpUGp4amFYSmpiR1VnWTNnOUlqVWlJR041UFNJMUlpQnlQU0kwSWlCbWFXeHNQU0lqWm1abUlpOCtQQzl6ZG1jKyk7XFxufVxcbi5yYWRpby5hY3RpdmUgLmJ0bi1kZWZhdWx0IHsgZmlsdGVyOiBicmlnaHRuZXNzKDc1JSk7XFxufVxcbi5yYWRpby5kaXNhYmxlZCA+IGxhYmVsID4gLmljb24sXFxyXFxuLnJhZGlvLnJlYWRvbmx5ID4gbGFiZWwgPiAuaWNvbixcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcbn1cXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPXJhZGlvXSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUmFkaW8udnVlPzExNjI0YzQ4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUE4R0EsU0FBQSxtQkFBQTtDQUFBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLFVBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLFlBQUE7RUFDQSxRQUFBO0VBQ0EsZUFBQTtFQUNBLGNBQUE7RUFDQSxlQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtFQUNBLHFCQUFBO0VBQ0EsNkJBQUE7RUFDQSxtQ0FBQTtFQUNBLHlCQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLDBCQUFBO0VBQ0EsMEVBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7RUFDQSw4T0FBQTtDQUNBO0FBQ0EsNkJBQUEsd0JBQUE7Q0FBQTtBQUVBOzs7RUFHQSwwQkFBQTtFQUNBLGlCQUFBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiUmFkaW8udnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgOmlzPVxcXCJidXR0b25TdHlsZT8nbGFiZWwnOidkaXYnXFxcIiBAY2xpY2sucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICA6Y2xhc3M9XFxcIlsoYnV0dG9uU3R5bGU/J2J0biBidG4tJyt0eXBlQ29sb3I6J3JhZGlvICcrdHlwZUNvbG9yKSx7YWN0aXZlOmFjdGl2ZSxkaXNhYmxlZDpkaXNhYmxlZCxyZWFkb25seTpyZWFkb25seX1dXFxcIlxcclxcbiAgPlxcclxcbiAgICA8dGVtcGxhdGUgdi1pZj1cXFwiYnV0dG9uU3R5bGVcXFwiPlxcclxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJyYWRpb1xcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICB2LXNob3c9XFxcIiFyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcImNoZWNrXFxcIlxcclxcbiAgICAgICAgOnZhbHVlPVxcXCJzZWxlY3RlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPGxhYmVsIHYtZWxzZSBjbGFzcz1cXFwib3BlblxcXCI+XFxyXFxuICAgICAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcImNoZWNrXFxcIlxcclxcbiAgICAgICAgOnZhbHVlPVxcXCJzZWxlY3RlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbYWN0aXZlPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiYWN0aXZlJiZ0eXBlQ29sb3I9PT0nZGVmYXVsdCdcXFwiIGNsYXNzPVxcXCJpY29uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2xhYmVsPlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgc2VsZWN0ZWRWYWx1ZToge2RlZmF1bHQ6IHRydWV9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBmYWxzZX1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjaGVjazogdGhpcy52YWx1ZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgYWN0aXZlICgpIHsgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZSB9LFxcclxcbiAgICBpbkdyb3VwICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuYnRuR3JvdXAgJiYgIXRoaXMuJHBhcmVudC5fY2hlY2tib3hHcm91cCB9LFxcclxcbiAgICBwYXJlbnRWYWx1ZSAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQudmFsIH0sXFxyXFxuICAgIGJ1dHRvblN0eWxlICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LmJ0bkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICB0eXBlQ29sb3IgKCkgeyByZXR1cm4gKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSkgfHwgJ2RlZmF1bHQnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjaGVjayAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdmFsKSB7XFxyXFxuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB0cnVlKVxcclxcbiAgICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHZhbCkge1xcclxcbiAgICAgICAgdGhpcy5jaGVjayA9IHZhbFxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmNoZWNrID0gZmFsc2VcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnRcXHJcXG4gICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlXFxyXFxuICAgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgdXBkYXRlRnJvbVBhcmVudCgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XFxyXFxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHRoaXMuJHBhcmVudC52YWwpIHtcXHJcXG4gICAgICAgICAgdGhpcy5jaGVjayA9IHRoaXMuc2VsZWN0ZWRWYWx1ZVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgdGhpcy5jaGVjayA9IGZhbHNlXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB1cGRhdGVQYXJlbnQoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdGhpcy5jaGVjaykge1xcclxcbiAgICAgICAgICB0aGlzLiRwYXJlbnQudmFsID0gdGhpcy5zZWxlY3RlZFZhbHVlXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBmb2N1cyAoKSB7XFxyXFxuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICB0aGlzLmZvY3VzKClcXHJcXG4gICAgICBpZiAodGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLnNlbGVjdGVkVmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGU+XFxyXFxuLnJhZGlvIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9XFxyXFxuLnJhZGlvID4gbGFiZWwgPiBpbnB1dCB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHotaW5kZXg6IC0xO1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuLnJhZGlvID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4xNXJlbTtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAxLjRyZW07XFxyXFxuICBoZWlnaHQ6IDEuNHJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjdyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXHJcXG59XFxyXFxuLnJhZGlvOm5vdCguYWN0aXZlKSA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxyXFxufVxcclxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbiB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzY2YWZlOTtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxyXFxufVxcclxcbi5yYWRpby5hY3RpdmUgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZG1WeWMybHZiajBpTVM0eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaVBqeGphWEpqYkdVZ1kzZzlJalVpSUdONVBTSTFJaUJ5UFNJMElpQm1hV3hzUFNJalptWm1JaTgrUEM5emRtYyspO1xcclxcbn1cXHJcXG4ucmFkaW8uYWN0aXZlIC5idG4tZGVmYXVsdCB7IGZpbHRlcjogYnJpZ2h0bmVzcyg3NSUpOyB9XFxyXFxuXFxyXFxuLnJhZGlvLmRpc2FibGVkID4gbGFiZWwgPiAuaWNvbixcXHJcXG4ucmFkaW8ucmVhZG9ubHkgPiBsYWJlbCA+IC5pY29uLFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxyXFxufVxcclxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9cmFkaW9dIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE1MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2VsZWN0ZWRWYWx1ZTogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcblx0ICAgIH0sXG5cdCAgICBpbkdyb3VwOiBmdW5jdGlvbiBpbkdyb3VwKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiAhdGhpcy4kcGFyZW50Ll9jaGVja2JveEdyb3VwO1xuXHQgICAgfSxcblx0ICAgIHBhcmVudFZhbHVlOiBmdW5jdGlvbiBwYXJlbnRWYWx1ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWw7XG5cdCAgICB9LFxuXHQgICAgYnV0dG9uU3R5bGU6IGZ1bmN0aW9uIGJ1dHRvblN0eWxlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICB0eXBlQ29sb3I6IGZ1bmN0aW9uIHR5cGVDb2xvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIGNoZWNrOiBmdW5jdGlvbiBjaGVjayh2YWwpIHtcblx0ICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB0cnVlKTtcblx0ICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudCgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLnVwZGF0ZUZyb21QYXJlbnQoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWUgPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy5jaGVjayA9IHZhbDtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmNoZWNrID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICBpZiAodGhpcy5pbkdyb3VwKSB7XG5cdCAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICAgIHBhcmVudC5fcmFkaW9Hcm91cCA9IHRydWU7XG5cdCAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHVwZGF0ZUZyb21QYXJlbnQ6IGZ1bmN0aW9uIHVwZGF0ZUZyb21QYXJlbnQoKSB7XG5cdCAgICAgIGlmICh0aGlzLmluR3JvdXApIHtcblx0ICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHRoaXMuJHBhcmVudC52YWwpIHtcblx0ICAgICAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLnNlbGVjdGVkVmFsdWU7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuY2hlY2sgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB1cGRhdGVQYXJlbnQ6IGZ1bmN0aW9uIHVwZGF0ZVBhcmVudCgpIHtcblx0ICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWUgPT09IHRoaXMuY2hlY2spIHtcblx0ICAgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB0aGlzLnNlbGVjdGVkVmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZm9jdXMoKTtcblx0ICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5jaGVjayA9IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uYnV0dG9uU3R5bGUgPyAnbGFiZWwnIDogJ2RpdicsIHtcblx0ICAgIHRhZzogXCJkaXZcIixcblx0ICAgIGNsYXNzOiBbKF92bS5idXR0b25TdHlsZSA/ICdidG4gYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJ3JhZGlvICcgKyBfdm0udHlwZUNvbG9yKSwge1xuXHQgICAgICBhY3RpdmU6IF92bS5hY3RpdmUsXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHlcblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFsoX3ZtLmJ1dHRvblN0eWxlKSA/IFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoIV92bS5yZWFkb25seSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiIXJlYWRvbmx5XCJcblx0ICAgIH0sIHtcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY2hlY2spLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNoZWNrXCJcblx0ICAgIH1dLFxuXHQgICAgcmVmOiBcImlucHV0XCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJyYWRpb1wiLFxuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWUsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcImRpc2FibGVkXCI6IF92bS5kaXNhYmxlZFxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLnNlbGVjdGVkVmFsdWUsXG5cdCAgICAgIFwiY2hlY2tlZFwiOiBfdm0uX3EoX3ZtLmNoZWNrLCBfdm0uc2VsZWN0ZWRWYWx1ZSlcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jaGVjayA9IF92bS5zZWxlY3RlZFZhbHVlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0gOiBfdm0uX2MoJ2xhYmVsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwib3BlblwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVjayksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInJhZGlvXCIsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uc2VsZWN0ZWRWYWx1ZSxcblx0ICAgICAgXCJjaGVja2VkXCI6IF92bS5fcShfdm0uY2hlY2ssIF92bS5zZWxlY3RlZFZhbHVlKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLmNoZWNrID0gX3ZtLnNlbGVjdGVkVmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uYWN0aXZlID8gJ2J0bi0nICsgX3ZtLnR5cGVDb2xvciA6ICcnLCB7XG5cdCAgICAgIGJnOiBfdm0udHlwZUNvbG9yID09PSAnZGVmYXVsdCdcblx0ICAgIH1dXG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uYWN0aXZlICYmIF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0JykgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uXCJcblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03NGNmZDkyY1wiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNTQpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTYpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTU3KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNlbGVjdC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdF9fdnVlX29wdGlvbnNfXy5fc2NvcGVJZCA9IFwiZGF0YS12LWU1MTRkYmM2XCJcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1lNTE0ZGJjNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtZTUxNGRiYzZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTZWxlY3QudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTU0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTUpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWU1MTRkYmM2JnNjb3BlZD10cnVlIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TZWxlY3QudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1lNTE0ZGJjNiZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU2VsZWN0LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZde1xcclxcbiAgaGVpZ2h0OiBhdXRvO1xcclxcbiAgcGFkZGluZy1yaWdodDogMjRweDtcXG59XFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGVbZGF0YS12LWU1MTRkYmM2XTphZnRlcntcXHJcXG4gIGNvbnRlbnQ6ICcgJztcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHJpZ2h0OiAxM3B4O1xcclxcbiAgdG9wOiA1MCU7XFxyXFxuICBtYXJnaW46IC0xcHggMCAwO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IGRhc2hlZDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBzb2xpZCBcXFxcOTtcXHJcXG4gIGJvcmRlci1yaWdodDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXG59XFxuLmJzLXNlYXJjaGJveFtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIG1hcmdpbjogNHB4IDhweDtcXG59XFxuLmJzLXNlYXJjaGJveCAuY2xvc2VbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5icy1zZWFyY2hib3ggaW5wdXRbZGF0YS12LWU1MTRkYmM2XTpmb2N1cyxcXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZdOmZvY3VzIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXItY29sb3I6ICM2NmFmZTkgIWltcG9ydGFudDtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxufVxcbi5zZWNyZXRbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBjbGlwOiByZWN0KDAgMCAwIDApO1xcclxcbiAgaGVpZ2h0OiAxcHg7XFxyXFxuICBtYXJnaW46IC0xcHg7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxcHg7XFxufVxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlPi5jbG9zZVtkYXRhLXYtZTUxNGRiYzZdIHsgbWFyZ2luLWxlZnQ6IDVweDtcXG59XFxuLm5vdGlmeS5vdXRbZGF0YS12LWU1MTRkYmM2XSB7IHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLm5vdGlmeS5pbltkYXRhLXYtZTUxNGRiYzZdLFxcclxcbi5ub3RpZnk+ZGl2W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDk2JTtcXHJcXG4gIG1hcmdpbjogMCAyJTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDI2cHg7XFxyXFxuICBwYWRkaW5nOiAzcHggNXB4O1xcclxcbiAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNlM2UzZTM7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcbi5ub3RpZnk+ZGl2W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgdG9wOiA1cHg7XFxyXFxuICB6LWluZGV4OiAxO1xcbn1cXG4ubm90aWZ5LmluW2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgb3BhY2l0eTogLjk7XFxyXFxuICBib3R0b206IDVweDtcXG59XFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLXRvZ2dsZT5zcGFuW2RhdGEtdi1lNTE0ZGJjNl06bm90KC5jbG9zZSkge1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDE4cHgpO1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG4gIG1hcmdpbi1ib3R0b206IC00cHg7XFxufVxcbi5idG4tZ3JvdXAtanVzdGlmaWVkIC5kcm9wZG93bi1tZW51W2RhdGEtdi1lNTE0ZGJjNl0geyB3aWR0aDogMTAwJTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9TZWxlY3QudnVlPzY4Mjk4YzEzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF1UUE7RUFDQSxhQUFBO0VBQ0Esb0JBQUE7Q0FDQTtBQUNBO0VBQ0EsYUFBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLFNBQUE7RUFDQSxpQkFBQTtFQUNBLHVCQUFBO0VBQ0EseUJBQUE7RUFDQSxvQ0FBQTtFQUNBLG1DQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTs7RUFFQSxXQUFBO0VBQ0EsaUNBQUE7RUFDQSwwRUFBQTtDQUNBO0FBQ0E7RUFDQSxVQUFBO0VBQ0Esb0JBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGlCQUFBO0VBQ0EsV0FBQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtDQUNBO0FBQ0Esd0RBQUEsaUJBQUE7Q0FBQTtBQUNBLCtCQUFBLG1CQUFBO0NBQUE7QUFDQTs7RUFFQSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxhQUFBO0VBQ0EsaUJBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0EsMEJBQUE7RUFDQSw0Q0FBQTtFQUNBLHFCQUFBO0NBQ0E7QUFDQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0Esd0JBQUE7RUFDQSxvQkFBQTtDQUNBO0FBQ0EsdURBQUEsWUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJTZWxlY3QudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgcmVmPVxcXCJzZWxlY3RcXFwiIDpjbGFzcz1cXFwiY2xhc3Nlc1xcXCIgdi1jbGljay1vdXRzaWRlPVxcXCJjbG9zZVxcXCI+XFxyXFxuICAgIDxkaXYgcmVmPVxcXCJidG5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZHJvcGRvd24tdG9nZ2xlXFxcIiB0YWJpbmRleD1cXFwiMVxcXCIgOmRpc2FibGVkPVxcXCJkaXNhYmxlZCB8fCAhaGFzUGFyZW50XFxcIiA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgIEBibHVyPVxcXCJjYW5TZWFyY2ggPyBudWxsIDogY2xvc2UoKVxcXCJcXHJcXG4gICAgICBAY2xpY2s9XFxcInRvZ2dsZSgpXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVzYy5zdG9wLnByZXZlbnQ9XFxcImNsb3NlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLnNwYWNlLnN0b3AucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVudGVyLnN0b3AucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICA+XFxyXFxuICAgICAgPHNwYW4gY2xhc3M9XFxcImJ0bi1jb250ZW50XFxcIiB2LWh0bWw9XFxcImxvYWRpbmcgPyB0ZXh0LmxvYWRpbmcgOiBzaG93UGxhY2Vob2xkZXIgfHwgKG11bHRpcGxlICYmIHNob3dDb3VudCA/IHNlbGVjdGVkVGV4dCA6IHNlbGVjdGVkKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWx1ZXMubGVuZ3RoXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwiY2xlYXIoKVxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDxzZWxlY3QgcmVmPVxcXCJzZWxcXFwiIHYtbW9kZWw9XFxcInZhbFxcXCIgOm5hbWU9XFxcIm5hbWVcXFwiIGNsYXNzPVxcXCJzZWNyZXRcXFwiIDptdWx0aXBsZT1cXFwibXVsdGlwbGVcXFwiIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1pZj1cXFwicmVxdWlyZWRcXFwiIHZhbHVlPVxcXCJcXFwiPjwvb3B0aW9uPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wdGlvbiBpbiBsaXN0XFxcIiA6dmFsdWU9XFxcIm9wdGlvbltvcHRpb25zVmFsdWVdXFxcIj57eyBvcHRpb25bb3B0aW9uc0xhYmVsXSB9fTwvb3B0aW9uPlxcclxcbiAgICA8L3NlbGVjdD5cXHJcXG4gICAgPHVsIGNsYXNzPVxcXCJkcm9wZG93bi1tZW51XFxcIj5cXHJcXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cXFwibGlzdC5sZW5ndGhcXFwiPlxcclxcbiAgICAgICAgPGxpIHYtaWY9XFxcImNhblNlYXJjaFxcXCIgY2xhc3M9XFxcImJzLXNlYXJjaGJveFxcXCI+XFxyXFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiA6cGxhY2Vob2xkZXI9XFxcInNlYXJjaFRleHR8fHRleHQuc2VhcmNoXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJzZWFyY2hcXFwiXFxyXFxuICAgICAgICAgICAgdi1tb2RlbD1cXFwic2VhcmNoVmFsdWVcXFwiXFxyXFxuICAgICAgICAgICAgQGtleXVwLmVzYz1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgICAgIC8+XFxyXFxuICAgICAgICAgIDxzcGFuIHYtc2hvdz1cXFwic2VhcmNoVmFsdWVcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJjbGVhclNlYXJjaFxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDwvbGk+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwicmVxdWlyZWQmJiFjbGVhckJ1dHRvblxcXCI+PGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJjbGVhcigpICYmIGNsb3NlKClcXFwiPnt7IHBsYWNlaG9sZGVyIHx8IHRleHQubm90U2VsZWN0ZWQgfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDxsaSB2LWZvcj1cXFwib3B0aW9uIGluIGZpbHRlcmVkT3B0aW9uc1xcXCIgOmlkPVxcXCJvcHRpb25bb3B0aW9uc1ZhbHVlXVxcXCI+XFxyXFxuICAgICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwic2VsZWN0KG9wdGlvbltvcHRpb25zVmFsdWVdKVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1odG1sPVxcXCJvcHRpb25bb3B0aW9uc0xhYmVsXVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcXFwiIHYtc2hvdz1cXFwiaXNTZWxlY3RlZChvcHRpb25bb3B0aW9uc1ZhbHVlXSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9hPlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgIWNsb3NlT25TZWxlY3RcXFwiIG5hbWU9XFxcImZhZGVpblxcXCI+PGRpdiBjbGFzcz1cXFwibm90aWZ5IGluXFxcIj57e2xpbWl0VGV4dH19PC9kaXY+PC90cmFuc2l0aW9uPlxcclxcbiAgICA8L3VsPlxcclxcbiAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgY2xvc2VPblNlbGVjdFxcXCIgbmFtZT1cXFwiZmFkZWluXFxcIj48ZGl2IGNsYXNzPVxcXCJub3RpZnkgb3V0XFxcIj48ZGl2Pnt7bGltaXRUZXh0fX08L2Rpdj48L2Rpdj48L3RyYW5zaXRpb24+XFxyXFxuICAgIDwhLS0gPHByZT5PcHRpb25zOiB7e2xpc3R9fTwvcHJlPiAtLT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge3RyYW5zbGF0aW9uc30gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgQ2xpY2tPdXRzaWRlIGZyb20gJy4vZGlyZWN0aXZlcy9DbGlja091dHNpZGUuanMnXFxyXFxuXFxyXFxudmFyIHRpbWVvdXQgPSB7fVxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIGRpcmVjdGl2ZXM6IHtcXHJcXG4gICAgQ2xpY2tPdXRzaWRlXFxyXFxuICB9LFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNsb3NlT25TZWxlY3Q6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBsaW1pdDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNH0sXFxyXFxuICAgIG1pblNlYXJjaDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG11bHRpcGxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgb3B0aW9uczoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICBvcHRpb25zTGFiZWw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCd9LFxcclxcbiAgICBvcHRpb25zVmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZSd9LFxcclxcbiAgICBwYXJlbnQ6IHtkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgcGxhY2Vob2xkZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzZWFyY2g6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHNlYXJjaFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBjb3VudFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzaG93Q291bnQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHVybDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiBudWxsXFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgbGlzdDogW10sXFxyXFxuICAgICAgbG9hZGluZzogbnVsbCxcXHJcXG4gICAgICBzZWFyY2hWYWx1ZTogbnVsbCxcXHJcXG4gICAgICBzaG93OiBmYWxzZSxcXHJcXG4gICAgICBub3RpZnk6IGZhbHNlLFxcclxcbiAgICAgIHZhbDogbnVsbCxcXHJcXG4gICAgICB2YWxpZDogbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgY2FuU2VhcmNoICgpIHsgcmV0dXJuIHRoaXMubWluU2VhcmNoID8gdGhpcy5saXN0Lmxlbmd0aCA+PSB0aGlzLm1pblNlYXJjaCA6IHRoaXMuc2VhcmNoIH0sXFxyXFxuICAgIGNsYXNzZXMgKCkgeyByZXR1cm4gW3tvcGVuOiB0aGlzLnNob3csIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkfSwgdGhpcy5jbGFzcywgdGhpcy5pc0xpID8gJ2Ryb3Bkb3duJyA6IHRoaXMuaW5JbnB1dCA/ICdpbnB1dC1ncm91cC1idG4nIDogJ2J0bi1ncm91cCddIH0sXFxyXFxuICAgIGZpbHRlcmVkT3B0aW9ucyAoKSB7XFxyXFxuICAgICAgdmFyIHNlYXJjaCA9ICh0aGlzLnNlYXJjaFZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgcmV0dXJuICFzZWFyY2ggPyB0aGlzLmxpc3QgOiB0aGlzLmxpc3QuZmlsdGVyKGVsID0+IHtcXHJcXG4gICAgICAgIHJldHVybiB+ZWxbdGhpcy5vcHRpb25zTGFiZWxdLnRvTG93ZXJDYXNlKCkuc2VhcmNoKHNlYXJjaClcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LFxcclxcbiAgICBoYXNQYXJlbnQgKCkgeyByZXR1cm4gdGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBBcnJheSA/IHRoaXMucGFyZW50Lmxlbmd0aCA6IHRoaXMucGFyZW50IH0sXFxyXFxuICAgIGluSW5wdXQgKCkgeyByZXR1cm4gdGhpcy4kcGFyZW50Ll9pbnB1dCB9LFxcclxcbiAgICBpc0xpICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0IH0sXFxyXFxuICAgIGxpbWl0VGV4dCAoKSB7IHJldHVybiB0aGlzLnRleHQubGltaXQucmVwbGFjZSgne3tsaW1pdH19JywgdGhpcy5saW1pdCkgfSxcXHJcXG4gICAgc2VsZWN0ZWQgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmxpc3QubGVuZ3RoID09PSAwKSB7IHJldHVybiAnJyB9XFxyXFxuICAgICAgdmFyIHNlbCA9IHRoaXMudmFsdWVzLm1hcCh2YWwgPT4gKHRoaXMubGlzdC5maW5kKG8gPT4gb1t0aGlzLm9wdGlvbnNWYWx1ZV0gPT09IHZhbCkgfHwge30pW3RoaXMub3B0aW9uc0xhYmVsXSkuZmlsdGVyKHZhbCA9PiB2YWwgIT09IHVuZGVmaW5lZClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdzZWxlY3RlZCcsIHNlbClcXHJcXG4gICAgICByZXR1cm4gc2VsLmpvaW4oJywgJylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ZWRUZXh0ICgpIHsgcmV0dXJuIHRoaXMuY291bnRUZXh0IHx8IHRoaXMudGV4dC5zZWxlY3RlZC5yZXBsYWNlKCd7e2NvdW50fX0nLCB0aGlzLnZhbHVlcy5sZW5ndGgpIH0sXFxyXFxuICAgIHNob3dQbGFjZWhvbGRlciAoKSB7IHJldHVybiAodGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCkgPyAodGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQpIDogbnVsbCB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHZhbHVlcyAoKSB7IHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF0gfSxcXHJcXG4gICAgdmFsT3B0aW9ucyAoKSB7IHJldHVybiB0aGlzLmxpc3QubWFwKGVsID0+IGVsW3RoaXMub3B0aW9uc1ZhbHVlXSkgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIG9wdGlvbnMgKG9wdGlvbnMpIHtcXHJcXG4gICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLnNldE9wdGlvbnMob3B0aW9ucylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAodmFsKSB7XFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAoKSB7XFxyXFxuICAgICAgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdGhpcy52YWwgPSB2YWwgPSBudWxsIH1cXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgdmFsLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcXHJcXG4gICAgICAgIHRoaXMudmFsID0gdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWVcXHJcXG4gICAgICAgIGlmICh0aW1lb3V0LmxpbWl0KSBjbGVhclRpbWVvdXQodGltZW91dC5saW1pdClcXHJcXG4gICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGltZW91dC5saW1pdCA9IGZhbHNlXFxyXFxuICAgICAgICAgIHRoaXMubm90aWZ5ID0gZmFsc2VcXHJcXG4gICAgICAgIH0sIDE1MDApXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIGNoZWNrRGF0YSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcXHJcXG4gICAgICAgIGlmICh0aGlzLmxpbWl0IDwgMSkgeyB0aGlzLmxpbWl0ID0gMSB9XFxyXFxuICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xcclxcbiAgICAgICAgICB0aGlzLnZhbCA9ICh0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkKSA/IFtdIDogW3RoaXMudmFsXVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9uc1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbC5maWx0ZXIoZWwgPT4gfnZhbHVlcy5pbmRleE9mKGVsKSlcXHJcXG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgaWYgKCF+dGhpcy52YWxPcHRpb25zLmluZGV4T2YodGhpcy52YWwpKSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBjbGVhciAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDogbnVsbFxcclxcbiAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgY2xlYXJTZWFyY2ggKCkge1xcclxcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgaXNTZWxlY3RlZCAodikge1xcclxcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTFcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ICh2KSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKVxcclxcbiAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xcclxcbiAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgbmV3VmFsLnB1c2godilcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMudmFsID0gbmV3VmFsXFxyXFxuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2XFxyXFxuICAgICAgICB0aGlzLnRvZ2dsZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzZXRPcHRpb25zIChvcHRpb25zKSB7XFxyXFxuICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZWwgPT4ge1xcclxcbiAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7IHJldHVybiBlbCB9XFxyXFxuICAgICAgICBsZXQgb2JqID0ge31cXHJcXG4gICAgICAgIG9ialt0aGlzLm9wdGlvbnNMYWJlbF0gPSBlbFxcclxcbiAgICAgICAgb2JqW3RoaXMub3B0aW9uc1ZhbHVlXSA9IGVsXFxyXFxuICAgICAgICByZXR1cm4gb2JqXFxyXFxuICAgICAgfSlcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdvcHRpb25zJywgdGhpcy5saXN0KVxcclxcbiAgICB9LFxcclxcbiAgICB0b2dnbGUgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkICYmICF0aGlzLnNob3cpIHJldHVybjtcXHJcXG4gICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93XFxyXFxuICAgICAgaWYgKCF0aGlzLnNob3cpIHRoaXMuJHJlZnMuYnRuLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdXJsQ2hhbmdlZCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihyZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXVxcclxcbiAgICAgICAgdHJ5IHsgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSkgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyhkYXRhKVxcclxcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gICAgICB9LCByZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIH0pXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbGlkYXRlICgpIHtcXHJcXG4gICAgICByZXR1cm4gIXRoaXMucmVxdWlyZWQgPyB0cnVlIDogdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IHRoaXMudmFsLmxlbmd0aCA+IDAgOiB0aGlzLnZhbCAhPT0gbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpXFxyXFxuICAgIHRoaXMudmFsID0gdGhpcy52YWx1ZVxcclxcbiAgICB0aGlzLl9zZWxlY3QgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLnZhbCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLnBhcmVudCkgeyB0aGlzLnZhbCA9IG51bGwgfVxcclxcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWxbMF1cXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLmNoZWNrRGF0YSgpXFxyXFxuICAgIGlmICh0aGlzLnVybCkgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgbGV0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHsgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQgfVxcclxcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcylcXHJcXG4gICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucylcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gIH0sXFxyXFxuICBiZWZvcmVEZXN0cm95ICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkge1xcclxcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xle1xcclxcbiAgaGVpZ2h0OiBhdXRvO1xcclxcbiAgcGFkZGluZy1yaWdodDogMjRweDtcXHJcXG59XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU6YWZ0ZXJ7XFxyXFxuICBjb250ZW50OiAnICc7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICByaWdodDogMTNweDtcXHJcXG4gIHRvcDogNTAlO1xcclxcbiAgbWFyZ2luOiAtMXB4IDAgMDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBkYXNoZWQ7XFxyXFxuICBib3JkZXItdG9wOiA0cHggc29saWQgXFxcXDk7XFxyXFxuICBib3JkZXItcmlnaHQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG4gIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3gge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgbWFyZ2luOiA0cHggOHB4O1xcclxcbn1cXHJcXG4uYnMtc2VhcmNoYm94IC5jbG9zZSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3ggaW5wdXQ6Zm9jdXMsXFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlci1jb2xvcjogIzY2YWZlOSAhaW1wb3J0YW50O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXHJcXG59XFxyXFxuLnNlY3JldCB7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBjbGlwOiByZWN0KDAgMCAwIDApO1xcclxcbiAgaGVpZ2h0OiAxcHg7XFxyXFxuICBtYXJnaW46IC0xcHg7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxcHg7XFxyXFxufVxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlPi5jbG9zZSB7IG1hcmdpbi1sZWZ0OiA1cHg7fVxcclxcbi5ub3RpZnkub3V0IHsgcG9zaXRpb246IHJlbGF0aXZlOyB9XFxyXFxuLm5vdGlmeS5pbixcXHJcXG4ubm90aWZ5PmRpdiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB3aWR0aDogOTYlO1xcclxcbiAgbWFyZ2luOiAwIDIlO1xcclxcbiAgbWluLWhlaWdodDogMjZweDtcXHJcXG4gIHBhZGRpbmc6IDNweCA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2UzZTNlMztcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuLm5vdGlmeT5kaXYge1xcclxcbiAgdG9wOiA1cHg7XFxyXFxuICB6LWluZGV4OiAxO1xcclxcbn1cXHJcXG4ubm90aWZ5LmluIHtcXHJcXG4gIG9wYWNpdHk6IC45O1xcclxcbiAgYm90dG9tOiA1cHg7XFxyXFxufVxcclxcbi5idG4tZ3JvdXAtanVzdGlmaWVkIC5kcm9wZG93bi10b2dnbGU+c3Bhbjpub3QoLmNsb3NlKSB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gMThweCk7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogLTRweDtcXHJcXG59XFxyXFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLW1lbnUgeyB3aWR0aDogMTAwJTsgfVxcclxcbjwvc3R5bGU+XFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdHZhciB0aW1lb3V0ID0ge307XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBDbGlja091dHNpZGU6IF9DbGlja091dHNpZGUyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgY2xvc2VPblNlbGVjdDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNCB9LFxuXHQgICAgbWluU2VhcmNoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuXHQgICAgbXVsdGlwbGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcblx0ICAgICAgICByZXR1cm4gW107XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBvcHRpb25zTGFiZWw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbGFiZWwnIH0sXG5cdCAgICBvcHRpb25zVmFsdWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndmFsdWUnIH0sXG5cdCAgICBwYXJlbnQ6IHsgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZXF1aXJlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBzZWFyY2g6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHNlYXJjaFRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjb3VudFRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBzaG93Q291bnQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHVybDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgbGlzdDogW10sXG5cdCAgICAgIGxvYWRpbmc6IG51bGwsXG5cdCAgICAgIHNlYXJjaFZhbHVlOiBudWxsLFxuXHQgICAgICBzaG93OiBmYWxzZSxcblx0ICAgICAgbm90aWZ5OiBmYWxzZSxcblx0ICAgICAgdmFsOiBudWxsLFxuXHQgICAgICB2YWxpZDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgY2FuU2VhcmNoOiBmdW5jdGlvbiBjYW5TZWFyY2goKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaDtcblx0ICAgIH0sXG5cdCAgICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gW3sgb3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCB0aGlzLmNsYXNzLCB0aGlzLmlzTGkgPyAnZHJvcGRvd24nIDogdGhpcy5pbklucHV0ID8gJ2lucHV0LWdyb3VwLWJ0bicgOiAnYnRuLWdyb3VwJ107XG5cdCAgICB9LFxuXHQgICAgZmlsdGVyZWRPcHRpb25zOiBmdW5jdGlvbiBmaWx0ZXJlZE9wdGlvbnMoKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgc2VhcmNoID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cdCAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gfmVsW190aGlzLm9wdGlvbnNMYWJlbF0udG9Mb3dlckNhc2UoKS5zZWFyY2goc2VhcmNoKTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgaGFzUGFyZW50OiBmdW5jdGlvbiBoYXNQYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5wYXJlbnQubGVuZ3RoIDogdGhpcy5wYXJlbnQ7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0O1xuXHQgICAgfSxcblx0ICAgIGxpbWl0VGV4dDogZnVuY3Rpb24gbGltaXRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkOiBmdW5jdGlvbiBzZWxlY3RlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgc2VsID0gdGhpcy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICByZXR1cm4gKF90aGlzMi5saXN0LmZpbmQoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICAgIHJldHVybiBvW190aGlzMi5vcHRpb25zVmFsdWVdID09PSB2YWw7XG5cdCAgICAgICAgfSkgfHwge30pW190aGlzMi5vcHRpb25zTGFiZWxdO1xuXHQgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdGVkJywgc2VsKTtcblx0ICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkVGV4dDogZnVuY3Rpb24gc2VsZWN0ZWRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5jb3VudFRleHQgfHwgdGhpcy50ZXh0LnNlbGVjdGVkLnJlcGxhY2UoJ3t7Y291bnR9fScsIHRoaXMudmFsdWVzLmxlbmd0aCk7XG5cdCAgICB9LFxuXHQgICAgc2hvd1BsYWNlaG9sZGVyOiBmdW5jdGlvbiBzaG93UGxhY2Vob2xkZXIoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggPT09IDAgfHwgIXRoaXMuaGFzUGFyZW50ID8gdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQgOiBudWxsO1xuXHQgICAgfSxcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnZhbCA6IH5bbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKHRoaXMudmFsKSA/IFtdIDogW3RoaXMudmFsXTtcblx0ICAgIH0sXG5cdCAgICB2YWxPcHRpb25zOiBmdW5jdGlvbiB2YWxPcHRpb25zKCkge1xuXHQgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICAgIHJldHVybiB0aGlzLmxpc3QubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbFtfdGhpczMub3B0aW9uc1ZhbHVlXTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgb3B0aW9uczogZnVuY3Rpb24gb3B0aW9ucyhfb3B0aW9ucykge1xuXHQgICAgICBpZiAoX29wdGlvbnMgaW5zdGFuY2VvZiBBcnJheSkgdGhpcy5zZXRPcHRpb25zKF9vcHRpb25zKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCkge1xuXHQgICAgICBpZiAodmFsKSB7XG5cdCAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKTtcblx0ICAgICAgICAvLyBvbkJsdXIodGhpcy4kcmVmcy5zZWxlY3QsIGUgPT4geyB0aGlzLnNob3cgPSBmYWxzZSB9KVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcblx0ICAgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdXJsOiBmdW5jdGlvbiB1cmwoKSB7XG5cdCAgICAgIHRoaXMudXJsQ2hhbmdlZCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbGlkOiBmdW5jdGlvbiB2YWxpZCh2YWwsIG9sZCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IHZhbDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblx0XG5cdCAgICAgIGlmIChfdmFsID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IF92YWwgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChfdmFsICE9PSBvbGQpIHtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBfdmFsKTtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIF92YWwpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChfdmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgX3ZhbC5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSBfdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICAgIHRoaXMubm90aWZ5ID0gdHJ1ZTtcblx0ICAgICAgICBpZiAodGltZW91dC5saW1pdCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQubGltaXQpO1xuXHQgICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHRpbWVvdXQubGltaXQgPSBmYWxzZTtcblx0ICAgICAgICAgIF90aGlzNC5ub3RpZnkgPSBmYWxzZTtcblx0ICAgICAgICB9LCAxNTAwKTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBjaGVja0RhdGE6IGZ1bmN0aW9uIGNoZWNrRGF0YSgpIHtcblx0ICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcblx0ICAgICAgICBpZiAodGhpcy5saW1pdCA8IDEpIHtcblx0ICAgICAgICAgIHRoaXMubGltaXQgPSAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHQgICAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkID8gW10gOiBbdGhpcy52YWxdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy52YWxPcHRpb25zO1xuXHQgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgcmV0dXJuIH52YWx1ZXMuaW5kZXhPZihlbCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgaWYgKHRoaXMudmFsdWVzLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGlmICghfnRoaXMudmFsT3B0aW9ucy5pbmRleE9mKHRoaXMudmFsKSkge1xuXHQgICAgICAgICAgdGhpcy52YWwgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcblx0ICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyBbXSA6IG51bGw7XG5cdCAgICAgIHRoaXMudG9nZ2xlKCk7XG5cdCAgICB9LFxuXHQgICAgY2xlYXJTZWFyY2g6IGZ1bmN0aW9uIGNsZWFyU2VhcmNoKCkge1xuXHQgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG5cdCAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgaXNTZWxlY3RlZDogZnVuY3Rpb24gaXNTZWxlY3RlZCh2KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTE7XG5cdCAgICB9LFxuXHQgICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3Qodikge1xuXHQgICAgICBpZiAodGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKTtcblx0ICAgICAgICBpZiAofm5ld1ZhbC5pbmRleE9mKHYpKSB7XG5cdCAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgbmV3VmFsLnB1c2godik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMudmFsID0gbmV3VmFsO1xuXHQgICAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QpIHtcblx0ICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMudmFsID0gdjtcblx0ICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG5cdCAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7XG5cdCAgICAgICAgICByZXR1cm4gZWw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBvYmogPSB7fTtcblx0ICAgICAgICBvYmpbX3RoaXM1Lm9wdGlvbnNMYWJlbF0gPSBlbDtcblx0ICAgICAgICBvYmpbX3RoaXM1Lm9wdGlvbnNWYWx1ZV0gPSBlbDtcblx0ICAgICAgICByZXR1cm4gb2JqO1xuXHQgICAgICB9KTtcblx0ICAgICAgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHRoaXMubGlzdCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkICYmICF0aGlzLnNob3cpIHJldHVybjtcblx0ICAgICAgdGhpcy5zaG93ID0gIXRoaXMuc2hvdztcblx0ICAgICAgaWYgKCF0aGlzLnNob3cpIHRoaXMuJHJlZnMuYnRuLmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdXJsQ2hhbmdlZDogZnVuY3Rpb24gdXJsQ2hhbmdlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMudXJsIHx8ICF0aGlzLiRodHRwKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuJGh0dHAuZ2V0KHRoaXMudXJsKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHQgICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5ID8gcmVzcG9uc2UuZGF0YSA6IFtdO1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblx0ICAgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgICAgIF90aGlzNi5zZXRPcHRpb25zKGRhdGEpO1xuXHQgICAgICAgIF90aGlzNi5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgICAgX3RoaXM2LmNoZWNrRGF0YSgpO1xuXHQgICAgICB9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICBfdGhpczYubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgICB9KTtcblx0ICAgIH0sXG5cdCAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCA/IHRydWUgOiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwubGVuZ3RoID4gMCA6IHRoaXMudmFsICE9PSBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5fc2VsZWN0ID0gdHJ1ZTtcblx0ICAgIGlmICh0aGlzLnZhbCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLnBhcmVudCkge1xuXHQgICAgICB0aGlzLnZhbCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsWzBdO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jaGVja0RhdGEoKTtcblx0ICAgIGlmICh0aGlzLnVybCkgdGhpcy51cmxDaGFuZ2VkKCk7XG5cdCAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5jaGVja0RhdGEoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJjbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1jbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNsb3NlKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjbG9zZVwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJzZWxlY3RcIixcblx0ICAgIGNsYXNzOiBfdm0uY2xhc3Nlc1xuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJidG5cIixcblx0ICAgIHN0YXRpY0NsYXNzOiBcImZvcm0tY29udHJvbCBkcm9wZG93bi10b2dnbGVcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFiaW5kZXhcIjogXCIxXCIsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkIHx8ICFfdm0uaGFzUGFyZW50LFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uY2FuU2VhcmNoID8gbnVsbCA6IF92bS5jbG9zZSgpXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgpXG5cdCAgICAgIH0sXG5cdCAgICAgIFwia2V5ZG93blwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uY2xvc2UoJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInNwYWNlXCIsIDMyKSkgeyByZXR1cm47IH1cblx0ICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfV1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYnRuLWNvbnRlbnRcIixcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhfdm0ubG9hZGluZyA/IF92bS50ZXh0LmxvYWRpbmcgOiBfdm0uc2hvd1BsYWNlaG9sZGVyIHx8IChfdm0ubXVsdGlwbGUgJiYgX3ZtLnNob3dDb3VudCA/IF92bS5zZWxlY3RlZFRleHQgOiBfdm0uc2VsZWN0ZWQpKVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWx1ZXMubGVuZ3RoKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jbGVhcigpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc2VsZWN0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VsXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJzZWNyZXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJtdWx0aXBsZVwiOiBfdm0ubXVsdGlwbGUsXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNoYW5nZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucywgZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgcmV0dXJuIG8uc2VsZWN0ZWRcblx0ICAgICAgICB9KS5tYXAoZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgdmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTtcblx0ICAgICAgICAgIHJldHVybiB2YWxcblx0ICAgICAgICB9KVswXVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ucmVxdWlyZWQpID8gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInZhbHVlXCI6IFwiXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2woKF92bS5saXN0KSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJ2YWx1ZVwiOiBvcHRpb25bX3ZtLm9wdGlvbnNWYWx1ZV1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3Mob3B0aW9uW192bS5vcHRpb25zTGFiZWxdKSldKVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbKF92bS5saXN0Lmxlbmd0aCkgPyBbKF92bS5jYW5TZWFyY2gpID8gX3ZtLl9jKCdsaScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLXNlYXJjaGJveFwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VhcmNoXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0uc2VhcmNoVGV4dCB8fCBfdm0udGV4dC5zZWFyY2gsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0uc2VhcmNoVmFsdWUpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmNsb3NlKCRldmVudClcblx0ICAgICAgfSxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNlYXJjaFZhbHVlID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xlYXJTZWFyY2hcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0ucmVxdWlyZWQgJiYgIV92bS5jbGVhckJ1dHRvbikgPyBfdm0uX2MoJ2xpJywgW192bS5fYygnYScsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbGVhcigpICYmIF92bS5jbG9zZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ucGxhY2Vob2xkZXIgfHwgX3ZtLnRleHQubm90U2VsZWN0ZWQpKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9sKChfdm0uZmlsdGVyZWRPcHRpb25zKSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcImlkXCI6IG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uc2VsZWN0KG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKG9wdGlvbltfdm0ub3B0aW9uc0xhYmVsXSlcblx0ICAgICAgfVxuXHQgICAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICAgIHZhbHVlOiAoX3ZtLmlzU2VsZWN0ZWQob3B0aW9uW192bS5vcHRpb25zVmFsdWVdKSksXG5cdCAgICAgICAgZXhwcmVzc2lvbjogXCJpc1NlbGVjdGVkKG9wdGlvbltvcHRpb25zVmFsdWVdKVwiXG5cdCAgICAgIH1dLFxuXHQgICAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcIlxuXHQgICAgfSldKV0pXG5cdCAgfSldIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmICFfdm0uY2xvc2VPblNlbGVjdCkgPyBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogXCJmYWRlaW5cIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5vdGlmeSBpblwiXG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKSA6IF92bS5fZSgpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmIF92bS5jbG9zZU9uU2VsZWN0KSA/IF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVpblwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibm90aWZ5IG91dFwiXG5cdCAgfSwgW192bS5fYygnZGl2JywgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKV0pIDogX3ZtLl9lKCldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1lNTE0ZGJjNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNsaWRlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIxODViODJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMTg1YjgyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gU2xpZGVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC4kY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LmluZGV4ID09PSB0aGlzLmluZGV4O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuaW5kaWNhdG9yX2xpc3QpIHtcblx0ICAgICAgdGhpcy4kcGFyZW50LmluZGljYXRvcl9saXN0LnB1c2godGhpcy5pbmRleCk7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKHRoaXMuaW5kZXggPT09IDApIHtcblx0ICAgICAgdGhpcy4kZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIml0ZW1cIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIxODViODJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTYyKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTY0KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxTcGlubmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi04YjI5OGU3MFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtOGIyOThlNzBcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTcGlubmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYzKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi04YjI5OGU3MCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU3Bpbm5lci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LThiMjk4ZTcwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TcGlubmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE2MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5Aa2V5ZnJhbWVzIHNwaW4ge1xcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbn1cXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXG59XFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvU3Bpbm5lci52dWU/NjVmYzVhOGZcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJGQTtBQUNBO0lBQ0EsMEJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLGlDQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLDRCQUFBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLDRCQUFBO0VBQ0Esb0NBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsNklBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGFBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtDQUNBXCIsXCJmaWxlXCI6XCJTcGlubmVyLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLHNwaW5uZXJTaXplLHsnc3Bpbm5lci1maXhlZCc6Zml4ZWR9XVxcXCIgdi1zaG93PVxcXCJhY3RpdmV8fGxvY2tlZFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItd3JhcHBlclxcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3Bpbm5lci1jaXJjbGVcXFwiPjwvZGl2PlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItdGV4dFxcXCI+e3t0ZXh0fX08L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuY29uc3QgTUlOX1dBSVQgPSA1MDAgLy8gaW4gbXNcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBmaXhlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZ2xvYmFsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBzaXplOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbWQnfSxcXHJcXG4gICAgdGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcXHJcXG4gICAgICBsb2NrZWQ6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBzcGlubmVyU2l6ZSAoKSB7IHJldHVybiAnc3Bpbm5lci0nICsgKHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZSA6ICdzbScpIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBhY3RpdmUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7IHRoaXNbdmFsID8gJ3Nob3cnIDogJ2hpZGUnXSgpIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaGlkZSAoKSB7XFxyXFxuICAgICAgdmFyIGRlbGF5ID0gMFxcclxcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAob3B0aW9ucykge1xcclxcbiAgICAgIGlmIChvcHRpb25zKSB7XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy50ZXh0KSB7IHRoaXMudGV4dCA9IG9wdGlvbnMudGV4dCB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7IHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZSB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5maXhlZCkgeyB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZCB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIC8vIGJsb2NrIHNjcm9sbGluZyB3aGVuIHNwaW5uZXIgaXMgb25cXHJcXG4gICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nXFxyXFxuICAgICAgLy8gYWN0aXZhdGUgc3Bpbm5lclxcclxcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpXFxyXFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5fdW5sb2NrKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9ib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WVxcclxcbiAgICB0aGlzLl91bmxvY2sgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gICAgfSwgTUlOX1dBSVQpXFxyXFxuICAgIGlmICh0aGlzLmdsb2JhbCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lcikge1xcclxcbiAgICAgICAgdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lciA9IHRydWVcXHJcXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xcclxcbiAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xcclxcbiAgICAgICAgICBoaWRlICgpIHsgc2VsZi5oaWRlKCkgfSxcXHJcXG4gICAgICAgICAgc2hvdyAoKSB7IHNlbGYuc2hvdygpIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuJHJvb3QuJG9uKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fZ2xvYmFsKSB7XFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpoaWRlJywgdGhpcy5fZ2xvYmFsLmhpZGUpXFxyXFxuICAgICAgZGVsZXRlIHRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXJcXHJcXG4gICAgfVxcclxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc3Bpbm5lckFuaW1hdGlvbilcXHJcXG4gICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbkBrZXlmcmFtZXMgc3BpbiB7XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXHJcXG59XFxyXFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIE1JTl9XQUlUID0gNTAwOyAvLyBpbiBtc1xuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZml4ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGdsb2JhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdtZCcgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcblx0ICAgICAgbG9ja2VkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgc3Bpbm5lclNpemU6IGZ1bmN0aW9uIHNwaW5uZXJTaXplKCkge1xuXHQgICAgICByZXR1cm4gJ3NwaW5uZXItJyArICh0aGlzLnNpemUgPyB0aGlzLnNpemUgOiAnc20nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpc1t2YWwgPyAnc2hvdycgOiAnaGlkZSddKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG5cdCAgICAgIHZhciBkZWxheSA9IDA7XG5cdCAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyhvcHRpb25zKSB7XG5cdCAgICAgIGlmIChvcHRpb25zKSB7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGV4dCkge1xuXHQgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG5cdCAgICAgICAgICB0aGlzLnNpemUgPSBvcHRpb25zLnNpemU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChvcHRpb25zLmZpeGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgLy8gYmxvY2sgc2Nyb2xsaW5nIHdoZW4gc3Bpbm5lciBpcyBvblxuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuXHQgICAgICAvLyBhY3RpdmF0ZSBzcGlubmVyXG5cdCAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdCAgICAgIHRoaXMubG9ja2VkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fdW5sb2NrKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WTtcblx0ICAgIHRoaXMuX3VubG9jayA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9IHRoaXMuX2JvZHlPdmVyZmxvdztcblx0ICAgIH0sIE1JTl9XQUlUKTtcblx0ICAgIGlmICh0aGlzLmdsb2JhbCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXIpIHtcblx0ICAgICAgICB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xuXHQgICAgICAgICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcblx0ICAgICAgICAgICAgc2VsZi5oaWRlKCk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgICAgICAgc2VsZi5zaG93KCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6c2hvdycsIHRoaXMuX2dsb2JhbC5zaG93KTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9nbG9iYWwpIHtcblx0ICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpO1xuXHQgICAgICB0aGlzLiRyb290LiRvZmYoJ3NwaW5uZXI6OmhpZGUnLCB0aGlzLl9nbG9iYWwuaGlkZSk7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyO1xuXHQgICAgfVxuXHQgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NwaW5uZXJBbmltYXRpb24pO1xuXHQgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3c7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5hY3RpdmUgfHwgX3ZtLmxvY2tlZCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiYWN0aXZlfHxsb2NrZWRcIlxuXHQgICAgfV0sXG5cdCAgICBjbGFzczogWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLCBfdm0uc3Bpbm5lclNpemUsIHtcblx0ICAgICAgJ3NwaW5uZXItZml4ZWQnOiBfdm0uZml4ZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci13cmFwcGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzcGlubmVyLWNpcmNsZVwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci10ZXh0XCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LThiMjk4ZTcwXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFiLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0wOTg1ZTg3OFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMDk4NWU4NzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBUYWIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGZhZGVpbjogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIGFjdGl2ZSA9ICF0aGlzLl90YWJzIHx8IHRoaXMuX3RhYnMuc2hvdyA9PT0gdGhpcztcblx0ICAgICAgdGhpcy5mYWRlaW4gPSBmYWxzZTtcblx0ICAgICAgaWYgKGFjdGl2ZSkge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMuZmFkZWluID0gdHJ1ZTtcblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYWN0aXZlO1xuXHQgICAgfSxcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3RhYnMudGFicy5pbmRleE9mKHRoaXMpO1xuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl90YWJzID8gdGhpcy5fdGFicy5lZmZlY3QgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiID0gdHJ1ZTtcblx0ICAgIHZhciB0YWJzID0gdGhpcztcblx0ICAgIHdoaWxlICghdGhpcy5fdGFicyAmJiB0YWJzLiRwYXJlbnQpIHtcblx0ICAgICAgaWYgKHRhYnMuX2lzVGFiR3JvdXApIHtcblx0ICAgICAgICB0YWJzLnRhYnMucHVzaCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl90YWJHcm91cCA9IHRhYnM7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRhYnMuX2lzVGFicykge1xuXHQgICAgICAgIHRhYnMudGFicy5wdXNoKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3RhYnMgPSB0YWJzO1xuXHQgICAgICAgIGlmICghdGhpcy5fdGFiR3JvdXApIHRhYnMuaGVhZGVycy5wdXNoKHRoaXMpO1xuXHQgICAgICB9XG5cdCAgICAgIHRhYnMgPSB0YWJzLiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuX3RhYnMpIHRocm93IEVycm9yKCd0YWIgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgaWYgKHRoaXMuX3RhYkdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX3RhYkdyb3VwLnRhYnMgPSB0aGlzLl90YWJHcm91cC50YWJzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwgIT09IF90aGlzMjtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB0aGlzLl90YWJzLnRhYnMgPSB0aGlzLl90YWJzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbCAhPT0gX3RoaXMyO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl90YWJzKSB7XG5cdCAgICAgIGlmICh0aGlzLl90YWJzLmFjdGl2ZSA9PT0gdGhpcy5pbmRleCkge1xuXHQgICAgICAgIHRoaXMuX3RhYnMuaW5kZXggPSAwO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbmdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy4kcGFyZW50LnRhYnMuaW5kZXhPZih0aGlzKTtcblx0ICAgICAgICBpZiAofmlkKSB0aGlzLiRwYXJlbnQudGFicy5zcGxpY2UoaWQsIDEpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB2YXIgX2lkID0gdGhpcy5fdGFicy50YWJzLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIGlmICh+X2lkKSB0aGlzLl90YWJzLnRhYnMuc3BsaWNlKF9pZCwgMSk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwYW5lbFwiLFxuXHQgICAgY2xhc3M6IFsndGFiLXBhbmUnLCB7XG5cdCAgICAgICdhY3RpdmUgZmFkZSc6IF92bS5hY3RpdmUsXG5cdCAgICAgICdpbic6IF92bS5mYWRlaW5cblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwidGFicGFuZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMDk4NWU4NzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTcwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTcyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Mylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUYWJHcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNTVmYWYzY2JcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTU1ZmFmM2NiXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFiR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnRhYi1jb250ZW50IC50YWItcGFuZSB7IGRpc3BsYXk6IG5vbmU7XFxufVxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVGFiR3JvdXAudnVlPzIyYWUxYzA4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrQ0EseUJBQUEsY0FBQTtDQUFBO0FBQ0EsZ0NBQUEsZUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJUYWJHcm91cC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPjxzcGFuPjxzbG90Pjwvc2xvdD48L3NwYW4+PC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgdGFiczogW11cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGFjdGl2ZSAoKSB7IHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KSB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBibHVyICgpIHsgdGhpcy5zaG93ID0gZmFsc2UgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHsgdGhpcy5zaG93ID0gIXRoaXMuc2hvdyB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLiRwYXJlbnQpIHtcXHJcXG4gICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFxcXCd0IG5lc3QgdGFiLWdyb3Vwcy4nKVxcclxcbiAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJylcXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHRoaXMuX3RhYnMuaGVhZGVycy5wdXNoKHRoaXMpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4udGFiLWNvbnRlbnQgLnRhYi1wYW5lIHsgZGlzcGxheTogbm9uZTsgfVxcclxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7IH1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTcyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHNob3c6IGZhbHNlLFxuXHQgICAgICB0YWJzOiBbXVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUoKSB7XG5cdCAgICAgIHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuJHBhcmVudCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFwndCBuZXN0IHRhYi1ncm91cHMuJyk7XG5cdCAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50O1xuXHQgICAgdGhpcy5fdGFicy5oZWFkZXJzLnB1c2godGhpcyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTU1ZmFmM2NiXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFicy52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzAxMDBkZGZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTcwMTAwZGRmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFicy52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzAxMDBkZGYhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1RhYnMudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi03MDEwMGRkZiEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vVGFicy52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1RhYnMudnVlPzQzMTdiOWFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUEwRUE7RUFDQSxlQUFBO0NBQ0FcIixcImZpbGVcIjpcIlRhYnMudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgdGFicz5cXHJcXG4gICAgPHVsIDpjbGFzcz1cXFwibmF2U3R5bGVDbGFzc1xcXCIgcm9sZT1cXFwidGFibGlzdFxcXCI+XFxyXFxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCJoZWFkZXIgaW4gaGVhZGVyc1xcXCI+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwiaGVhZGVyLl9pc1RhYlxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmhlYWRlci5hY3RpdmUsIGRpc2FibGVkOmhlYWRlci5kaXNhYmxlZH1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QoaGVhZGVyKVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGEgaHJlZj1cXFwiI1xcXCIgdi1odG1sPVxcXCJoZWFkZXIuaGVhZGVyXFxcIj48L2E+PC9zbG90PlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICAgIDxkcm9wZG93biB2LWlmPVxcXCJoZWFkZXIuX2lzVGFiR3JvdXBcXFwiIDp0ZXh0PVxcXCJoZWFkZXIuaGVhZGVyXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aGVhZGVyLmFjdGl2ZX1cXFwiIDpkaXNhYmxlZD1cXFwiaGVhZGVyLmRpc2FibGVkXFxcIj5cXHJcXG4gICAgICAgICAgPGxpIHYtZm9yPVxcXCJ0YWIgaW4gaGVhZGVyLnRhYnNcXFwiIDpjbGFzcz1cXFwie2Rpc2FibGVkOnRhYi5kaXNhYmxlZH1cXFwiPjxhIGhyZWY9XFxcIiNcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QodGFiKVxcXCI+e3t0YWIuaGVhZGVyfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDwvZHJvcGRvd24+XFxyXFxuICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPC91bD5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwidGFiLWNvbnRlbnRcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZX0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnLi9Ecm9wZG93bi52dWUnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgY29tcG9uZW50czoge1xcclxcbiAgICBkcm9wZG93blxcclxcbiAgfSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIC8vIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2ZhZGVpbid9LFxcclxcbiAgICBqdXN0aWZpZWQ6IGZhbHNlLFxcclxcbiAgICBuYXZTdHlsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgaW5kZXggPSB0aGlzLnZhbHVlIHx8IDBcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRleCxcXHJcXG4gICAgICBoZWFkZXJzOiBbXSxcXHJcXG4gICAgICB0YWJzOiBbXVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKHZhbCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2FjdGl2ZScsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMuaW5kZXggPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG5hdlN0eWxlQ2xhc3MgKCkge1xcclxcbiAgICAgIHJldHVybiBbXFxyXFxuICAgICAgICAnbmF2JyxcXHJcXG4gICAgICAgIH5bJ3BpbGxzJywgJ3N0YWNrZWQnXS5pbmRleE9mKHRoaXMubmF2U3R5bGUpID8gJ25hdi0nICsgdGhpcy5uYXZTdHlsZSA6ICduYXYtdGFicycsXFxyXFxuICAgICAgICB7XFxyXFxuICAgICAgICAgICduYXYtanVzdGlmaWVkJzogY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxcclxcbiAgICAgICAgICAnbmF2LXBpbGxzJzogdGhpcy5uYXZTdHlsZSA9PT0gJ3N0YWNrZWQnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgXVxcclxcbiAgICB9LFxcclxcbiAgICBzaG93ICgpIHsgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF0gfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2VsZWN0ICh0YWIpIHtcXHJcXG4gICAgICBpZiAoIXRhYi5kaXNhYmxlZCkge1xcclxcbiAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHRhYilcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5faXNUYWJzID0gdHJ1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTc3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfRHJvcGRvd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNSk7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGNvbXBvbmVudHM6IHtcblx0ICAgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICAvLyBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlaW4nfSxcblx0ICAgIGp1c3RpZmllZDogZmFsc2UsXG5cdCAgICBuYXZTdHlsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIGluZGV4ID0gdGhpcy52YWx1ZSB8fCAwO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kZXg6IGluZGV4LFxuXHQgICAgICBoZWFkZXJzOiBbXSxcblx0ICAgICAgdGFiczogW11cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCh2YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnYWN0aXZlJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy5pbmRleCA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBuYXZTdHlsZUNsYXNzOiBmdW5jdGlvbiBuYXZTdHlsZUNsYXNzKCkge1xuXHQgICAgICByZXR1cm4gWyduYXYnLCB+WydwaWxscycsICdzdGFja2VkJ10uaW5kZXhPZih0aGlzLm5hdlN0eWxlKSA/ICduYXYtJyArIHRoaXMubmF2U3R5bGUgOiAnbmF2LXRhYnMnLCB7XG5cdCAgICAgICAgJ25hdi1qdXN0aWZpZWQnOiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxuXHQgICAgICAgICduYXYtcGlsbHMnOiB0aGlzLm5hdlN0eWxlID09PSAnc3RhY2tlZCdcblx0ICAgICAgfV07XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF07XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdCh0YWIpIHtcblx0ICAgICAgaWYgKCF0YWIuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFicyA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFic1wiOiBcIlwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBjbGFzczogX3ZtLm5hdlN0eWxlQ2xhc3MsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJ0YWJsaXN0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9sKChfdm0uaGVhZGVycyksIGZ1bmN0aW9uKGhlYWRlcikge1xuXHQgICAgcmV0dXJuIFsoaGVhZGVyLl9pc1RhYikgPyBfdm0uX2MoJ2xpJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZSwgZGlzYWJsZWQ6IGhlYWRlci5kaXNhYmxlZFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIF92bS5zZWxlY3QoaGVhZGVyKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhoZWFkZXIuaGVhZGVyKVxuXHQgICAgICB9XG5cdCAgICB9KV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKGhlYWRlci5faXNUYWJHcm91cCkgPyBfdm0uX2MoJ2Ryb3Bkb3duJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZVxuXHQgICAgICB9LFxuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwidGV4dFwiOiBoZWFkZXIuaGVhZGVyLFxuXHQgICAgICAgIFwiZGlzYWJsZWRcIjogaGVhZGVyLmRpc2FibGVkXG5cdCAgICAgIH1cblx0ICAgIH0sIF92bS5fbCgoaGVhZGVyLnRhYnMpLCBmdW5jdGlvbih0YWIpIHtcblx0ICAgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAgIGRpc2FibGVkOiB0YWIuZGlzYWJsZWRcblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICAgICAgYXR0cnM6IHtcblx0ICAgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb246IHtcblx0ICAgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICBfdm0uc2VsZWN0KHRhYilcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX3YoX3ZtLl9zKHRhYi5oZWFkZXIpKV0pXSlcblx0ICAgIH0pKSA6IF92bS5fZSgpXVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwidGFiLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03MDEwMGRkZlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE3OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvZ2dsZUJ1dHRvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZjAzNGE1ZjJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWYwMzRhNWYyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVG9nZ2xlQnV0dG9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGZhbHNlVHlwZTogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBuYW1lOiBudWxsLFxuXHQgICAgcmVhZG9ubHk6IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHJ1ZVR5cGU6IHsgZGVmYXVsdDogJ3ByaW1hcnknIH0sXG5cdCAgICB2YWx1ZTogZmFsc2Vcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhY3RpdmU6IF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLnZhbHVlKSxcblx0ICAgICAgdHlwZXM6IHtcblx0ICAgICAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcblx0ICAgICAgICBpbmZvOiAnYnRuLWluZm8nLFxuXHQgICAgICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG5cdCAgICAgICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcblx0ICAgICAgICB3YXJuaW5nOiAnYnRuLXdhcm5pbmcnXG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZWQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQodmFsID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJyk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuYWN0aXZlID0gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMudmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYm9vbERpc2FibGVkOiBmdW5jdGlvbiBib29sRGlzYWJsZWQoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5kaXNhYmxlZCk7XG5cdCAgICB9LFxuXHQgICAgYm9vbFJlYWRvbmx5OiBmdW5jdGlvbiBib29sUmVhZG9ubHkoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5yZWFkb25seSk7XG5cdCAgICB9LFxuXHQgICAgdHlwZTogZnVuY3Rpb24gdHlwZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZXNbdGhpcy52YWx1ZSA/IHRoaXMudHJ1ZVR5cGUgOiB0aGlzLmZhbHNlVHlwZV0gfHwgJ2J0bi1kZWZhdWx0Jztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5ib29sRGlzYWJsZWQgfHwgdGhpcy5ib29sUmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG5cdCAgICB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTgxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2EnLCB7XG5cdCAgICBjbGFzczogWydidG4nLCBfdm0udHlwZSwge1xuXHQgICAgICByZWFkb25seTogX3ZtLmJvb2xSZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImhyZWZcIjogXCJqYXZhc2NyaXB0OnZvaWQoMClcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uYm9vbERpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2dseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsdWUgPyAnb2snIDogJ3JlbW92ZScpXVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5hY3RpdmUgPyAxIDogMFxuXHQgICAgfVxuXHQgIH0pIDogX3ZtLl9lKCldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mMDM0YTVmMlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxODMpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvb2x0aXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQ4ZmI1MWIyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00OGZiNTFiMlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFRvb2x0aXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ4ZmI1MWIyIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Ub29sdGlwLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDhmYjUxYjIhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1Rvb2x0aXAudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXG59XFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXG59XFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXG59XFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcbjAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG59XFxuQGtleWZyYW1lcyBmYWRlaW4tb3V0IHtcXG4wJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVG9vbHRpcC52dWU/MzdkMTgzZWNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJCQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlRvb2x0aXAudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWyd0b29sdGlwJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInRvb2x0aXAtYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1pbm5lclxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImNvbnRlbnRcXFwiPjxkaXYgdi1odG1sPVxcXCJjb250ZW50XFxcIj48L2Rpdj48L3Nsb3Q+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC90cmFuc2l0aW9uPlxcclxcbiAgPC9zcGFuPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgUG9wb3Zlck1peGluIGZyb20gJy4vdXRpbHMvcG9wb3Zlck1peGlucy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBtaXhpbnM6IFtQb3BvdmVyTWl4aW5dLFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgZWZmZWN0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnfSxcXHJcXG4gICAgdHJpZ2dlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJ31cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG59XFxyXFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXHJcXG59XFxyXFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIGZhZGVpbi1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAuOTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTg1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGlucyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQzKTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3BvdmVyTWl4aW5zKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgbWl4aW5zOiBbX3BvcG92ZXJNaXhpbnMyLmRlZmF1bHRdLFxuXHQgIHByb3BzOiB7XG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJyB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWyd0b29sdGlwJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWlubmVyXCJcblx0ICB9LCBbX3ZtLl90KFwiY29udGVudFwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDhmYjUxYjJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTg4KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNilcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUeXBlYWhlYWQudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTViNWY1ZTk0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01YjVmNWU5NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFR5cGVhaGVhZC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4OSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNWI1ZjVlOTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1R5cGVhaGVhZC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTViNWY1ZTk0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UeXBlYWhlYWQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9UeXBlYWhlYWQudnVlPzczZmNkNGJlXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrSUE7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJUeXBlYWhlYWQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgc3R5bGU9XFxcInBvc2l0aW9uOiByZWxhdGl2ZVxcXCIgOmNsYXNzPVxcXCJ7b3BlbjpzaG93RHJvcGRvd259XFxcIj5cXHJcXG4gICAgPGlucHV0IGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIlxcclxcbiAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICA6cGxhY2Vob2xkZXI9XFxcInBsYWNlaG9sZGVyXFxcIlxcclxcbiAgICAgIDp0eXBlLm9uY2U9XFxcInR5cGVcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcInNob3dEcm9wZG93biA9IGZhbHNlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmRvd24ucHJldmVudD1cXFwiZG93blxcXCJcXHJcXG4gICAgICBAa2V5ZG93bi5lbnRlcj1cXFwiaGl0XFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVzYz1cXFwicmVzZXRcXFwiXFxyXFxuICAgICAgQGtleWRvd24udXAucHJldmVudD1cXFwidXBcXFwiXFxyXFxuICAgIC8+XFxyXFxuICAgIDx1bCBjbGFzcz1cXFwiZHJvcGRvd24tbWVudVxcXCIgcmVmPVxcXCJkcm9wZG93blxcXCI+XFxyXFxuICAgICAgPGxpIHYtZm9yPVxcXCIoaXRlbSwgaSkgaW4gaXRlbXNcXFwiIDpjbGFzcz1cXFwie2FjdGl2ZTogaXNBY3RpdmUoaSl9XFxcIj5cXHJcXG4gICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwiaGl0XFxcIiBAbW91c2Vtb3ZlPVxcXCJzZXRBY3RpdmUoaSlcXFwiPlxcclxcbiAgICAgICAgICA8Y29tcG9uZW50IDppcz1cXFwidGVtcGxhdGVDb21wXFxcIiA6aXRlbT1cXFwiaXRlbVxcXCI+PC9jb21wb25lbnQ+XFxyXFxuICAgICAgICA8L2E+XFxyXFxuICAgICAgPC9saT5cXHJcXG4gICAgPC91bD5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2RlbGF5ZXIsIGdldEpTT059IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYXN5bmM6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBkYXRhOiB7dHlwZTogQXJyYXl9LFxcclxcbiAgICBkZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogREVMQVl9LFxcclxcbiAgICBhc3luY0tleToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxpbWl0OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiA4fSxcXHJcXG4gICAgbWF0Y2hDYXNlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBtYXRjaFN0YXJ0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBvbkhpdDoge1xcclxcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxcclxcbiAgICAgIGRlZmF1bHQgKGl0ZW0pIHsgcmV0dXJuIGl0ZW0gfVxcclxcbiAgICB9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHRlbXBsYXRlOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnfSxcXHJcXG4gICAgdmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFzaWduOiAnJyxcXHJcXG4gICAgICBzaG93RHJvcGRvd246IGZhbHNlLFxcclxcbiAgICAgIG5vUmVzdWx0czogdHJ1ZSxcXHJcXG4gICAgICBjdXJyZW50OiAwLFxcclxcbiAgICAgIGl0ZW1zOiBbXSxcXHJcXG4gICAgICB2YWw6IHRoaXMudmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIHRlbXBsYXRlQ29tcCAoKSB7XFxyXFxuICAgICAgcmV0dXJuIHtcXHJcXG4gICAgICAgIHRlbXBsYXRlOiB0eXBlb2YgdGhpcy50ZW1wbGF0ZSA9PT0gJ3N0cmluZycgPyAnPHNwYW4+JyArIHRoaXMudGVtcGxhdGUgKyAnPC9zcGFuPicgOiAnPHN0cm9uZyB2LWh0bWw9XFxcIml0ZW1cXFwiPjwvc3Ryb25nPicsXFxyXFxuICAgICAgICBwcm9wczogeyBpdGVtOiB7ZGVmYXVsdDogbnVsbH0gfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQgJiYgdmFsICE9PSB0aGlzLmFzaWduKSB0aGlzLl9fdXBkYXRlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7IHRoaXMudmFsID0gdmFsIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2V0SXRlbXMgKGRhdGEpIHtcXHJcXG4gICAgICBpZiAodGhpcy5hc3luYykge1xcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuYXN5bmNLZXkgPyBkYXRhW3RoaXMuYXN5bmNLZXldIDogZGF0YVxcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IChkYXRhIHx8IFtdKS5maWx0ZXIodmFsdWUgPT4ge1xcclxcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgeyByZXR1cm4gdHJ1ZSB9XFxyXFxuICAgICAgICAgIHZhbHVlID0gdGhpcy5tYXRjaENhc2UgPyB2YWx1ZSA6IHZhbHVlLnRvTG93ZXJDYXNlKClcXHJcXG4gICAgICAgICAgdmFyIHF1ZXJ5ID0gdGhpcy5tYXRjaENhc2UgPyB0aGlzLnZhbCA6IHRoaXMudmFsLnRvTG93ZXJDYXNlKClcXHJcXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hTdGFydCA/IHZhbHVlLmluZGV4T2YocXVlcnkpID09PSAwIDogdmFsdWUuaW5kZXhPZihxdWVyeSkgIT09IC0xXFxyXFxuICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KVxcclxcbiAgICAgIH1cXHJcXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMFxcclxcbiAgICB9LFxcclxcbiAgICBzZXRWYWx1ZSAodmFsdWUpIHtcXHJcXG4gICAgICB0aGlzLmFzaWduID0gdmFsdWVcXHJcXG4gICAgICB0aGlzLnZhbCA9IHZhbHVlXFxyXFxuICAgICAgdGhpcy5pdGVtcyA9IFtdXFxyXFxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIHJlc2V0ICgpIHsgdGhpcy5zZXRWYWx1ZShudWxsKSB9LFxcclxcbiAgICBzZXRBY3RpdmUgKGluZGV4KSB7IHRoaXMuY3VycmVudCA9IGluZGV4IH0sXFxyXFxuICAgIGlzQWN0aXZlIChpbmRleCkgeyByZXR1cm4gdGhpcy5jdXJyZW50ID09PSBpbmRleCB9LFxcclxcbiAgICBoaXQgKGUpIHtcXHJcXG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcXHJcXG4gICAgICB0aGlzLnNldFZhbHVlKHRoaXMub25IaXQodGhpcy5pdGVtc1t0aGlzLmN1cnJlbnRdLCB0aGlzKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdXAgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQgPiAwKSB7IHRoaXMuY3VycmVudC0tIH1cXHJcXG4gICAgICBlbHNlIHsgdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgZG93biAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkgeyB0aGlzLmN1cnJlbnQrKyB9XFxyXFxuICAgICAgZWxzZSB7IHRoaXMuY3VycmVudCA9IDAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX191cGRhdGUgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMudmFsKSB7XFxyXFxuICAgICAgICB0aGlzLnJlc2V0KClcXHJcXG4gICAgICAgIHJldHVyblxcclxcbiAgICAgIH1cXHJcXG4gICAgICB0aGlzLmFzaWduID0gJydcXHJcXG4gICAgICBpZiAodGhpcy5hc3luYykge1xcclxcbiAgICAgICAgZ2V0SlNPTih0aGlzLmFzeW5jICsgdGhpcy52YWwpLnRoZW4oZGF0YSA9PiB7XFxyXFxuICAgICAgICAgIHRoaXMuc2V0SXRlbXMoZGF0YSlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEpIHtcXHJcXG4gICAgICAgIHRoaXMuc2V0SXRlbXModGhpcy5kYXRhKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSwgJ2RlbGF5JywgREVMQVkpXFxyXFxuICAgIHRoaXMuX191cGRhdGUoKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTkwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdHlwZW9mMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTkxKTtcblx0XG5cdHZhciBfdHlwZW9mMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3R5cGVvZjIpO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdHZhciBERUxBWSA9IDMwMDsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYXN5bmM6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBkYXRhOiB7IHR5cGU6IEFycmF5IH0sXG5cdCAgICBkZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IERFTEFZIH0sXG5cdCAgICBhc3luY0tleTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogOCB9LFxuXHQgICAgbWF0Y2hDYXNlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBtYXRjaFN0YXJ0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBvbkhpdDoge1xuXHQgICAgICB0eXBlOiBGdW5jdGlvbixcblx0ICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoaXRlbSkge1xuXHQgICAgICAgIHJldHVybiBpdGVtO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0ZW1wbGF0ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCcgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFzaWduOiAnJyxcblx0ICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcblx0ICAgICAgbm9SZXN1bHRzOiB0cnVlLFxuXHQgICAgICBjdXJyZW50OiAwLFxuXHQgICAgICBpdGVtczogW10sXG5cdCAgICAgIHZhbDogdGhpcy52YWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdGVtcGxhdGVDb21wOiBmdW5jdGlvbiB0ZW1wbGF0ZUNvbXAoKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdGVtcGxhdGU6IHR5cGVvZiB0aGlzLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/ICc8c3Bhbj4nICsgdGhpcy50ZW1wbGF0ZSArICc8L3NwYW4+JyA6ICc8c3Ryb25nIHYtaHRtbD1cIml0ZW1cIj48L3N0cm9uZz4nLFxuXHQgICAgICAgIHByb3BzOiB7IGl0ZW06IHsgZGVmYXVsdDogbnVsbCB9IH1cblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCAmJiBfdmFsICE9PSB0aGlzLmFzaWduKSB0aGlzLl9fdXBkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZXRJdGVtczogZnVuY3Rpb24gc2V0SXRlbXMoZGF0YSkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcblx0ICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5hc3luY0tleSA/IGRhdGFbdGhpcy5hc3luY0tleV0gOiBkYXRhO1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkodmFsdWUpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB2YWx1ZSA9IF90aGlzLm1hdGNoQ2FzZSA/IHZhbHVlIDogdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICAgIHZhciBxdWVyeSA9IF90aGlzLm1hdGNoQ2FzZSA/IF90aGlzLnZhbCA6IF90aGlzLnZhbC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMTtcblx0ICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMDtcblx0ICAgIH0sXG5cdCAgICBzZXRWYWx1ZTogZnVuY3Rpb24gc2V0VmFsdWUodmFsdWUpIHtcblx0ICAgICAgdGhpcy5hc2lnbiA9IHZhbHVlO1xuXHQgICAgICB0aGlzLnZhbCA9IHZhbHVlO1xuXHQgICAgICB0aGlzLml0ZW1zID0gW107XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy5zZXRWYWx1ZShudWxsKTtcblx0ICAgIH0sXG5cdCAgICBzZXRBY3RpdmU6IGZ1bmN0aW9uIHNldEFjdGl2ZShpbmRleCkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQgPSBpbmRleDtcblx0ICAgIH0sXG5cdCAgICBpc0FjdGl2ZTogZnVuY3Rpb24gaXNBY3RpdmUoaW5kZXgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY3VycmVudCA9PT0gaW5kZXg7XG5cdCAgICB9LFxuXHQgICAgaGl0OiBmdW5jdGlvbiBoaXQoZSkge1xuXHQgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5vbkhpdCh0aGlzLml0ZW1zW3RoaXMuY3VycmVudF0sIHRoaXMpKTtcblx0ICAgIH0sXG5cdCAgICB1cDogZnVuY3Rpb24gdXAoKSB7XG5cdCAgICAgIGlmICh0aGlzLmN1cnJlbnQgPiAwKSB7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50LS07XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZG93bjogZnVuY3Rpb24gZG93bigpIHtcblx0ICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkge1xuXHQgICAgICAgIHRoaXMuY3VycmVudCsrO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuY3VycmVudCA9IDA7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9fdXBkYXRlID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnZhbCkge1xuXHQgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hc2lnbiA9ICcnO1xuXHQgICAgICBpZiAodGhpcy5hc3luYykge1xuXHQgICAgICAgICgwLCBfdXRpbHMuZ2V0SlNPTikodGhpcy5hc3luYyArIHRoaXMudmFsKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICBfdGhpczIuc2V0SXRlbXMoZGF0YSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG5cdCAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpO1xuXHQgICAgICB9XG5cdCAgICB9LCAnZGVsYXknLCBERUxBWSk7XG5cdCAgICB0aGlzLl9fdXBkYXRlKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHR2YXIgX2l0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cdFxuXHR2YXIgX2l0ZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2l0ZXJhdG9yKTtcblx0XG5cdHZhciBfc3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTIpO1xuXHRcblx0dmFyIF9zeW1ib2wyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltYm9sKTtcblx0XG5cdHZhciBfdHlwZW9mID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgX2l0ZXJhdG9yMi5kZWZhdWx0ID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mKF9pdGVyYXRvcjIuZGVmYXVsdCkgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG5cdCAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xuXHR9IDogZnVuY3Rpb24gKG9iaikge1xuXHQgIHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5MyksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDE5MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxOTQpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjA0KTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMDUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNykuU3ltYm9sO1xuXG4vKioqLyB9LFxuLyogMTk0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdC8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cblx0dmFyIGdsb2JhbCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuXHQgICwgaGFzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgREVTQ1JJUFRPUlMgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KVxuXHQgICwgJGV4cG9ydCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCByZWRlZmluZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpXG5cdCAgLCBNRVRBICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk1KS5LRVlcblx0ICAsICRmYWlscyAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNilcblx0ICAsIHNoYXJlZCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Mylcblx0ICAsIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Nylcblx0ICAsIHVpZCAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NClcblx0ICAsIHdrcyAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OClcblx0ICAsIHdrc0V4dCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSlcblx0ICAsIHdrc0RlZmluZSAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTYpXG5cdCAgLCBrZXlPZiAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk3KVxuXHQgICwgZW51bUtleXMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OClcblx0ICAsIGlzQXJyYXkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDEpXG5cdCAgLCBhbk9iamVjdCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCB0b0lPYmplY3QgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b1ByaW1pdGl2ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG5cdCAgLCBjcmVhdGVEZXNjICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCBfY3JlYXRlICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpXG5cdCAgLCBnT1BORXh0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNjApXG5cdCAgLCAkR09QRCAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjAyKVxuXHQgICwgJERQICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuXHQgICwgJGtleXMgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgZ09QRCAgICAgICAgICAgPSAkR09QRC5mXG5cdCAgLCBkUCAgICAgICAgICAgICA9ICREUC5mXG5cdCAgLCBnT1BOICAgICAgICAgICA9IGdPUE5FeHQuZlxuXHQgICwgJFN5bWJvbCAgICAgICAgPSBnbG9iYWwuU3ltYm9sXG5cdCAgLCAkSlNPTiAgICAgICAgICA9IGdsb2JhbC5KU09OXG5cdCAgLCBfc3RyaW5naWZ5ICAgICA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeVxuXHQgICwgUFJPVE9UWVBFICAgICAgPSAncHJvdG90eXBlJ1xuXHQgICwgSElEREVOICAgICAgICAgPSB3a3MoJ19oaWRkZW4nKVxuXHQgICwgVE9fUFJJTUlUSVZFICAgPSB3a3MoJ3RvUHJpbWl0aXZlJylcblx0ICAsIGlzRW51bSAgICAgICAgID0ge30ucHJvcGVydHlJc0VudW1lcmFibGVcblx0ICAsIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKVxuXHQgICwgQWxsU3ltYm9scyAgICAgPSBzaGFyZWQoJ3N5bWJvbHMnKVxuXHQgICwgT1BTeW1ib2xzICAgICAgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKVxuXHQgICwgT2JqZWN0UHJvdG8gICAgPSBPYmplY3RbUFJPVE9UWVBFXVxuXHQgICwgVVNFX05BVElWRSAgICAgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nXG5cdCAgLCBRT2JqZWN0ICAgICAgICA9IGdsb2JhbC5RT2JqZWN0O1xuXHQvLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcblx0dmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cdFxuXHQvLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcblx0dmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG5cdCAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBkUCh0aGlzLCAnYScsIHt2YWx1ZTogN30pLmE7IH1cblx0ICB9KSkuYSAhPSA3O1xuXHR9KSA/IGZ1bmN0aW9uKGl0LCBrZXksIEQpe1xuXHQgIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuXHQgIGlmKHByb3RvRGVzYylkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcblx0ICBkUChpdCwga2V5LCBEKTtcblx0ICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKWRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG5cdH0gOiBkUDtcblx0XG5cdHZhciB3cmFwID0gZnVuY3Rpb24odGFnKXtcblx0ICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuXHQgIHN5bS5fayA9IHRhZztcblx0ICByZXR1cm4gc3ltO1xuXHR9O1xuXHRcblx0dmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xuXHR9IDogZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG5cdH07XG5cdFxuXHR2YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCl7XG5cdCAgaWYoaXQgPT09IE9iamVjdFByb3RvKSRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG5cdCAgYW5PYmplY3QoaXQpO1xuXHQgIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG5cdCAgYW5PYmplY3QoRCk7XG5cdCAgaWYoaGFzKEFsbFN5bWJvbHMsIGtleSkpe1xuXHQgICAgaWYoIUQuZW51bWVyYWJsZSl7XG5cdCAgICAgIGlmKCFoYXMoaXQsIEhJRERFTikpZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuXHQgICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSlpdFtISURERU5dW2tleV0gPSBmYWxzZTtcblx0ICAgICAgRCA9IF9jcmVhdGUoRCwge2VudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpfSk7XG5cdCAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuXHQgIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xuXHR9O1xuXHR2YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKXtcblx0ICBhbk9iamVjdChpdCk7XG5cdCAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKVxuXHQgICAgLCBpICAgID0gMFxuXHQgICAgLCBsID0ga2V5cy5sZW5ndGhcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKGwgPiBpKSRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblx0dmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApe1xuXHQgIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcblx0fTtcblx0dmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSl7XG5cdCAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcblx0ICBpZih0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSlyZXR1cm4gZmFsc2U7XG5cdCAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xuXHR9O1xuXHR2YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcblx0ICBpdCAgPSB0b0lPYmplY3QoaXQpO1xuXHQgIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG5cdCAgaWYoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybjtcblx0ICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG5cdCAgaWYoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKUQuZW51bWVyYWJsZSA9IHRydWU7XG5cdCAgcmV0dXJuIEQ7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuXHQgIHZhciBuYW1lcyAgPSBnT1BOKHRvSU9iamVjdChpdCkpXG5cdCAgICAsIHJlc3VsdCA9IFtdXG5cdCAgICAsIGkgICAgICA9IDBcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpe1xuXHQgICAgaWYoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKXJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfSByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXHR2YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCl7XG5cdCAgdmFyIElTX09QICA9IGl0ID09PSBPYmplY3RQcm90b1xuXHQgICAgLCBuYW1lcyAgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSlcblx0ICAgICwgcmVzdWx0ID0gW11cblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG5cdCAgICBpZihoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcblx0ICB9IHJldHVybiByZXN1bHQ7XG5cdH07XG5cdFxuXHQvLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcblx0aWYoIVVTRV9OQVRJVkUpe1xuXHQgICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKXtcblx0ICAgIGlmKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKXRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuXHQgICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG5cdCAgICB2YXIgJHNldCA9IGZ1bmN0aW9uKHZhbHVlKXtcblx0ICAgICAgaWYodGhpcyA9PT0gT2JqZWN0UHJvdG8pJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuXHQgICAgICBpZihoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKXRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG5cdCAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG5cdCAgICB9O1xuXHQgICAgaWYoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKXNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8sIHRhZywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0fSk7XG5cdCAgICByZXR1cm4gd3JhcCh0YWcpO1xuXHQgIH07XG5cdCAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuXHQgICAgcmV0dXJuIHRoaXMuX2s7XG5cdCAgfSk7XG5cdFxuXHQgICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXHQgICREUC5mICAgPSAkZGVmaW5lUHJvcGVydHk7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXyg2MSkuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oMjAwKS5mICA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0ICBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OSkuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cdFxuXHQgIGlmKERFU0NSSVBUT1JTICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KSl7XG5cdCAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcblx0ICB9XG5cdFxuXHQgIHdrc0V4dC5mID0gZnVuY3Rpb24obmFtZSl7XG5cdCAgICByZXR1cm4gd3JhcCh3a3MobmFtZSkpO1xuXHQgIH1cblx0fVxuXHRcblx0JGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1N5bWJvbDogJFN5bWJvbH0pO1xuXHRcblx0Zm9yKHZhciBzeW1ib2xzID0gKFxuXHQgIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG5cdCAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuXHQpLnNwbGl0KCcsJyksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3Moc3ltYm9sc1tpKytdKTtcblx0XG5cdGZvcih2YXIgc3ltYm9scyA9ICRrZXlzKHdrcy5zdG9yZSksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3NEZWZpbmUoc3ltYm9sc1tpKytdKTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG5cdCAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG5cdCAgJ2Zvcic6IGZ1bmN0aW9uKGtleSl7XG5cdCAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG5cdCAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuXHQgICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG5cdCAgfSxcblx0ICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcblx0ICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihrZXkpe1xuXHQgICAgaWYoaXNTeW1ib2woa2V5KSlyZXR1cm4ga2V5T2YoU3ltYm9sUmVnaXN0cnksIGtleSk7XG5cdCAgICB0aHJvdyBUeXBlRXJyb3Ioa2V5ICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG5cdCAgfSxcblx0ICB1c2VTZXR0ZXI6IGZ1bmN0aW9uKCl7IHNldHRlciA9IHRydWU7IH0sXG5cdCAgdXNlU2ltcGxlOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSBmYWxzZTsgfVxuXHR9KTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG5cdCAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuXHQgIGNyZWF0ZTogJGNyZWF0ZSxcblx0ICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcblx0ICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuXHQgIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG5cdCAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG5cdCAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuXHQgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcblx0ICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuXHQgIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuXHQgIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcblx0ICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcblx0fSk7XG5cdFxuXHQvLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcblx0JEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uKCl7XG5cdCAgdmFyIFMgPSAkU3ltYm9sKCk7XG5cdCAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cblx0ICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcblx0ICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuXHQgIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7YTogU30pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG5cdH0pKSwgJ0pTT04nLCB7XG5cdCAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpe1xuXHQgICAgaWYoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG5cdCAgICB2YXIgYXJncyA9IFtpdF1cblx0ICAgICAgLCBpICAgID0gMVxuXHQgICAgICAsIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG5cdCAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuXHQgICAgcmVwbGFjZXIgPSBhcmdzWzFdO1xuXHQgICAgaWYodHlwZW9mIHJlcGxhY2VyID09ICdmdW5jdGlvbicpJHJlcGxhY2VyID0gcmVwbGFjZXI7XG5cdCAgICBpZigkcmVwbGFjZXIgfHwgIWlzQXJyYXkocmVwbGFjZXIpKXJlcGxhY2VyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG5cdCAgICAgIGlmKCRyZXBsYWNlcil2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuXHQgICAgICBpZighaXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTtcblx0ICAgIH07XG5cdCAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG5cdCAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG5cdCAgfVxuXHR9KTtcblx0XG5cdC8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcblx0JFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgX193ZWJwYWNrX3JlcXVpcmVfXygxMCkoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcblx0Ly8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG5cdC8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cblx0c2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcblx0Ly8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cblx0c2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG5cbi8qKiovIH0sXG4vKiAxOTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBNRVRBICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDQpKCdtZXRhJylcblx0ICAsIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMylcblx0ICAsIGhhcyAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHNldERlc2MgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZlxuXHQgICwgaWQgICAgICAgPSAwO1xuXHR2YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbigpe1xuXHQgIHJldHVybiB0cnVlO1xuXHR9O1xuXHR2YXIgRlJFRVpFID0gIV9fd2VicGFja19yZXF1aXJlX18oMTYpKGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcblx0fSk7XG5cdHZhciBzZXRNZXRhID0gZnVuY3Rpb24oaXQpe1xuXHQgIHNldERlc2MoaXQsIE1FVEEsIHt2YWx1ZToge1xuXHQgICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG5cdCAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuXHQgIH19KTtcblx0fTtcblx0dmFyIGZhc3RLZXkgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcblx0ICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG5cdCAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuXHQgIGlmKCFoYXMoaXQsIE1FVEEpKXtcblx0ICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG5cdCAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuXHQgICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcblx0ICAgIGlmKCFjcmVhdGUpcmV0dXJuICdFJztcblx0ICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG5cdCAgICBzZXRNZXRhKGl0KTtcblx0ICAvLyByZXR1cm4gb2JqZWN0IElEXG5cdCAgfSByZXR1cm4gaXRbTUVUQV0uaTtcblx0fTtcblx0dmFyIGdldFdlYWsgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcblx0ICBpZighaGFzKGl0LCBNRVRBKSl7XG5cdCAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuXHQgICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuIHRydWU7XG5cdCAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuXHQgICAgaWYoIWNyZWF0ZSlyZXR1cm4gZmFsc2U7XG5cdCAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuXHQgICAgc2V0TWV0YShpdCk7XG5cdCAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcblx0ICB9IHJldHVybiBpdFtNRVRBXS53O1xuXHR9O1xuXHQvLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcblx0dmFyIG9uRnJlZXplID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSlzZXRNZXRhKGl0KTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cdHZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdCAgS0VZOiAgICAgIE1FVEEsXG5cdCAgTkVFRDogICAgIGZhbHNlLFxuXHQgIGZhc3RLZXk6ICBmYXN0S2V5LFxuXHQgIGdldFdlYWs6ICBnZXRXZWFrLFxuXHQgIG9uRnJlZXplOiBvbkZyZWV6ZVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZ2xvYmFsICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBjb3JlICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIExJQlJBUlkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNylcblx0ICAsIHdrc0V4dCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSlcblx0ICAsIGRlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZjtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcblx0ICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuXHQgIGlmKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwge3ZhbHVlOiB3a3NFeHQuZihuYW1lKX0pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZ2V0S2V5cyAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNClcblx0ICAsIHRvSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgZWwpe1xuXHQgIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuXHQgICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG5cdCAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG5cdCAgICAsIGluZGV4ICA9IDBcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKGxlbmd0aCA+IGluZGV4KWlmKE9ba2V5ID0ga2V5c1tpbmRleCsrXV0gPT09IGVsKXJldHVybiBrZXk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG5cdHZhciBnZXRLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNClcblx0ICAsIGdPUFMgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OSlcblx0ICAsIHBJRSAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHZhciByZXN1bHQgICAgID0gZ2V0S2V5cyhpdClcblx0ICAgICwgZ2V0U3ltYm9scyA9IGdPUFMuZjtcblx0ICBpZihnZXRTeW1ib2xzKXtcblx0ICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdClcblx0ICAgICAgLCBpc0VudW0gID0gcElFLmZcblx0ICAgICAgLCBpICAgICAgID0gMFxuXHQgICAgICAsIGtleTtcblx0ICAgIHdoaWxlKHN5bWJvbHMubGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSlyZXN1bHQucHVzaChrZXkpO1xuXHQgIH0gcmV0dXJuIHJlc3VsdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0ZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqKi8gfSxcbi8qIDIwMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0ZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKiovIH0sXG4vKiAyMDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG5cdHZhciBjb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKXtcblx0ICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDIwMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIHBJRSAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDApXG5cdCAgLCBjcmVhdGVEZXNjICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCB0b0lPYmplY3QgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b1ByaW1pdGl2ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBJRThfRE9NX0RFRklORSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpXG5cdCAgLCBnT1BEICAgICAgICAgICA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdFxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCl7XG5cdCAgTyA9IHRvSU9iamVjdChPKTtcblx0ICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG5cdCAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcblx0ICAgIHJldHVybiBnT1BEKE8sIFApO1xuXHQgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblx0ICBpZihoYXMoTywgUCkpcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXG5cbi8qKiovIH0sXG4vKiAyMDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTk2KSgnYXN5bmNJdGVyYXRvcicpO1xuXG4vKioqLyB9LFxuLyogMjA1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE5NikoJ29ic2VydmFibGUnKTtcblxuLyoqKi8gfSxcbi8qIDIwNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICBvcGVuOiBfdm0uc2hvd0Ryb3Bkb3duXG5cdCAgICB9LFxuXHQgICAgc3RhdGljU3R5bGU6IHtcblx0ICAgICAgXCJwb3NpdGlvblwiOiBcInJlbGF0aXZlXCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwibW9kZWxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLnZhbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwidmFsXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uX3MoX3ZtLnZhbClcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImJsdXJcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnNob3dEcm9wZG93biA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwia2V5ZG93blwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJkb3duXCIsIDQwKSkgeyByZXR1cm47IH1cblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uZG93bigkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5oaXQoJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnJlc2V0KCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJ1cFwiLCAzOCkpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnVwKCRldmVudClcblx0ICAgICAgfV0sXG5cdCAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHJlZjogXCJkcm9wZG93blwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZHJvcGRvd24tbWVudVwiXG5cdCAgfSwgX3ZtLl9sKChfdm0uaXRlbXMpLCBmdW5jdGlvbihpdGVtLCBpKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICBhY3RpdmU6IF92bS5pc0FjdGl2ZShpKVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgICB9LFxuXHQgICAgICAgIFwibW91c2Vtb3ZlXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLnNldEFjdGl2ZShpKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fYyhfdm0udGVtcGxhdGVDb21wLCB7XG5cdCAgICAgIHRhZzogXCJjb21wb25lbnRcIixcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcIml0ZW1cIjogaXRlbVxuXHQgICAgICB9XG5cdCAgICB9KV0sIDEpXSlcblx0ICB9KSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi01YjVmNWU5NFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfVxuLyoqKioqKi8gXSlcbn0pO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dnVlLXN0cmFwLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi92dWUtc3RyYXAvZGlzdC92dWUtc3RyYXAuanNcbi8vIG1vZHVsZSBpZCA9IDQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 43 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"// style-loader: Adds some css to the DOM by adding a \" ).appendTo( body );\n\t\t}\n\n\t\tif ( o.opacity ) { // opacity option\n\t\t\tif ( this.helper.css( \"opacity\" ) ) {\n\t\t\t\tthis._storedOpacity = this.helper.css( \"opacity\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"opacity\", o.opacity );\n\t\t}\n\n\t\tif ( o.zIndex ) { // zIndex option\n\t\t\tif ( this.helper.css( \"zIndex\" ) ) {\n\t\t\t\tthis._storedZIndex = this.helper.css( \"zIndex\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"zIndex\", o.zIndex );\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"start\", event, this._uiHash() );\n\n\t\t//Recache the helper size\n\t\tif ( !this._preserveHelperProportions ) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif ( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis._addClass( this.helper, \"ui-sortable-helper\" );\n\n\t\t// Execute the drag once - this causes the helper not to be visiblebefore getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event );\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\tif ( !this.lastPositionAbs ) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif ( this.options.scroll ) {\n\t\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\n\t\t\t\tif ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -\n\t\t\t\t\t\tevent.pageY < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -\n\t\t\t\t\t\tevent.pageX < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Set the helper position\n\t\tif ( !this.options.axis || this.options.axis !== \"y\" ) {\n\t\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( !this.options.axis || this.options.axis !== \"x\" ) {\n\t\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[ i ];\n\t\t\titemElement = item.item[ 0 ];\n\t\t\tintersection = this._intersectsWithPointer( item );\n\t\t\tif ( !intersection ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif ( item.instance !== this.currentContainer ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif ( itemElement !== this.currentItem[ 0 ] &&\n\t\t\t\tthis.placeholder[ intersection === 1 ? \"next\" : \"prev\" ]()[ 0 ] !== itemElement &&\n\t\t\t\t!$.contains( this.placeholder[ 0 ], itemElement ) &&\n\t\t\t\t( this.options.type === \"semi-dynamic\" ?\n\t\t\t\t\t!$.contains( this.element[ 0 ], itemElement ) :\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif ( this.options.tolerance === \"pointer\" || this._intersectsWithSides( item ) ) {\n\t\t\t\t\tthis._rearrange( event, item );\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers( event );\n\n\t\t//Interconnect with droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"sort\", event, this._uiHash() );\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function( event, noPropagation ) {\n\n\t\tif ( !event ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\tif ( this.options.revert ) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollLeft\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollTop\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$( this.helper ).animate(\n\t\t\t\tanimation,\n\t\t\t\tparseInt( this.options.revert, 10 ) || 500,\n\t\t\t\tfunction() {\n\t\t\t\t\tthat._clear( event );\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tthis._clear( event, noPropagation );\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: null } ) );\n\n\t\t\tif ( this.options.helper === \"original\" ) {\n\t\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor ( var i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"deactivate\", null, this._uiHash( this ) );\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", null, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.placeholder ) {\n\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t\t// it unbinds ALL events from the original node!\n\t\t\tif ( this.placeholder[ 0 ].parentNode ) {\n\t\t\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\t\t\t}\n\t\t\tif ( this.options.helper !== \"original\" && this.helper &&\n\t\t\t\t\tthis.helper[ 0 ].parentNode ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t} );\n\n\t\t\tif ( this.domPosition.prev ) {\n\t\t\t\t$( this.domPosition.prev ).after( this.currentItem );\n\t\t\t} else {\n\t\t\t\t$( this.domPosition.parent ).prepend( this.currentItem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$( items ).each( function() {\n\t\t\tvar res = ( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" )\n\t\t\t\t.match( o.expression || ( /(.+)[\\-=_](.+)/ ) );\n\t\t\tif ( res ) {\n\t\t\t\tstr.push(\n\t\t\t\t\t( o.key || res[ 1 ] + \"[]\" ) +\n\t\t\t\t\t\"=\" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );\n\t\t\t}\n\t\t} );\n\n\t\tif ( !str.length && o.key ) {\n\t\t\tstr.push( o.key + \"=\" );\n\t\t}\n\n\t\treturn str.join( \"&\" );\n\n\t},\n\n\ttoArray: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each( function() {\n\t\t\tret.push( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" );\n\t\t} );\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function( item ) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t &&\n\t\t\t\t( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l &&\n\t\t\t\t( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t( this.options.tolerance !== \"pointer\" &&\n\t\t\t\tthis.helperProportions[ this.floating ? \"width\" : \"height\" ] >\n\t\t\t\titem[ this.floating ? \"width\" : \"height\" ] )\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( this.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( this.helperProportions.height / 2 ) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function( item ) {\n\t\tvar verticalDirection, horizontalDirection,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.top + this.offset.click.top, item.top, item.height ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.left + this.offset.click.left, item.left, item.width ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( !isOverElement ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tverticalDirection = this._getDragVerticalDirection();\n\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\treturn this.floating ?\n\t\t\t( ( horizontalDirection === \"right\" || verticalDirection === \"down\" ) ? 2 : 1 )\n\t\t\t: ( verticalDirection && ( verticalDirection === \"down\" ? 2 : 1 ) );\n\n\t},\n\n\t_intersectsWithSides: function( item ) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis( this.positionAbs.top +\n\t\t\t\tthis.offset.click.top, item.top + ( item.height / 2 ), item.height ),\n\t\t\tisOverRightHalf = this._isOverAxis( this.positionAbs.left +\n\t\t\t\tthis.offset.click.left, item.left + ( item.width / 2 ), item.width ),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif ( this.floating && horizontalDirection ) {\n\t\t\treturn ( ( horizontalDirection === \"right\" && isOverRightHalf ) ||\n\t\t\t\t( horizontalDirection === \"left\" && !isOverRightHalf ) );\n\t\t} else {\n\t\t\treturn verticalDirection && ( ( verticalDirection === \"down\" && isOverBottomHalf ) ||\n\t\t\t\t( verticalDirection === \"up\" && !isOverBottomHalf ) );\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && ( delta > 0 ? \"down\" : \"up\" );\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && ( delta > 0 ? \"right\" : \"left\" );\n\t},\n\n\trefresh: function( event ) {\n\t\tthis._refreshItems( event );\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ?\n\t\t\t[ options.connectWith ] :\n\t\t\toptions.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function( connected ) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif ( connectWith && connected ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items.call( inst.element ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-placeholder\" ), inst ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push( [ $.isFunction( this.options.items ) ?\n\t\t\tthis.options.items\n\t\t\t\t.call( this.element, null, { options: this.options, item: this.currentItem } ) :\n\t\t\t$( this.options.items, this.element )\n\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t.not( \".ui-sortable-placeholder\" ), this ] );\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\tqueries[ i ][ 0 ].each( addItems );\n\t\t}\n\n\t\treturn $( items );\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find( \":data(\" + this.widgetName + \"-item)\" );\n\n\t\tthis.items = $.grep( this.items, function( item ) {\n\t\t\tfor ( var j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === item.item[ 0 ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t},\n\n\t_refreshItems: function( event ) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [ this ];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [ [ $.isFunction( this.options.items ) ?\n\t\t\t\tthis.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t$( this.options.items, this.element ), this ] ],\n\t\t\tconnectWith = this._connectWith();\n\n\t\t//Shouldn't be run the first time through due to massive slow-down\n\t\tif ( connectWith && this.ready ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items\n\t\t\t\t\t\t\t\t.call( inst.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element ), inst ] );\n\t\t\t\t\t\tthis.containers.push( inst );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\ttargetData = queries[ i ][ 1 ];\n\t\t\t_queries = queries[ i ][ 0 ];\n\n\t\t\tfor ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {\n\t\t\t\titem = $( _queries[ j ] );\n\n\t\t\t\t// Data for target checking (mouse manager)\n\t\t\t\titem.data( this.widgetName + \"-item\", targetData );\n\n\t\t\t\titems.push( {\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function( fast ) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent,\n\t\t// the offsetParent's position will change\n\t\tif ( this.offsetParent && this.helper ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif ( item.instance !== this.currentContainer && this.currentContainer &&\n\t\t\t\t\titem.item[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ?\n\t\t\t\t$( this.options.toleranceElement, item.item ) :\n\t\t\t\titem.item;\n\n\t\t\tif ( !fast ) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif ( this.options.custom && this.options.custom.refreshContainers ) {\n\t\t\tthis.options.custom.refreshContainers.call( this );\n\t\t} else {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tp = this.containers[ i ].element.offset();\n\t\t\t\tthis.containers[ i ].containerCache.left = p.left;\n\t\t\t\tthis.containers[ i ].containerCache.top = p.top;\n\t\t\t\tthis.containers[ i ].containerCache.width =\n\t\t\t\t\tthis.containers[ i ].element.outerWidth();\n\t\t\t\tthis.containers[ i ].containerCache.height =\n\t\t\t\t\tthis.containers[ i ].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function( that ) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif ( !o.placeholder || o.placeholder.constructor === String ) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[ 0 ] );\n\n\t\t\t\t\t\tthat._addClass( element, \"ui-sortable-placeholder\",\n\t\t\t\t\t\t\t\tclassName || that.currentItem[ 0 ].className )\n\t\t\t\t\t\t\t._removeClass( element, \"ui-sortable-helper\" );\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function( container, p ) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes -\n\t\t\t\t\t// the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n\t\t\t\t\t// class name is specified\n\t\t\t\t\tif ( className && !o.forcePlaceholderSize ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming\n\t\t\t\t\t// from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif ( !p.height() ) {\n\t\t\t\t\t\tp.height(\n\t\t\t\t\t\t\tthat.currentItem.innerHeight() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingTop\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingBottom\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( !p.width() ) {\n\t\t\t\t\t\tp.width(\n\t\t\t\t\t\t\tthat.currentItem.innerWidth() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingLeft\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingRight\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after( that.placeholder );\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update( that, that.placeholder );\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each( function() {\n\t\t\t$( \" \", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t} );\n\t},\n\n\t_contactContainers: function( event ) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,\n\t\t\tfloating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// Get innermost container that intersects with item\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\n\t\t\t// Never consider a container that's located within the item itself\n\t\t\tif ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this._intersectsWith( this.containers[ i ].containerCache ) ) {\n\n\t\t\t\t// If we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif ( innermostContainer &&\n\t\t\t\t\t\t$.contains(\n\t\t\t\t\t\t\tthis.containers[ i ].element[ 0 ],\n\t\t\t\t\t\t\tinnermostContainer.element[ 0 ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[ i ];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", event, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// If no intersecting containers found, return\n\t\tif ( !innermostContainer ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the item into the container if it's not there already\n\t\tif ( this.containers.length === 1 ) {\n\t\t\tif ( !this.containers[ innermostIndex ].containerCache.over ) {\n\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// When entering a new container, we will find the item with the least distance and\n\t\t\t// append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating( this.currentItem );\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"pageX\" : \"pageY\";\n\n\t\t\tfor ( j = this.items.length - 1; j >= 0; j-- ) {\n\t\t\t\tif ( !$.contains(\n\t\t\t\t\t\tthis.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[ j ].item.offset()[ posProperty ];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\" : \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.currentContainer === this.containers[ innermostIndex ] ) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ?\n\t\t\t\tthis._rearrange( event, itemWithLeastDistance, null, true ) :\n\t\t\t\tthis._rearrange( event, null, this.containers[ innermostIndex ].element, true );\n\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"change\", event, this._uiHash( this ) );\n\t\t\tthis.currentContainer = this.containers[ innermostIndex ];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update( this.currentContainer, this.placeholder );\n\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t}\n\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction( o.helper ) ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem );\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\t$( o.appendTo !== \"parent\" ?\n\t\t\t\to.appendTo :\n\t\t\t\tthis.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );\n\t\t}\n\n\t\tif ( helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tthis._storedCSS = {\n\t\t\t\twidth: this.currentItem[ 0 ].style.width,\n\t\t\t\theight: this.currentItem[ 0 ].style.height,\n\t\t\t\tposition: this.currentItem.css( \"position\" ),\n\t\t\t\ttop: this.currentItem.css( \"top\" ),\n\t\t\t\tleft: this.currentItem.css( \"left\" )\n\t\t\t};\n\t\t}\n\n\t\tif ( !helper[ 0 ].style.width || o.forceHelperSize ) {\n\t\t\thelper.width( this.currentItem.width() );\n\t\t}\n\t\tif ( !helper[ 0 ].style.height || o.forceHelperSize ) {\n\t\t\thelper.height( this.currentItem.height() );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( $.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this\n\t\t// information with an ugly IE fix\n\t\tif ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||\n\t\t\t\t( this.offsetParent[ 0 ].tagName &&\n\t\t\t\tthis.offsetParent[ 0 ].tagName.toLowerCase() === \"html\" && $.ui.ie ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif ( this.cssPosition === \"relative\" ) {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.currentItem.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.currentItem.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\t\tif ( o.containment === \"document\" || o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ?\n\t\t\t\t\tthis.document.width() :\n\t\t\t\t\tthis.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( o.containment === \"document\" ?\n\t\t\t\t\t( this.document.height() || document.body.parentNode.scrollHeight ) :\n\t\t\t\t\tthis.window.height() || this.document[ 0 ].body.parentNode.scrollHeight\n\t\t\t\t) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {\n\t\t\tce = $( o.containment )[ 0 ];\n\t\t\tco = $( o.containment ).offset();\n\t\t\tover = ( $( ce ).css( \"overflow\" ) !== \"hidden\" );\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + ( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingLeft\" ), 10 ) || 0 ) - this.margins.left,\n\t\t\t\tco.top + ( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingTop\" ), 10 ) || 0 ) - this.margins.top,\n\t\t\t\tco.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\tco.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :\n\t\t\t\t\tscroll.scrollLeft() ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event ) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif ( this.cssPosition === \"relative\" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif ( this.originalPosition ) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {\n\t\t\t\t\tpageX = this.containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {\n\t\t\t\t\tpageY = this.containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {\n\t\t\t\t\tpageX = this.containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {\n\t\t\t\t\tpageY = this.containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\t\t\t\ttop = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /\n\t\t\t\t\to.grid[ 1 ] ) * o.grid[ 1 ];\n\t\t\t\tpageY = this.containment ?\n\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] &&\n\t\t\t\t\t\ttop - this.offset.click.top <= this.containment[ 3 ] ) ?\n\t\t\t\t\t\t\ttop :\n\t\t\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?\n\t\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :\n\t\t\t\t\t\t\t\ttop;\n\n\t\t\t\tleft = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /\n\t\t\t\t\to.grid[ 0 ] ) * o.grid[ 0 ];\n\t\t\t\tpageX = this.containment ?\n\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] &&\n\t\t\t\t\t\tleft - this.offset.click.left <= this.containment[ 2 ] ) ?\n\t\t\t\t\t\t\tleft :\n\t\t\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?\n\t\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :\n\t\t\t\t\t\t\t\tleft;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() :\n\t\t\t\t\tscrollIsRootNode ? 0 : scroll.scrollLeft() ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function( event, i, a, hardRefresh ) {\n\n\t\ta ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :\n\t\t\ti.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],\n\t\t\t\t( this.direction === \"down\" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout,\n\t\t// if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay( function() {\n\t\t\tif ( counter === this.counter ) {\n\n\t\t\t\t//Precompute after each DOM insertion, NOT on mousemove\n\t\t\t\tthis.refreshPositions( !hardRefresh );\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_clear: function( event, noPropagation ) {\n\n\t\tthis.reverting = false;\n\n\t\t// We delay all events that have to be triggered to after the point where the placeholder\n\t\t// has been removed and everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets\n\t\t// reappended (see #4088)\n\t\tif ( !this._noFinalSort && this.currentItem.parent().length ) {\n\t\t\tthis.placeholder.before( this.currentItem );\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tfor ( i in this._storedCSS ) {\n\t\t\t\tif ( this._storedCSS[ i ] === \"auto\" || this._storedCSS[ i ] === \"static\" ) {\n\t\t\t\t\tthis._storedCSS[ i ] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif ( this.fromOutside && !noPropagation ) {\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"receive\", event, this._uiHash( this.fromOutside ) );\n\t\t\t} );\n\t\t}\n\t\tif ( ( this.fromOutside ||\n\t\t\t\tthis.domPosition.prev !==\n\t\t\t\tthis.currentItem.prev().not( \".ui-sortable-helper\" )[ 0 ] ||\n\t\t\t\tthis.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {\n\n\t\t\t// Trigger update callback if the DOM position has changed\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"update\", event, this._uiHash() );\n\t\t\t} );\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif ( this !== this.currentContainer ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\t\tthis._trigger( \"remove\", event, this._uiHash() );\n\t\t\t\t} );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"receive\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"update\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif ( this._storedOpacity ) {\n\t\t\tthis.helper.css( \"opacity\", this._storedOpacity );\n\t\t}\n\t\tif ( this._storedZIndex ) {\n\t\t\tthis.helper.css( \"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex );\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif ( !noPropagation ) {\n\t\t\tthis._trigger( \"beforeStop\", event, this._uiHash() );\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t// it unbinds ALL events from the original node!\n\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif ( !noPropagation ) {\n\t\t\tfor ( i = 0; i < delayedTriggers.length; i++ ) {\n\n\t\t\t\t// Trigger all delayed events\n\t\t\t\tdelayedTriggers[ i ].call( this, event );\n\t\t\t}\n\t\t\tthis._trigger( \"stop\", event, this._uiHash() );\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function( _inst ) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $( [] ),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n} );\n\n\n/*!\n * jQuery UI Spinner 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Spinner\n//>>group: Widgets\n//>>description: Displays buttons to easily input numbers via the keyboard or mouse.\n//>>docs: http://api.jqueryui.com/spinner/\n//>>demos: http://jqueryui.com/spinner/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/spinner.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nfunction spinnerModifer( fn ) {\n\treturn function() {\n\t\tvar previous = this.element.val();\n\t\tfn.apply( this, arguments );\n\t\tthis._refresh();\n\t\tif ( previous !== this.element.val() ) {\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t};\n}\n\n$.widget( \"ui.spinner\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"\",\n\twidgetEventPrefix: \"spin\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-spinner\": \"ui-corner-all\",\n\t\t\t\"ui-spinner-down\": \"ui-corner-br\",\n\t\t\t\"ui-spinner-up\": \"ui-corner-tr\"\n\t\t},\n\t\tculture: null,\n\t\ticons: {\n\t\t\tdown: \"ui-icon-triangle-1-s\",\n\t\t\tup: \"ui-icon-triangle-1-n\"\n\t\t},\n\t\tincremental: true,\n\t\tmax: null,\n\t\tmin: null,\n\t\tnumberFormat: null,\n\t\tpage: 10,\n\t\tstep: 1,\n\n\t\tchange: null,\n\t\tspin: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\n\t\t// handle string values that need to be parsed\n\t\tthis._setOption( \"max\", this.options.max );\n\t\tthis._setOption( \"min\", this.options.min );\n\t\tthis._setOption( \"step\", this.options.step );\n\n\t\t// Only format if there is a value, prevents the field from being marked\n\t\t// as invalid in Firefox, see #9573.\n\t\tif ( this.value() !== \"\" ) {\n\n\t\t\t// Format the value, but don't constrain.\n\t\t\tthis._value( this.element.val(), true );\n\t\t}\n\n\t\tthis._draw();\n\t\tthis._on( this._events );\n\t\tthis._refresh();\n\n\t\t// Turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = this._super();\n\t\tvar element = this.element;\n\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\n\t\t\tvar value = element.attr( option );\n\t\t\tif ( value != null && value.length ) {\n\t\t\t\toptions[ option ] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn options;\n\t},\n\n\t_events: {\n\t\tkeydown: function( event ) {\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\tkeyup: \"_stop\",\n\t\tfocus: function() {\n\t\t\tthis.previous = this.element.val();\n\t\t},\n\t\tblur: function( event ) {\n\t\t\tif ( this.cancelBlur ) {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._stop();\n\t\t\tthis._refresh();\n\t\t\tif ( this.previous !== this.element.val() ) {\n\t\t\t\tthis._trigger( \"change\", event );\n\t\t\t}\n\t\t},\n\t\tmousewheel: function( event, delta ) {\n\t\t\tif ( !delta ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );\n\t\t\tclearTimeout( this.mousewheelTimer );\n\t\t\tthis.mousewheelTimer = this._delay( function() {\n\t\t\t\tif ( this.spinning ) {\n\t\t\t\t\tthis._stop( event );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t\tevent.preventDefault();\n\t\t},\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\n\t\t\tvar previous;\n\n\t\t\t// We never want the buttons to have focus; whenever the user is\n\t\t\t// interacting with the spinner, the focus should be on the input.\n\t\t\t// If the input is focused then this.previous is properly set from\n\t\t\t// when the input first received focus. If the input is not focused\n\t\t\t// then we need to set this.previous based on the value before spinning.\n\t\t\tprevious = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?\n\t\t\t\tthis.previous : this.element.val();\n\t\t\tfunction checkFocus() {\n\t\t\t\tvar isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );\n\t\t\t\tif ( !isActive ) {\n\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\tthis.previous = previous;\n\n\t\t\t\t\t// support: IE\n\t\t\t\t\t// IE sets focus asynchronously, so we need to check if focus\n\t\t\t\t\t// moved off of the input because the user clicked on the button.\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure focus is on (or stays on) the text field\n\t\t\tevent.preventDefault();\n\t\t\tcheckFocus.call( this );\n\n\t\t\t// Support: IE\n\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t// and check (again) if focus moved off of the input.\n\t\t\tthis.cancelBlur = true;\n\t\t\tthis._delay( function() {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\tcheckFocus.call( this );\n\t\t\t} );\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\n\n\t\t\t// button will add ui-state-active if mouse was down while mouseleave and kept down\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\n\t\t// TODO: do we really want to consider this a stop?\n\t\t// shouldn't we just stop the repeater and wait until mouseup before\n\t\t// we trigger the stop event?\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\n\t},\n\n\t// Support mobile enhanced option and make backcompat more sane\n\t_enhance: function() {\n\t\tthis.uiSpinner = this.element\n\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t.wrap( \"\" )\n\t\t\t.parent()\n\n\t\t\t\t// Add buttons\n\t\t\t\t.append(\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\t},\n\n\t_draw: function() {\n\t\tthis._enhance();\n\n\t\tthis._addClass( this.uiSpinner, \"ui-spinner\", \"ui-widget ui-widget-content\" );\n\t\tthis._addClass( \"ui-spinner-input\" );\n\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\n\n\t\t// Button bindings\n\t\tthis.buttons = this.uiSpinner.children( \"a\" )\n\t\t\t.attr( \"tabIndex\", -1 )\n\t\t\t.attr( \"aria-hidden\", true )\n\t\t\t.button( {\n\t\t\t\tclasses: {\n\t\t\t\t\t\"ui-button\": \"\"\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// TODO: Right now button does not support classes this is already updated in button PR\n\t\tthis._removeClass( this.buttons, \"ui-corner-all\" );\n\n\t\tthis._addClass( this.buttons.first(), \"ui-spinner-button ui-spinner-up\" );\n\t\tthis._addClass( this.buttons.last(), \"ui-spinner-button ui-spinner-down\" );\n\t\tthis.buttons.first().button( {\n\t\t\t\"icon\": this.options.icons.up,\n\t\t\t\"showLabel\": false\n\t\t} );\n\t\tthis.buttons.last().button( {\n\t\t\t\"icon\": this.options.icons.down,\n\t\t\t\"showLabel\": false\n\t\t} );\n\n\t\t// IE 6 doesn't understand height: 50% for the buttons\n\t\t// unless the wrapper has an explicit height\n\t\tif ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&\n\t\t\t\tthis.uiSpinner.height() > 0 ) {\n\t\t\tthis.uiSpinner.height( this.uiSpinner.height() );\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar options = this.options,\n\t\t\tkeyCode = $.ui.keyCode;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.UP:\n\t\t\tthis._repeat( null, 1, event );\n\t\t\treturn true;\n\t\tcase keyCode.DOWN:\n\t\t\tthis._repeat( null, -1, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_UP:\n\t\t\tthis._repeat( null, options.page, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_DOWN:\n\t\t\tthis._repeat( null, -options.page, event );\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_start: function( event ) {\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\t\tthis.spinning = true;\n\t\treturn true;\n\t},\n\n\t_repeat: function( i, steps, event ) {\n\t\ti = i || 500;\n\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay( function() {\n\t\t\tthis._repeat( 40, steps, event );\n\t\t}, i );\n\n\t\tthis._spin( steps * this.options.step, event );\n\t},\n\n\t_spin: function( step, event ) {\n\t\tvar value = this.value() || 0;\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\n\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false ) {\n\t\t\tthis._value( value );\n\t\t\tthis.counter++;\n\t\t}\n\t},\n\n\t_increment: function( i ) {\n\t\tvar incremental = this.options.incremental;\n\n\t\tif ( incremental ) {\n\t\t\treturn $.isFunction( incremental ) ?\n\t\t\t\tincremental( i ) :\n\t\t\t\tMath.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_adjustValue: function( value ) {\n\t\tvar base, aboveMin,\n\t\t\toptions = this.options;\n\n\t\t// Make sure we're at a valid step\n\t\t// - find out where we are relative to the base (min or 0)\n\t\tbase = options.min !== null ? options.min : 0;\n\t\taboveMin = value - base;\n\n\t\t// - round to the nearest step\n\t\taboveMin = Math.round( aboveMin / options.step ) * options.step;\n\n\t\t// - rounding is based on 0, so adjust back to our base\n\t\tvalue = base + aboveMin;\n\n\t\t// Fix precision from bad JS floating point math\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\n\n\t\t// Clamp the value\n\t\tif ( options.max !== null && value > options.max ) {\n\t\t\treturn options.max;\n\t\t}\n\t\tif ( options.min !== null && value < options.min ) {\n\t\t\treturn options.min;\n\t\t}\n\n\t\treturn value;\n\t},\n\n\t_stop: function( event ) {\n\t\tif ( !this.spinning ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( this.timer );\n\t\tclearTimeout( this.mousewheelTimer );\n\t\tthis.counter = 0;\n\t\tthis.spinning = false;\n\t\tthis._trigger( \"stop\", event );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar prevValue, first, last;\n\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\n\t\t\tprevValue = this._parse( this.element.val() );\n\t\t\tthis.options[ key ] = value;\n\t\t\tthis.element.val( this._format( prevValue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\n\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\tvalue = this._parse( value );\n\t\t\t}\n\t\t}\n\t\tif ( key === \"icons\" ) {\n\t\t\tfirst = this.buttons.first().find( \".ui-icon\" );\n\t\t\tthis._removeClass( first, null, this.options.icons.up );\n\t\t\tthis._addClass( first, null, value.up );\n\t\t\tlast = this.buttons.last().find( \".ui-icon\" );\n\t\t\tthis._removeClass( last, null, this.options.icons.down );\n\t\t\tthis._addClass( last, null, value.down );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis._toggleClass( this.uiSpinner, null, \"ui-state-disabled\", !!value );\n\t\tthis.element.prop( \"disabled\", !!value );\n\t\tthis.buttons.button( value ? \"disable\" : \"enable\" );\n\t},\n\n\t_setOptions: spinnerModifer( function( options ) {\n\t\tthis._super( options );\n\t} ),\n\n\t_parse: function( val ) {\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\n\t\t\tval = window.Globalize && this.options.numberFormat ?\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\n\t\t}\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\n\t},\n\n\t_format: function( value ) {\n\t\tif ( value === \"\" ) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn window.Globalize && this.options.numberFormat ?\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\n\t\t\tvalue;\n\t},\n\n\t_refresh: function() {\n\t\tthis.element.attr( {\n\t\t\t\"aria-valuemin\": this.options.min,\n\t\t\t\"aria-valuemax\": this.options.max,\n\n\t\t\t// TODO: what should we do with values that can't be parsed?\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\n\t\t} );\n\t},\n\n\tisValid: function() {\n\t\tvar value = this.value();\n\n\t\t// Null is invalid\n\t\tif ( value === null ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If value gets adjusted, it's invalid\n\t\treturn value === this._adjustValue( value );\n\t},\n\n\t// Update the value without triggering change\n\t_value: function( value, allowAny ) {\n\t\tvar parsed;\n\t\tif ( value !== \"\" ) {\n\t\t\tparsed = this._parse( value );\n\t\t\tif ( parsed !== null ) {\n\t\t\t\tif ( !allowAny ) {\n\t\t\t\t\tparsed = this._adjustValue( parsed );\n\t\t\t\t}\n\t\t\t\tvalue = this._format( parsed );\n\t\t\t}\n\t\t}\n\t\tthis.element.val( value );\n\t\tthis._refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.prop( \"disabled\", false )\n\t\t\t.removeAttr( \"autocomplete role aria-valuemin aria-valuemax aria-valuenow\" );\n\n\t\tthis.uiSpinner.replaceWith( this.element );\n\t},\n\n\tstepUp: spinnerModifer( function( steps ) {\n\t\tthis._stepUp( steps );\n\t} ),\n\t_stepUp: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tstepDown: spinnerModifer( function( steps ) {\n\t\tthis._stepDown( steps );\n\t} ),\n\t_stepDown: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * -this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tpageUp: spinnerModifer( function( pages ) {\n\t\tthis._stepUp( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tpageDown: spinnerModifer( function( pages ) {\n\t\tthis._stepDown( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tvalue: function( newVal ) {\n\t\tif ( !arguments.length ) {\n\t\t\treturn this._parse( this.element.val() );\n\t\t}\n\t\tspinnerModifer( this._value ).call( this, newVal );\n\t},\n\n\twidget: function() {\n\t\treturn this.uiSpinner;\n\t}\n} );\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for spinner html extension points\n\t$.widget( \"ui.spinner\", $.ui.spinner, {\n\t\t_enhance: function() {\n\t\t\tthis.uiSpinner = this.element\n\t\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t\t.wrap( this._uiSpinnerHtml() )\n\t\t\t\t.parent()\n\n\t\t\t\t\t// Add buttons\n\t\t\t\t\t.append( this._buttonHtml() );\n\t\t},\n\t\t_uiSpinnerHtml: function() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t_buttonHtml: function() {\n\t\t\treturn \"\";\n\t\t}\n\t} );\n}\n\nvar widgetsSpinner = $.ui.spinner;\n\n\n/*!\n * jQuery UI Tabs 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tabs\n//>>group: Widgets\n//>>description: Transforms a set of container elements into a tab structure.\n//>>docs: http://api.jqueryui.com/tabs/\n//>>demos: http://jqueryui.com/tabs/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tabs.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tabs\", {\n\tversion: \"1.12.1\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tclasses: {\n\t\t\t\"ui-tabs\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-nav\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-panel\": \"ui-corner-bottom\",\n\t\t\t\"ui-tabs-tab\": \"ui-corner-top\"\n\t\t},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_isLocal: ( function() {\n\t\tvar rhash = /#.*$/;\n\n\t\treturn function( anchor ) {\n\t\t\tvar anchorUrl, locationUrl;\n\n\t\t\tanchorUrl = anchor.href.replace( rhash, \"\" );\n\t\t\tlocationUrl = location.href.replace( rhash, \"\" );\n\n\t\t\t// Decoding may throw an error if the URL isn't UTF-8 (#9518)\n\t\t\ttry {\n\t\t\t\tanchorUrl = decodeURIComponent( anchorUrl );\n\t\t\t} catch ( error ) {}\n\t\t\ttry {\n\t\t\t\tlocationUrl = decodeURIComponent( locationUrl );\n\t\t\t} catch ( error ) {}\n\n\t\t\treturn anchor.hash.length > 1 && anchorUrl === locationUrl;\n\t\t};\n\t} )(),\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis._addClass( \"ui-tabs\", \"ui-widget ui-widget-content\" );\n\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, options.collapsible );\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t// Take disabling tabs via class attribute from HTML\n\t\t// into account and update option properly.\n\t\tif ( $.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t} )\n\t\t\t) ).sort();\n\t\t}\n\n\t\t// Check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\n\t\t\t// check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each( function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t// No active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t// Handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t// Don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\tvar focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.RIGHT:\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tselectedIndex++;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tgoingForward = false;\n\t\t\tselectedIndex--;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tselectedIndex = 0;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.SPACE:\n\n\t\t\t// Activate only, no collapsing\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\t\t\tthis._activate( selectedIndex );\n\t\t\treturn;\n\t\tcase $.ui.keyCode.ENTER:\n\n\t\t\t// Toggle (cancel delayed activation, allow collapsing)\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\n\t\t\t// Determine if we should collapse or activate\n\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\treturn;\n\t\tdefault:\n\t\t\treturn;\n\t\t}\n\n\t\t// Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t// Navigating with control/command key will prevent automatic activation\n\t\tif ( !event.ctrlKey && !event.metaKey ) {\n\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay( function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.trigger( \"focus\" );\n\t\t}\n\t},\n\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).trigger( \"focus\" );\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, value );\n\n\t\t\t// Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t// Get disabled tabs from class attribute from HTML\n\t\t// this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t} );\n\n\t\tthis._processTabs();\n\n\t\t// Was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\n\t\t// was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\n\t\t\t// all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\n\t\t\t// activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\n\t\t// was active, active tab still exists\n\t\t} else {\n\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setOptionDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\ttabIndex: -1\n\t\t} );\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr( {\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t} );\n\n\t\t// Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t} );\n\t\t\tthis._addClass( this.active, \"ui-tabs-active\", \"ui-state-active\" );\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this,\n\t\t\tprevTabs = this.tabs,\n\t\t\tprevAnchors = this.anchors,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.tablist = this._getList().attr( \"role\", \"tablist\" );\n\t\tthis._addClass( this.tablist, \"ui-tabs-nav\",\n\t\t\t\"ui-helper-reset ui-helper-clearfix ui-widget-header\" );\n\n\t\t// Prevent users from focusing disabled tabs via click\n\t\tthis.tablist\n\t\t\t.on( \"mousedown\" + this.eventNamespace, \"> li\", function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} )\n\n\t\t\t// Support: IE <9\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\n\t\t\t// We don't have to worry about focusing the previously focused\n\t\t\t// element since clicking on a non-focusable element should focus\n\t\t\t// the body anyway.\n\t\t\t.on( \"focus\" + this.eventNamespace, \".ui-tabs-anchor\", function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.tabs, \"ui-tabs-tab\", \"ui-state-default\" );\n\n\t\tthis.anchors = this.tabs.map( function() {\n\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t} )\n\t\t\t.attr( {\n\t\t\t\trole: \"presentation\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.anchors, \"ui-tabs-anchor\" );\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each( function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t// Inline tab\n\t\t\tif ( that._isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanelId = selector.substring( 1 );\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\n\t\t\t// remote tab\n\t\t\t} else {\n\n\t\t\t\t// If the tab doesn't already have aria-controls,\n\t\t\t\t// generate an id by using a throw-away element\n\t\t\t\tpanelId = tab.attr( \"aria-controls\" ) || $( {} ).uniqueId()[ 0 ].id;\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length ) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr( {\n\t\t\t\t\"aria-controls\": panelId,\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t} );\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t} );\n\n\t\tthis.panels.attr( \"role\", \"tabpanel\" );\n\t\tthis._addClass( this.panels, \"ui-tabs-panel\", \"ui-widget-content\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevTabs ) {\n\t\t\tthis._off( prevTabs.not( this.tabs ) );\n\t\t\tthis._off( prevAnchors.not( this.anchors ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t// Allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.tablist || this.element.find( \"ol, ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"
\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setOptionDisabled: function( disabled ) {\n\t\tvar currentItem, li, i;\n\n\t\tif ( $.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t// Disable tabs\n\t\tfor ( i = 0; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tcurrentItem = $( li );\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\tcurrentItem.attr( \"aria-disabled\", \"true\" );\n\t\t\t\tthis._addClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t} else {\n\t\t\t\tcurrentItem.removeAttr( \"aria-disabled\" );\n\t\t\t\tthis._removeClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null,\n\t\t\tdisabled === true );\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t} );\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\n\t\t// Always prevent the default action, even when disabled\n\t\tthis._on( true, this.anchors, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each( function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.element.children().not( this.panels ).each( function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.panels.each( function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t} )\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each( function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t} ).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\n\t\t\t\t// tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\n\t\t\t\t// can't switch durning an animation\n\t\t\t\tthis.running ||\n\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t// Handles show/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\tthat._addClass( eventData.newTab.closest( \"li\" ), \"ui-tabs-active\", \"ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t// Start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\tthat._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t} );\n\t\t} else {\n\t\t\tthis._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr( \"aria-hidden\", \"true\" );\n\t\teventData.oldTab.attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t} );\n\n\t\t// If we're switching tabs, remove the old tab from the tab order.\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter( function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t} )\n\t\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr( \"aria-hidden\", \"false\" );\n\t\teventData.newTab.attr( {\n\t\t\t\"aria-selected\": \"true\",\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\ttabIndex: 0\n\t\t} );\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t// Trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler( {\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t} );\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" +\n\t\t\t\t$.ui.escapeSelector( index ) + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.tablist\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.off( this.eventNamespace );\n\n\t\tthis.anchors\n\t\t\t.removeAttr( \"role tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tabs.add( this.panels ).each( function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this ).removeAttr( \"role tabIndex \" +\n\t\t\t\t\t\"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.tabs.each( function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t},\n\t\t\tcomplete = function( jqXHR, status ) {\n\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t}\n\n\t\t\t\tthat._removeClass( tab, \"ui-tabs-loading\" );\n\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\tdelete that.xhr;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Not remote\n\t\tif ( this._isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t// Support: jQuery <1.8\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\tthis._addClass( tab, \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.done( function( response, status, jqXHR ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} )\n\t\t\t\t.fail( function( jqXHR, status ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\n\t\t\t// Support: IE <11 only\n\t\t\t// Strip any hash that exists to prevent errors with the Ajax request\n\t\t\turl: anchor.attr( \"href\" ).replace( /#.*$/, \"\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for ui-tab class (now ui-tabs-tab)\n\t$.widget( \"ui.tabs\", $.ui.tabs, {\n\t\t_processTabs: function() {\n\t\t\tthis._superApply( arguments );\n\t\t\tthis._addClass( this.tabs, \"ui-tab\" );\n\t\t}\n\t} );\n}\n\nvar widgetsTabs = $.ui.tabs;\n\n\n/*!\n * jQuery UI Tooltip 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tooltip\n//>>group: Widgets\n//>>description: Shows additional information for any element on hover or focus.\n//>>docs: http://api.jqueryui.com/tooltip/\n//>>demos: http://jqueryui.com/tooltip/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tooltip.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tooltip\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-tooltip\": \"ui-corner-all ui-widget-shadow\"\n\t\t},\n\t\tcontent: function() {\n\n\t\t\t// support: IE<9, Opera in jQuery <1.7\n\t\t\t// .text() can't accept undefined, so coerce to a string\n\t\t\tvar title = $( this ).attr( \"title\" ) || \"\";\n\n\t\t\t// Escape title, since we're going from an attribute to raw HTML\n\t\t\treturn $( \"\" ).text( title ).html();\n\t\t},\n\t\thide: true,\n\n\t\t// Disabled elements have inconsistent behavior across browsers (#8661)\n\t\titems: \"[title]:not([disabled])\",\n\t\tposition: {\n\t\t\tmy: \"left top+15\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"flipfit flip\"\n\t\t},\n\t\tshow: true,\n\t\ttrack: false,\n\n\t\t// Callbacks\n\t\tclose: null,\n\t\topen: null\n\t},\n\n\t_addDescribedBy: function( elem, id ) {\n\t\tvar describedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ );\n\t\tdescribedby.push( id );\n\t\telem\n\t\t\t.data( \"ui-tooltip-id\", id )\n\t\t\t.attr( \"aria-describedby\", $.trim( describedby.join( \" \" ) ) );\n\t},\n\n\t_removeDescribedBy: function( elem ) {\n\t\tvar id = elem.data( \"ui-tooltip-id\" ),\n\t\t\tdescribedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ ),\n\t\t\tindex = $.inArray( id, describedby );\n\n\t\tif ( index !== -1 ) {\n\t\t\tdescribedby.splice( index, 1 );\n\t\t}\n\n\t\telem.removeData( \"ui-tooltip-id\" );\n\t\tdescribedby = $.trim( describedby.join( \" \" ) );\n\t\tif ( describedby ) {\n\t\t\telem.attr( \"aria-describedby\", describedby );\n\t\t} else {\n\t\t\telem.removeAttr( \"aria-describedby\" );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._on( {\n\t\t\tmouseover: \"open\",\n\t\t\tfocusin: \"open\"\n\t\t} );\n\n\t\t// IDs of generated tooltips, needed for destroy\n\t\tthis.tooltips = {};\n\n\t\t// IDs of parent tooltips where we removed the title attribute\n\t\tthis.parents = {};\n\n\t\t// Append the aria-live region so tooltips announce correctly\n\t\tthis.liveRegion = $( \"
\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"log\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t} )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\t\tthis._addClass( this.liveRegion, null, \"ui-helper-hidden-accessible\" );\n\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar that = this;\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"content\" ) {\n\t\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t\tthat._updateContent( tooltipData.element );\n\t\t\t} );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\n\t},\n\n\t_disable: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = tooltipData.element[ 0 ];\n\t\t\tthat.close( event, true );\n\t\t} );\n\n\t\t// Remove title attributes to prevent native tooltips\n\t\tthis.disabledTitles = this.disabledTitles.add(\n\t\t\tthis.element.find( this.options.items ).addBack()\n\t\t\t\t.filter( function() {\n\t\t\t\t\tvar element = $( this );\n\t\t\t\t\tif ( element.is( \"[title]\" ) ) {\n\t\t\t\t\t\treturn element\n\t\t\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\n\t\t\t\t\t\t\t.removeAttr( \"title\" );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t);\n\t},\n\n\t_enable: function() {\n\n\t\t// restore title attributes\n\t\tthis.disabledTitles.each( function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t}\n\t\t} );\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\topen: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.target : this.element )\n\n\t\t\t\t// we need closest here due to mouseover bubbling,\n\t\t\t\t// but always pointing at the same event target\n\t\t\t\t.closest( this.options.items );\n\n\t\t// No element to show a tooltip for or the tooltip is already open\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( target.attr( \"title\" ) ) {\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\n\t\t}\n\n\t\ttarget.data( \"ui-tooltip-open\", true );\n\n\t\t// Kill parent tooltips, custom or native, for hover\n\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\ttarget.parents().each( function() {\n\t\t\t\tvar parent = $( this ),\n\t\t\t\t\tblurEvent;\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\n\t\t\t\t\tthat.close( blurEvent, true );\n\t\t\t\t}\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\n\t\t\t\t\tparent.uniqueId();\n\t\t\t\t\tthat.parents[ this.id ] = {\n\t\t\t\t\t\telement: this,\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\n\t\t\t\t\t};\n\t\t\t\t\tparent.attr( \"title\", \"\" );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis._registerCloseHandlers( event, target );\n\t\tthis._updateContent( target, event );\n\t},\n\n\t_updateContent: function( target, event ) {\n\t\tvar content,\n\t\t\tcontentOption = this.options.content,\n\t\t\tthat = this,\n\t\t\teventType = event ? event.type : null;\n\n\t\tif ( typeof contentOption === \"string\" || contentOption.nodeType ||\n\t\t\t\tcontentOption.jquery ) {\n\t\t\treturn this._open( event, target, contentOption );\n\t\t}\n\n\t\tcontent = contentOption.call( target[ 0 ], function( response ) {\n\n\t\t\t// IE may instantly serve a cached response for ajax requests\n\t\t\t// delay this call to _open so the other call to _open runs first\n\t\t\tthat._delay( function() {\n\n\t\t\t\t// Ignore async response if tooltip was closed already\n\t\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// JQuery creates a special event for focusin when it doesn't\n\t\t\t\t// exist natively. To improve performance, the native event\n\t\t\t\t// object is reused and the type is changed. Therefore, we can't\n\t\t\t\t// rely on the type being correct after the event finished\n\t\t\t\t// bubbling, so we set it back to the previous value. (#8740)\n\t\t\t\tif ( event ) {\n\t\t\t\t\tevent.type = eventType;\n\t\t\t\t}\n\t\t\t\tthis._open( event, target, response );\n\t\t\t} );\n\t\t} );\n\t\tif ( content ) {\n\t\t\tthis._open( event, target, content );\n\t\t}\n\t},\n\n\t_open: function( event, target, content ) {\n\t\tvar tooltipData, tooltip, delayedShow, a11yContent,\n\t\t\tpositionOption = $.extend( {}, this.options.position );\n\n\t\tif ( !content ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Content can be updated multiple times. If the tooltip already\n\t\t// exists, then just update the content and bail.\n\t\ttooltipData = this._find( target );\n\t\tif ( tooltipData ) {\n\t\t\ttooltipData.tooltip.find( \".ui-tooltip-content\" ).html( content );\n\t\t\treturn;\n\t\t}\n\n\t\t// If we have a title, clear it to prevent the native tooltip\n\t\t// we have to check first to avoid defining a title if none exists\n\t\t// (we don't want to cause an element to start matching [title])\n\t\t//\n\t\t// We use removeAttr only for key events, to allow IE to export the correct\n\t\t// accessible attributes. For mouse events, set to empty string to avoid\n\t\t// native tooltip showing up (happens only when removing inside mouseover).\n\t\tif ( target.is( \"[title]\" ) ) {\n\t\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\t\ttarget.attr( \"title\", \"\" );\n\t\t\t} else {\n\t\t\t\ttarget.removeAttr( \"title\" );\n\t\t\t}\n\t\t}\n\n\t\ttooltipData = this._tooltip( target );\n\t\ttooltip = tooltipData.tooltip;\n\t\tthis._addDescribedBy( target, tooltip.attr( \"id\" ) );\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\n\t\t// Support: Voiceover on OS X, JAWS on IE <= 9\n\t\t// JAWS announces deletions even when aria-relevant=\"additions\"\n\t\t// Voiceover will sometimes re-read the entire log region's contents from the beginning\n\t\tthis.liveRegion.children().hide();\n\t\ta11yContent = $( \"
\" ).html( tooltip.find( \".ui-tooltip-content\" ).html() );\n\t\ta11yContent.removeAttr( \"name\" ).find( \"[name]\" ).removeAttr( \"name\" );\n\t\ta11yContent.removeAttr( \"id\" ).find( \"[id]\" ).removeAttr( \"id\" );\n\t\ta11yContent.appendTo( this.liveRegion );\n\n\t\tfunction position( event ) {\n\t\t\tpositionOption.of = event;\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttooltip.position( positionOption );\n\t\t}\n\t\tif ( this.options.track && event && /^mouse/.test( event.type ) ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\tmousemove: position\n\t\t\t} );\n\n\t\t\t// trigger once to override element-relative positioning\n\t\t\tposition( event );\n\t\t} else {\n\t\t\ttooltip.position( $.extend( {\n\t\t\t\tof: target\n\t\t\t}, this.options.position ) );\n\t\t}\n\n\t\ttooltip.hide();\n\n\t\tthis._show( tooltip, this.options.show );\n\n\t\t// Handle tracking tooltips that are shown with a delay (#8644). As soon\n\t\t// as the tooltip is visible, position the tooltip using the most recent\n\t\t// event.\n\t\t// Adds the check to add the timers only when both delay and track options are set (#14682)\n\t\tif ( this.options.track && this.options.show && this.options.show.delay ) {\n\t\t\tdelayedShow = this.delayedShow = setInterval( function() {\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\n\t\t\t\t\tposition( positionOption.of );\n\t\t\t\t\tclearInterval( delayedShow );\n\t\t\t\t}\n\t\t\t}, $.fx.interval );\n\t\t}\n\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\n\t},\n\n\t_registerCloseHandlers: function( event, target ) {\n\t\tvar events = {\n\t\t\tkeyup: function( event ) {\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tvar fakeEvent = $.Event( event );\n\t\t\t\t\tfakeEvent.currentTarget = target[ 0 ];\n\t\t\t\t\tthis.close( fakeEvent, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Only bind remove handler for delegated targets. Non-delegated\n\t\t// tooltips will handle this in destroy.\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tevents.remove = function() {\n\t\t\t\tthis._removeTooltip( this._find( target ).tooltip );\n\t\t\t};\n\t\t}\n\n\t\tif ( !event || event.type === \"mouseover\" ) {\n\t\t\tevents.mouseleave = \"close\";\n\t\t}\n\t\tif ( !event || event.type === \"focusin\" ) {\n\t\t\tevents.focusout = \"close\";\n\t\t}\n\t\tthis._on( true, target, events );\n\t},\n\n\tclose: function( event ) {\n\t\tvar tooltip,\n\t\t\tthat = this,\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\n\t\t\ttooltipData = this._find( target );\n\n\t\t// The tooltip may already be closed\n\t\tif ( !tooltipData ) {\n\n\t\t\t// We set ui-tooltip-open immediately upon open (in open()), but only set the\n\t\t\t// additional data once there's actually content to show (in _open()). So even if the\n\t\t\t// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\n\t\t\t// the period between open() and _open().\n\t\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\t\treturn;\n\t\t}\n\n\t\ttooltip = tooltipData.tooltip;\n\n\t\t// Disabling closes the tooltip, so we need to track when we're closing\n\t\t// to avoid an infinite loop in case the tooltip becomes disabled on close\n\t\tif ( tooltipData.closing ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\t// Only set title if we had one before (see comment in _open())\n\t\t// If the title attribute has changed since open(), don't restore\n\t\tif ( target.data( \"ui-tooltip-title\" ) && !target.attr( \"title\" ) ) {\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\n\t\t}\n\n\t\tthis._removeDescribedBy( target );\n\n\t\ttooltipData.hiding = true;\n\t\ttooltip.stop( true );\n\t\tthis._hide( tooltip, this.options.hide, function() {\n\t\t\tthat._removeTooltip( $( this ) );\n\t\t} );\n\n\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\n\n\t\t// Remove 'remove' binding only on delegated targets\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tthis._off( target, \"remove\" );\n\t\t}\n\t\tthis._off( this.document, \"mousemove\" );\n\n\t\tif ( event && event.type === \"mouseleave\" ) {\n\t\t\t$.each( this.parents, function( id, parent ) {\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\n\t\t\t\tdelete that.parents[ id ];\n\t\t\t} );\n\t\t}\n\n\t\ttooltipData.closing = true;\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\n\t\tif ( !tooltipData.hiding ) {\n\t\t\ttooltipData.closing = false;\n\t\t}\n\t},\n\n\t_tooltip: function( element ) {\n\t\tvar tooltip = $( \"
\" ).attr( \"role\", \"tooltip\" ),\n\t\t\tcontent = $( \"
\" ).appendTo( tooltip ),\n\t\t\tid = tooltip.uniqueId().attr( \"id\" );\n\n\t\tthis._addClass( content, \"ui-tooltip-content\" );\n\t\tthis._addClass( tooltip, \"ui-tooltip\", \"ui-widget ui-widget-content\" );\n\n\t\ttooltip.appendTo( this._appendTo( element ) );\n\n\t\treturn this.tooltips[ id ] = {\n\t\t\telement: element,\n\t\t\ttooltip: tooltip\n\t\t};\n\t},\n\n\t_find: function( target ) {\n\t\tvar id = target.data( \"ui-tooltip-id\" );\n\t\treturn id ? this.tooltips[ id ] : null;\n\t},\n\n\t_removeTooltip: function( tooltip ) {\n\t\ttooltip.remove();\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\n\t},\n\n\t_appendTo: function( target ) {\n\t\tvar element = target.closest( \".ui-front, dialog\" );\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_destroy: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\n\t\t\t// Delegate to close method to handle common cleanup\n\t\t\tvar event = $.Event( \"blur\" ),\n\t\t\t\telement = tooltipData.element;\n\t\t\tevent.target = event.currentTarget = element[ 0 ];\n\t\t\tthat.close( event, true );\n\n\t\t\t// Remove immediately; destroying an open tooltip doesn't use the\n\t\t\t// hide animation\n\t\t\t$( \"#\" + id ).remove();\n\n\t\t\t// Restore the title\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\n\t\t\t\t// If the title attribute has changed since open(), don't restore\n\t\t\t\tif ( !element.attr( \"title\" ) ) {\n\t\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t\t}\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\n\t\t\t}\n\t\t} );\n\t\tthis.liveRegion.remove();\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for tooltipClass option\n\t$.widget( \"ui.tooltip\", $.ui.tooltip, {\n\t\toptions: {\n\t\t\ttooltipClass: null\n\t\t},\n\t\t_tooltip: function() {\n\t\t\tvar tooltipData = this._superApply( arguments );\n\t\t\tif ( this.options.tooltipClass ) {\n\t\t\t\ttooltipData.tooltip.addClass( this.options.tooltipClass );\n\t\t\t}\n\t\t\treturn tooltipData;\n\t\t}\n\t} );\n}\n\nvar widgetsTooltip = $.ui.tooltip;\n\n\n\n\n}));","/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)\n * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)\n * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\n *\n * Version: 1.3.8\n *\n */\n(function($) {\n\n $.fn.extend({\n slimScroll: function(options) {\n\n var defaults = {\n\n // width in pixels of the visible scroll area\n width : 'auto',\n\n // height in pixels of the visible scroll area\n height : '250px',\n\n // width in pixels of the scrollbar and rail\n size : '7px',\n\n // scrollbar color, accepts any hex/color value\n color: '#000',\n\n // scrollbar position - left/right\n position : 'right',\n\n // distance in pixels between the side edge and the scrollbar\n distance : '1px',\n\n // default scroll position on load - top / bottom / $('selector')\n start : 'top',\n\n // sets scrollbar opacity\n opacity : .4,\n\n // enables always-on mode for the scrollbar\n alwaysVisible : false,\n\n // check if we should hide the scrollbar when user is hovering over\n disableFadeOut : false,\n\n // sets visibility of the rail\n railVisible : false,\n\n // sets rail color\n railColor : '#333',\n\n // sets rail opacity\n railOpacity : .2,\n\n // whether we should use jQuery UI Draggable to enable bar dragging\n railDraggable : true,\n\n // defautlt CSS class of the slimscroll rail\n railClass : 'slimScrollRail',\n\n // defautlt CSS class of the slimscroll bar\n barClass : 'slimScrollBar',\n\n // defautlt CSS class of the slimscroll wrapper\n wrapperClass : 'slimScrollDiv',\n\n // check if mousewheel should scroll the window if we reach top/bottom\n allowPageScroll : false,\n\n // scroll amount applied to each mouse wheel step\n wheelStep : 20,\n\n // scroll amount applied when user is using gestures\n touchScrollStep : 200,\n\n // sets border radius\n borderRadius: '7px',\n\n // sets border radius of the rail\n railBorderRadius : '7px'\n };\n\n var o = $.extend(defaults, options);\n\n // do it for every element that matches selector\n this.each(function(){\n\n var isOverPanel, isOverBar, isDragg, queueHide, touchDif,\n barHeight, percentScroll, lastScroll,\n divS = '
',\n minBarHeight = 30,\n releaseScroll = false;\n\n // used in event handlers and for better minification\n var me = $(this);\n\n // ensure we are not binding it again\n if (me.parent().hasClass(o.wrapperClass))\n {\n // start from last bar position\n var offset = me.scrollTop();\n\n // find bar and rail\n bar = me.siblings('.' + o.barClass);\n rail = me.siblings('.' + o.railClass);\n\n getBarHeight();\n\n // check if we should scroll existing instance\n if ($.isPlainObject(options))\n {\n // Pass height: auto to an existing slimscroll object to force a resize after contents have changed\n if ( 'height' in options && options.height == 'auto' ) {\n me.parent().css('height', 'auto');\n me.css('height', 'auto');\n var height = me.parent().parent().height();\n me.parent().css('height', height);\n me.css('height', height);\n } else if ('height' in options) {\n var h = options.height;\n me.parent().css('height', h);\n me.css('height', h);\n }\n\n if ('scrollTo' in options)\n {\n // jump to a static point\n offset = parseInt(o.scrollTo);\n }\n else if ('scrollBy' in options)\n {\n // jump by value pixels\n offset += parseInt(o.scrollBy);\n }\n else if ('destroy' in options)\n {\n // remove slimscroll elements\n bar.remove();\n rail.remove();\n me.unwrap();\n return;\n }\n\n // scroll content by the given offset\n scrollContent(offset, false, true);\n }\n\n return;\n }\n else if ($.isPlainObject(options))\n {\n if ('destroy' in options)\n {\n \treturn;\n }\n }\n\n // optionally set height to the parent's height\n o.height = (o.height == 'auto') ? me.parent().height() : o.height;\n\n // wrap content\n var wrapper = $(divS)\n .addClass(o.wrapperClass)\n .css({\n position: 'relative',\n overflow: 'hidden',\n width: o.width,\n height: o.height\n });\n\n // update style for the div\n me.css({\n overflow: 'hidden',\n width: o.width,\n height: o.height\n });\n\n // create scrollbar rail\n var rail = $(divS)\n .addClass(o.railClass)\n .css({\n width: o.size,\n height: '100%',\n position: 'absolute',\n top: 0,\n display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',\n 'border-radius': o.railBorderRadius,\n background: o.railColor,\n opacity: o.railOpacity,\n zIndex: 90\n });\n\n // create scrollbar\n var bar = $(divS)\n .addClass(o.barClass)\n .css({\n background: o.color,\n width: o.size,\n position: 'absolute',\n top: 0,\n opacity: o.opacity,\n display: o.alwaysVisible ? 'block' : 'none',\n 'border-radius' : o.borderRadius,\n BorderRadius: o.borderRadius,\n MozBorderRadius: o.borderRadius,\n WebkitBorderRadius: o.borderRadius,\n zIndex: 99\n });\n\n // set position\n var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance };\n rail.css(posCss);\n bar.css(posCss);\n\n // wrap it\n me.wrap(wrapper);\n\n // append to parent div\n me.parent().append(bar);\n me.parent().append(rail);\n\n // make it draggable and no longer dependent on the jqueryUI\n if (o.railDraggable){\n bar.bind(\"mousedown\", function(e) {\n var $doc = $(document);\n isDragg = true;\n t = parseFloat(bar.css('top'));\n pageY = e.pageY;\n\n $doc.bind(\"mousemove.slimscroll\", function(e){\n currTop = t + e.pageY - pageY;\n bar.css('top', currTop);\n scrollContent(0, bar.position().top, false);// scroll content\n });\n\n $doc.bind(\"mouseup.slimscroll\", function(e) {\n isDragg = false;hideBar();\n $doc.unbind('.slimscroll');\n });\n return false;\n }).bind(\"selectstart.slimscroll\", function(e){\n e.stopPropagation();\n e.preventDefault();\n return false;\n });\n }\n\n // on rail over\n rail.hover(function(){\n showBar();\n }, function(){\n hideBar();\n });\n\n // on bar over\n bar.hover(function(){\n isOverBar = true;\n }, function(){\n isOverBar = false;\n });\n\n // show on parent mouseover\n me.hover(function(){\n isOverPanel = true;\n showBar();\n hideBar();\n }, function(){\n isOverPanel = false;\n hideBar();\n });\n\n // support for mobile\n me.bind('touchstart', function(e,b){\n if (e.originalEvent.touches.length)\n {\n // record where touch started\n touchDif = e.originalEvent.touches[0].pageY;\n }\n });\n\n me.bind('touchmove', function(e){\n // prevent scrolling the page if necessary\n if(!releaseScroll)\n {\n \t\t e.originalEvent.preventDefault();\n\t\t }\n if (e.originalEvent.touches.length)\n {\n // see how far user swiped\n var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;\n // scroll content\n scrollContent(diff, true);\n touchDif = e.originalEvent.touches[0].pageY;\n }\n });\n\n // set up initial height\n getBarHeight();\n\n // check start position\n if (o.start === 'bottom')\n {\n // scroll content to bottom\n bar.css({ top: me.outerHeight() - bar.outerHeight() });\n scrollContent(0, true);\n }\n else if (o.start !== 'top')\n {\n // assume jQuery selector\n scrollContent($(o.start).position().top, null, true);\n\n // make sure bar stays hidden\n if (!o.alwaysVisible) { bar.hide(); }\n }\n\n // attach scroll events\n attachWheel(this);\n\n function _onWheel(e)\n {\n // use mouse wheel only when mouse is over\n if (!isOverPanel) { return; }\n\n var e = e || window.event;\n\n var delta = 0;\n if (e.wheelDelta) { delta = -e.wheelDelta/120; }\n if (e.detail) { delta = e.detail / 3; }\n\n var target = e.target || e.srcTarget || e.srcElement;\n if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {\n // scroll content\n scrollContent(delta, true);\n }\n\n // stop window scroll\n if (e.preventDefault && !releaseScroll) { e.preventDefault(); }\n if (!releaseScroll) { e.returnValue = false; }\n }\n\n function scrollContent(y, isWheel, isJump)\n {\n releaseScroll = false;\n var delta = y;\n var maxTop = me.outerHeight() - bar.outerHeight();\n\n if (isWheel)\n {\n // move bar with mouse wheel\n delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();\n\n // move bar, make sure it doesn't go out\n delta = Math.min(Math.max(delta, 0), maxTop);\n\n // if scrolling down, make sure a fractional change to the\n // scroll position isn't rounded away when the scrollbar's CSS is set\n // this flooring of delta would happened automatically when\n // bar.css is set below, but we floor here for clarity\n delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);\n\n // scroll the scrollbar\n bar.css({ top: delta + 'px' });\n }\n\n // calculate actual scroll amount\n percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());\n delta = percentScroll * (me[0].scrollHeight - me.outerHeight());\n\n if (isJump)\n {\n delta = y;\n var offsetTop = delta / me[0].scrollHeight * me.outerHeight();\n offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);\n bar.css({ top: offsetTop + 'px' });\n }\n\n // scroll content\n me.scrollTop(delta);\n\n // fire scrolling event\n me.trigger('slimscrolling', ~~delta);\n\n // ensure bar is visible\n showBar();\n\n // trigger hide when scroll is stopped\n hideBar();\n }\n\n function attachWheel(target)\n {\n if (window.addEventListener)\n {\n target.addEventListener('DOMMouseScroll', _onWheel, false );\n target.addEventListener('mousewheel', _onWheel, false );\n }\n else\n {\n document.attachEvent(\"onmousewheel\", _onWheel)\n }\n }\n\n function getBarHeight()\n {\n // calculate scrollbar height and make sure it is not too small\n barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);\n bar.css({ height: barHeight + 'px' });\n\n // hide scrollbar if content is not long enough\n var display = barHeight == me.outerHeight() ? 'none' : 'block';\n bar.css({ display: display });\n }\n\n function showBar()\n {\n // recalculate bar height\n getBarHeight();\n clearTimeout(queueHide);\n\n // when bar reached top or bottom\n if (percentScroll == ~~percentScroll)\n {\n //release wheel\n releaseScroll = o.allowPageScroll;\n\n // publish approporiate event\n if (lastScroll != percentScroll)\n {\n var msg = (~~percentScroll == 0) ? 'top' : 'bottom';\n me.trigger('slimscroll', msg);\n }\n }\n else\n {\n releaseScroll = false;\n }\n lastScroll = percentScroll;\n\n // show only when required\n if(barHeight >= me.outerHeight()) {\n //allow window scroll\n releaseScroll = true;\n return;\n }\n bar.stop(true,true).fadeIn('fast');\n if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); }\n }\n\n function hideBar()\n {\n // only hide when options allow it\n if (!o.alwaysVisible)\n {\n queueHide = setTimeout(function(){\n if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)\n {\n bar.fadeOut('slow');\n rail.fadeOut('slow');\n }\n }, 1000);\n }\n }\n\n });\n\n // maintain chainability\n return this;\n }\n });\n\n $.fn.extend({\n slimscroll: $.fn.slimScroll\n });\n\n})(jQuery);\n","// This [jQuery](https://jquery.com/) plugin implements an `\");\n\n // The first load event gets fired after the iframe has been injected\n // into the DOM, and is used to prepare the actual submission.\n iframe.one(\"load\", function() {\n\n // The second load event gets fired when the response to the form\n // submission is received. The implementation detects whether the\n // actual payload is embedded in a `\\\";\\n\\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\\n} )();\\nvar documentElement = document.documentElement;\\n\\n\\n\\nvar\\n\\trkeyEvent = /^key/,\\n\\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\\n\\trtypenamespace = /^([^.]*)(?:\\\\.(.+)|)/;\\n\\nfunction returnTrue() {\\n\\treturn true;\\n}\\n\\nfunction returnFalse() {\\n\\treturn false;\\n}\\n\\n// Support: IE <=9 only\\n// See #13393 for more info\\nfunction safeActiveElement() {\\n\\ttry {\\n\\t\\treturn document.activeElement;\\n\\t} catch ( err ) { }\\n}\\n\\nfunction on( elem, types, selector, data, fn, one ) {\\n\\tvar origFn, type;\\n\\n\\t// Types can be a map of types/handlers\\n\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t// ( types-Object, selector, data )\\n\\t\\tif ( typeof selector !== \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types-Object, data )\\n\\t\\t\\tdata = data || selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tfor ( type in types ) {\\n\\t\\t\\ton( elem, type, selector, data, types[ type ], one );\\n\\t\\t}\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( data == null && fn == null ) {\\n\\n\\t\\t// ( types, fn )\\n\\t\\tfn = selector;\\n\\t\\tdata = selector = undefined;\\n\\t} else if ( fn == null ) {\\n\\t\\tif ( typeof selector === \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types, selector, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t} else {\\n\\n\\t\\t\\t// ( types, data, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t}\\n\\tif ( fn === false ) {\\n\\t\\tfn = returnFalse;\\n\\t} else if ( !fn ) {\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( one === 1 ) {\\n\\t\\torigFn = fn;\\n\\t\\tfn = function( event ) {\\n\\n\\t\\t\\t// Can use an empty set, since event contains the info\\n\\t\\t\\tjQuery().off( event );\\n\\t\\t\\treturn origFn.apply( this, arguments );\\n\\t\\t};\\n\\n\\t\\t// Use same guid so caller can remove using origFn\\n\\t\\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\\n\\t}\\n\\treturn elem.each( function() {\\n\\t\\tjQuery.event.add( this, types, fn, data, selector );\\n\\t} );\\n}\\n\\n/*\\n * Helper functions for managing events -- not part of the public interface.\\n * Props to Dean Edwards' addEvent library for many of the ideas.\\n */\\njQuery.event = {\\n\\n\\tglobal: {},\\n\\n\\tadd: function( elem, types, handler, data, selector ) {\\n\\n\\t\\tvar handleObjIn, eventHandle, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.get( elem );\\n\\n\\t\\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\\n\\t\\tif ( !elemData ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Caller can pass in an object of custom data in lieu of the handler\\n\\t\\tif ( handler.handler ) {\\n\\t\\t\\thandleObjIn = handler;\\n\\t\\t\\thandler = handleObjIn.handler;\\n\\t\\t\\tselector = handleObjIn.selector;\\n\\t\\t}\\n\\n\\t\\t// Ensure that invalid selectors throw exceptions at attach time\\n\\t\\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\\n\\t\\tif ( selector ) {\\n\\t\\t\\tjQuery.find.matchesSelector( documentElement, selector );\\n\\t\\t}\\n\\n\\t\\t// Make sure that the handler has a unique ID, used to find/remove it later\\n\\t\\tif ( !handler.guid ) {\\n\\t\\t\\thandler.guid = jQuery.guid++;\\n\\t\\t}\\n\\n\\t\\t// Init the element's event structure and main handler, if this is the first\\n\\t\\tif ( !( events = elemData.events ) ) {\\n\\t\\t\\tevents = elemData.events = {};\\n\\t\\t}\\n\\t\\tif ( !( eventHandle = elemData.handle ) ) {\\n\\t\\t\\teventHandle = elemData.handle = function( e ) {\\n\\n\\t\\t\\t\\t// Discard the second event of a jQuery.event.trigger() and\\n\\t\\t\\t\\t// when an event is called after a page has unloaded\\n\\t\\t\\t\\treturn typeof jQuery !== \\\"undefined\\\" && jQuery.event.triggered !== e.type ?\\n\\t\\t\\t\\t\\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\\n\\t\\t\\t};\\n\\t\\t}\\n\\n\\t\\t// Handle multiple events separated by a space\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// There *must* be a type, no attaching namespace-only handlers\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If event changes its type, use the special event handlers for the changed type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// If selector defined, determine special event api type, otherwise given type\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\n\\t\\t\\t// Update special based on newly reset type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// handleObj is passed to all event handlers\\n\\t\\t\\thandleObj = jQuery.extend( {\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\torigType: origType,\\n\\t\\t\\t\\tdata: data,\\n\\t\\t\\t\\thandler: handler,\\n\\t\\t\\t\\tguid: handler.guid,\\n\\t\\t\\t\\tselector: selector,\\n\\t\\t\\t\\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\\n\\t\\t\\t\\tnamespace: namespaces.join( \\\".\\\" )\\n\\t\\t\\t}, handleObjIn );\\n\\n\\t\\t\\t// Init the event handler queue if we're the first\\n\\t\\t\\tif ( !( handlers = events[ type ] ) ) {\\n\\t\\t\\t\\thandlers = events[ type ] = [];\\n\\t\\t\\t\\thandlers.delegateCount = 0;\\n\\n\\t\\t\\t\\t// Only use addEventListener if the special events handler returns false\\n\\t\\t\\t\\tif ( !special.setup ||\\n\\t\\t\\t\\t\\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\\n\\n\\t\\t\\t\\t\\tif ( elem.addEventListener ) {\\n\\t\\t\\t\\t\\t\\telem.addEventListener( type, eventHandle );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( special.add ) {\\n\\t\\t\\t\\tspecial.add.call( elem, handleObj );\\n\\n\\t\\t\\t\\tif ( !handleObj.handler.guid ) {\\n\\t\\t\\t\\t\\thandleObj.handler.guid = handler.guid;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add to the element's handler list, delegates in front\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\thandlers.splice( handlers.delegateCount++, 0, handleObj );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\thandlers.push( handleObj );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Keep track of which events have ever been used, for event optimization\\n\\t\\t\\tjQuery.event.global[ type ] = true;\\n\\t\\t}\\n\\n\\t},\\n\\n\\t// Detach an event or set of events from an element\\n\\tremove: function( elem, types, handler, selector, mappedTypes ) {\\n\\n\\t\\tvar j, origCount, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\\n\\n\\t\\tif ( !elemData || !( events = elemData.events ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Once for each type.namespace in types; type may be omitted\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// Unbind all events (on this namespace, if provided) for the element\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\t\\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\t\\t\\thandlers = events[ type ] || [];\\n\\t\\t\\ttmp = tmp[ 2 ] &&\\n\\t\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" );\\n\\n\\t\\t\\t// Remove matching events\\n\\t\\t\\torigCount = j = handlers.length;\\n\\t\\t\\twhile ( j-- ) {\\n\\t\\t\\t\\thandleObj = handlers[ j ];\\n\\n\\t\\t\\t\\tif ( ( mappedTypes || origType === handleObj.origType ) &&\\n\\t\\t\\t\\t\\t( !handler || handler.guid === handleObj.guid ) &&\\n\\t\\t\\t\\t\\t( !tmp || tmp.test( handleObj.namespace ) ) &&\\n\\t\\t\\t\\t\\t( !selector || selector === handleObj.selector ||\\n\\t\\t\\t\\t\\t\\tselector === \\\"**\\\" && handleObj.selector ) ) {\\n\\t\\t\\t\\t\\thandlers.splice( j, 1 );\\n\\n\\t\\t\\t\\t\\tif ( handleObj.selector ) {\\n\\t\\t\\t\\t\\t\\thandlers.delegateCount--;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( special.remove ) {\\n\\t\\t\\t\\t\\t\\tspecial.remove.call( elem, handleObj );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Remove generic event handler if we removed something and no more handlers exist\\n\\t\\t\\t// (avoids potential for endless recursion during removal of special event handlers)\\n\\t\\t\\tif ( origCount && !handlers.length ) {\\n\\t\\t\\t\\tif ( !special.teardown ||\\n\\t\\t\\t\\t\\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\\n\\n\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, elemData.handle );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tdelete events[ type ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Remove data and the expando if it's no longer used\\n\\t\\tif ( jQuery.isEmptyObject( events ) ) {\\n\\t\\t\\tdataPriv.remove( elem, \\\"handle events\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tdispatch: function( nativeEvent ) {\\n\\n\\t\\t// Make a writable jQuery.Event from the native event object\\n\\t\\tvar event = jQuery.event.fix( nativeEvent );\\n\\n\\t\\tvar i, j, ret, matched, handleObj, handlerQueue,\\n\\t\\t\\targs = new Array( arguments.length ),\\n\\t\\t\\thandlers = ( dataPriv.get( this, \\\"events\\\" ) || {} )[ event.type ] || [],\\n\\t\\t\\tspecial = jQuery.event.special[ event.type ] || {};\\n\\n\\t\\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\\n\\t\\targs[ 0 ] = event;\\n\\n\\t\\tfor ( i = 1; i < arguments.length; i++ ) {\\n\\t\\t\\targs[ i ] = arguments[ i ];\\n\\t\\t}\\n\\n\\t\\tevent.delegateTarget = this;\\n\\n\\t\\t// Call the preDispatch hook for the mapped type, and let it bail if desired\\n\\t\\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine handlers\\n\\t\\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\\n\\n\\t\\t// Run delegates first; they may want to stop propagation beneath us\\n\\t\\ti = 0;\\n\\t\\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\t\\t\\tevent.currentTarget = matched.elem;\\n\\n\\t\\t\\tj = 0;\\n\\t\\t\\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\\n\\t\\t\\t\\t!event.isImmediatePropagationStopped() ) {\\n\\n\\t\\t\\t\\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\\n\\t\\t\\t\\t// a subset or equal to those in the bound event (both can have no namespace).\\n\\t\\t\\t\\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\\n\\n\\t\\t\\t\\t\\tevent.handleObj = handleObj;\\n\\t\\t\\t\\t\\tevent.data = handleObj.data;\\n\\n\\t\\t\\t\\t\\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\\n\\t\\t\\t\\t\\t\\thandleObj.handler ).apply( matched.elem, args );\\n\\n\\t\\t\\t\\t\\tif ( ret !== undefined ) {\\n\\t\\t\\t\\t\\t\\tif ( ( event.result = ret ) === false ) {\\n\\t\\t\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Call the postDispatch hook for the mapped type\\n\\t\\tif ( special.postDispatch ) {\\n\\t\\t\\tspecial.postDispatch.call( this, event );\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\thandlers: function( event, handlers ) {\\n\\t\\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\\n\\t\\t\\thandlerQueue = [],\\n\\t\\t\\tdelegateCount = handlers.delegateCount,\\n\\t\\t\\tcur = event.target;\\n\\n\\t\\t// Find delegate handlers\\n\\t\\tif ( delegateCount &&\\n\\n\\t\\t\\t// Support: IE <=9\\n\\t\\t\\t// Black-hole SVG instance trees (trac-13180)\\n\\t\\t\\tcur.nodeType &&\\n\\n\\t\\t\\t// Support: Firefox <=42\\n\\t\\t\\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\\n\\t\\t\\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\\n\\t\\t\\t// Support: IE 11 only\\n\\t\\t\\t// ...but not arrow key \\\"clicks\\\" of radio inputs, which can have `button` -1 (gh-2343)\\n\\t\\t\\t!( event.type === \\\"click\\\" && event.button >= 1 ) ) {\\n\\n\\t\\t\\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\\n\\n\\t\\t\\t\\t// Don't check non-elements (#13208)\\n\\t\\t\\t\\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\\n\\t\\t\\t\\tif ( cur.nodeType === 1 && !( event.type === \\\"click\\\" && cur.disabled === true ) ) {\\n\\t\\t\\t\\t\\tmatchedHandlers = [];\\n\\t\\t\\t\\t\\tmatchedSelectors = {};\\n\\t\\t\\t\\t\\tfor ( i = 0; i < delegateCount; i++ ) {\\n\\t\\t\\t\\t\\t\\thandleObj = handlers[ i ];\\n\\n\\t\\t\\t\\t\\t\\t// Don't conflict with Object.prototype properties (#13203)\\n\\t\\t\\t\\t\\t\\tsel = handleObj.selector + \\\" \\\";\\n\\n\\t\\t\\t\\t\\t\\tif ( matchedSelectors[ sel ] === undefined ) {\\n\\t\\t\\t\\t\\t\\t\\tmatchedSelectors[ sel ] = handleObj.needsContext ?\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery( sel, this ).index( cur ) > -1 :\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.find( sel, this, null, [ cur ] ).length;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif ( matchedSelectors[ sel ] ) {\\n\\t\\t\\t\\t\\t\\t\\tmatchedHandlers.push( handleObj );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( matchedHandlers.length ) {\\n\\t\\t\\t\\t\\t\\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Add the remaining (directly-bound) handlers\\n\\t\\tcur = this;\\n\\t\\tif ( delegateCount < handlers.length ) {\\n\\t\\t\\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\\n\\t\\t}\\n\\n\\t\\treturn handlerQueue;\\n\\t},\\n\\n\\taddProp: function( name, hook ) {\\n\\t\\tObject.defineProperty( jQuery.Event.prototype, name, {\\n\\t\\t\\tenumerable: true,\\n\\t\\t\\tconfigurable: true,\\n\\n\\t\\t\\tget: jQuery.isFunction( hook ) ?\\n\\t\\t\\t\\tfunction() {\\n\\t\\t\\t\\t\\tif ( this.originalEvent ) {\\n\\t\\t\\t\\t\\t\\t\\treturn hook( this.originalEvent );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} :\\n\\t\\t\\t\\tfunction() {\\n\\t\\t\\t\\t\\tif ( this.originalEvent ) {\\n\\t\\t\\t\\t\\t\\t\\treturn this.originalEvent[ name ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\tset: function( value ) {\\n\\t\\t\\t\\tObject.defineProperty( this, name, {\\n\\t\\t\\t\\t\\tenumerable: true,\\n\\t\\t\\t\\t\\tconfigurable: true,\\n\\t\\t\\t\\t\\twritable: true,\\n\\t\\t\\t\\t\\tvalue: value\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tfix: function( originalEvent ) {\\n\\t\\treturn originalEvent[ jQuery.expando ] ?\\n\\t\\t\\toriginalEvent :\\n\\t\\t\\tnew jQuery.Event( originalEvent );\\n\\t},\\n\\n\\tspecial: {\\n\\t\\tload: {\\n\\n\\t\\t\\t// Prevent triggered image.load events from bubbling to window.load\\n\\t\\t\\tnoBubble: true\\n\\t\\t},\\n\\t\\tfocus: {\\n\\n\\t\\t\\t// Fire native event if possible so blur/focus sequence is correct\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this !== safeActiveElement() && this.focus ) {\\n\\t\\t\\t\\t\\tthis.focus();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusin\\\"\\n\\t\\t},\\n\\t\\tblur: {\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this === safeActiveElement() && this.blur ) {\\n\\t\\t\\t\\t\\tthis.blur();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusout\\\"\\n\\t\\t},\\n\\t\\tclick: {\\n\\n\\t\\t\\t// For checkbox, fire native event so checked state will be right\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this.type === \\\"checkbox\\\" && this.click && nodeName( this, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tthis.click();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\t// For cross-browser consistency, don't fire native .click() on links\\n\\t\\t\\t_default: function( event ) {\\n\\t\\t\\t\\treturn nodeName( event.target, \\\"a\\\" );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tbeforeunload: {\\n\\t\\t\\tpostDispatch: function( event ) {\\n\\n\\t\\t\\t\\t// Support: Firefox 20+\\n\\t\\t\\t\\t// Firefox doesn't alert if the returnValue field is not set.\\n\\t\\t\\t\\tif ( event.result !== undefined && event.originalEvent ) {\\n\\t\\t\\t\\t\\tevent.originalEvent.returnValue = event.result;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.removeEvent = function( elem, type, handle ) {\\n\\n\\t// This \\\"if\\\" is needed for plain objects\\n\\tif ( elem.removeEventListener ) {\\n\\t\\telem.removeEventListener( type, handle );\\n\\t}\\n};\\n\\njQuery.Event = function( src, props ) {\\n\\n\\t// Allow instantiation without the 'new' keyword\\n\\tif ( !( this instanceof jQuery.Event ) ) {\\n\\t\\treturn new jQuery.Event( src, props );\\n\\t}\\n\\n\\t// Event object\\n\\tif ( src && src.type ) {\\n\\t\\tthis.originalEvent = src;\\n\\t\\tthis.type = src.type;\\n\\n\\t\\t// Events bubbling up the document may have been marked as prevented\\n\\t\\t// by a handler lower down the tree; reflect the correct value.\\n\\t\\tthis.isDefaultPrevented = src.defaultPrevented ||\\n\\t\\t\\t\\tsrc.defaultPrevented === undefined &&\\n\\n\\t\\t\\t\\t// Support: Android <=2.3 only\\n\\t\\t\\t\\tsrc.returnValue === false ?\\n\\t\\t\\treturnTrue :\\n\\t\\t\\treturnFalse;\\n\\n\\t\\t// Create target properties\\n\\t\\t// Support: Safari <=6 - 7 only\\n\\t\\t// Target should not be a text node (#504, #13143)\\n\\t\\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\\n\\t\\t\\tsrc.target.parentNode :\\n\\t\\t\\tsrc.target;\\n\\n\\t\\tthis.currentTarget = src.currentTarget;\\n\\t\\tthis.relatedTarget = src.relatedTarget;\\n\\n\\t// Event type\\n\\t} else {\\n\\t\\tthis.type = src;\\n\\t}\\n\\n\\t// Put explicitly provided properties onto the event object\\n\\tif ( props ) {\\n\\t\\tjQuery.extend( this, props );\\n\\t}\\n\\n\\t// Create a timestamp if incoming event doesn't have one\\n\\tthis.timeStamp = src && src.timeStamp || jQuery.now();\\n\\n\\t// Mark it as fixed\\n\\tthis[ jQuery.expando ] = true;\\n};\\n\\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\\njQuery.Event.prototype = {\\n\\tconstructor: jQuery.Event,\\n\\tisDefaultPrevented: returnFalse,\\n\\tisPropagationStopped: returnFalse,\\n\\tisImmediatePropagationStopped: returnFalse,\\n\\tisSimulated: false,\\n\\n\\tpreventDefault: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isDefaultPrevented = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.preventDefault();\\n\\t\\t}\\n\\t},\\n\\tstopPropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isPropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopPropagation();\\n\\t\\t}\\n\\t},\\n\\tstopImmediatePropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isImmediatePropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopImmediatePropagation();\\n\\t\\t}\\n\\n\\t\\tthis.stopPropagation();\\n\\t}\\n};\\n\\n// Includes all common event props including KeyEvent and MouseEvent specific props\\njQuery.each( {\\n\\taltKey: true,\\n\\tbubbles: true,\\n\\tcancelable: true,\\n\\tchangedTouches: true,\\n\\tctrlKey: true,\\n\\tdetail: true,\\n\\teventPhase: true,\\n\\tmetaKey: true,\\n\\tpageX: true,\\n\\tpageY: true,\\n\\tshiftKey: true,\\n\\tview: true,\\n\\t\\\"char\\\": true,\\n\\tcharCode: true,\\n\\tkey: true,\\n\\tkeyCode: true,\\n\\tbutton: true,\\n\\tbuttons: true,\\n\\tclientX: true,\\n\\tclientY: true,\\n\\toffsetX: true,\\n\\toffsetY: true,\\n\\tpointerId: true,\\n\\tpointerType: true,\\n\\tscreenX: true,\\n\\tscreenY: true,\\n\\ttargetTouches: true,\\n\\ttoElement: true,\\n\\ttouches: true,\\n\\n\\twhich: function( event ) {\\n\\t\\tvar button = event.button;\\n\\n\\t\\t// Add which for key events\\n\\t\\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\\n\\t\\t\\treturn event.charCode != null ? event.charCode : event.keyCode;\\n\\t\\t}\\n\\n\\t\\t// Add which for click: 1 === left; 2 === middle; 3 === right\\n\\t\\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\\n\\t\\t\\tif ( button & 1 ) {\\n\\t\\t\\t\\treturn 1;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( button & 2 ) {\\n\\t\\t\\t\\treturn 3;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( button & 4 ) {\\n\\t\\t\\t\\treturn 2;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\n\\t\\treturn event.which;\\n\\t}\\n}, jQuery.event.addProp );\\n\\n// Create mouseenter/leave events using mouseover/out and event-time checks\\n// so that event delegation works in jQuery.\\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\\n//\\n// Support: Safari 7 only\\n// Safari sends mouseenter too often; see:\\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\\n// for the description of the bug (it existed in older Chrome versions as well).\\njQuery.each( {\\n\\tmouseenter: \\\"mouseover\\\",\\n\\tmouseleave: \\\"mouseout\\\",\\n\\tpointerenter: \\\"pointerover\\\",\\n\\tpointerleave: \\\"pointerout\\\"\\n}, function( orig, fix ) {\\n\\tjQuery.event.special[ orig ] = {\\n\\t\\tdelegateType: fix,\\n\\t\\tbindType: fix,\\n\\n\\t\\thandle: function( event ) {\\n\\t\\t\\tvar ret,\\n\\t\\t\\t\\ttarget = this,\\n\\t\\t\\t\\trelated = event.relatedTarget,\\n\\t\\t\\t\\thandleObj = event.handleObj;\\n\\n\\t\\t\\t// For mouseenter/leave call the handler if related is outside the target.\\n\\t\\t\\t// NB: No relatedTarget if the mouse left/entered the browser window\\n\\t\\t\\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\\n\\t\\t\\t\\tevent.type = handleObj.origType;\\n\\t\\t\\t\\tret = handleObj.handler.apply( this, arguments );\\n\\t\\t\\t\\tevent.type = fix;\\n\\t\\t\\t}\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\ton: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn );\\n\\t},\\n\\tone: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn, 1 );\\n\\t},\\n\\toff: function( types, selector, fn ) {\\n\\t\\tvar handleObj, type;\\n\\t\\tif ( types && types.preventDefault && types.handleObj ) {\\n\\n\\t\\t\\t// ( event ) dispatched jQuery.Event\\n\\t\\t\\thandleObj = types.handleObj;\\n\\t\\t\\tjQuery( types.delegateTarget ).off(\\n\\t\\t\\t\\thandleObj.namespace ?\\n\\t\\t\\t\\t\\thandleObj.origType + \\\".\\\" + handleObj.namespace :\\n\\t\\t\\t\\t\\thandleObj.origType,\\n\\t\\t\\t\\thandleObj.selector,\\n\\t\\t\\t\\thandleObj.handler\\n\\t\\t\\t);\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t\\t// ( types-object [, selector] )\\n\\t\\t\\tfor ( type in types ) {\\n\\t\\t\\t\\tthis.off( type, selector, types[ type ] );\\n\\t\\t\\t}\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( selector === false || typeof selector === \\\"function\\\" ) {\\n\\n\\t\\t\\t// ( types [, fn] )\\n\\t\\t\\tfn = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tif ( fn === false ) {\\n\\t\\t\\tfn = returnFalse;\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.remove( this, types, fn, selector );\\n\\t\\t} );\\n\\t}\\n} );\\n\\n\\nvar\\n\\n\\t/* eslint-disable max-len */\\n\\n\\t// See https://github.com/eslint/eslint/issues/3229\\n\\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\\\/\\\\0>\\\\x20\\\\t\\\\r\\\\n\\\\f]*)[^>]*)\\\\/>/gi,\\n\\n\\t/* eslint-enable */\\n\\n\\t// Support: IE <=10 - 11, Edge 12 - 13\\n\\t// In IE/Edge using regex groups here causes severe slowdowns.\\n\\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\\n\\trnoInnerhtml = /\\\\s*$/g;\\n\\n// Prefer a tbody over its parent table for containing new rows\\nfunction manipulationTarget( elem, content ) {\\n\\tif ( nodeName( elem, \\\"table\\\" ) &&\\n\\t\\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \\\"tr\\\" ) ) {\\n\\n\\t\\treturn jQuery( \\\">tbody\\\", elem )[ 0 ] || elem;\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\n// Replace/restore the type attribute of script elements for safe DOM manipulation\\nfunction disableScript( elem ) {\\n\\telem.type = ( elem.getAttribute( \\\"type\\\" ) !== null ) + \\\"/\\\" + elem.type;\\n\\treturn elem;\\n}\\nfunction restoreScript( elem ) {\\n\\tvar match = rscriptTypeMasked.exec( elem.type );\\n\\n\\tif ( match ) {\\n\\t\\telem.type = match[ 1 ];\\n\\t} else {\\n\\t\\telem.removeAttribute( \\\"type\\\" );\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\nfunction cloneCopyEvent( src, dest ) {\\n\\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\\n\\n\\tif ( dest.nodeType !== 1 ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// 1. Copy private data: events, handlers, etc.\\n\\tif ( dataPriv.hasData( src ) ) {\\n\\t\\tpdataOld = dataPriv.access( src );\\n\\t\\tpdataCur = dataPriv.set( dest, pdataOld );\\n\\t\\tevents = pdataOld.events;\\n\\n\\t\\tif ( events ) {\\n\\t\\t\\tdelete pdataCur.handle;\\n\\t\\t\\tpdataCur.events = {};\\n\\n\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tjQuery.event.add( dest, type, events[ type ][ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// 2. Copy user data\\n\\tif ( dataUser.hasData( src ) ) {\\n\\t\\tudataOld = dataUser.access( src );\\n\\t\\tudataCur = jQuery.extend( {}, udataOld );\\n\\n\\t\\tdataUser.set( dest, udataCur );\\n\\t}\\n}\\n\\n// Fix IE bugs, see support tests\\nfunction fixInput( src, dest ) {\\n\\tvar nodeName = dest.nodeName.toLowerCase();\\n\\n\\t// Fails to persist the checked state of a cloned checkbox or radio button.\\n\\tif ( nodeName === \\\"input\\\" && rcheckableType.test( src.type ) ) {\\n\\t\\tdest.checked = src.checked;\\n\\n\\t// Fails to return the selected option to the default selected state when cloning options\\n\\t} else if ( nodeName === \\\"input\\\" || nodeName === \\\"textarea\\\" ) {\\n\\t\\tdest.defaultValue = src.defaultValue;\\n\\t}\\n}\\n\\nfunction domManip( collection, args, callback, ignored ) {\\n\\n\\t// Flatten any nested arrays\\n\\targs = concat.apply( [], args );\\n\\n\\tvar fragment, first, scripts, hasScripts, node, doc,\\n\\t\\ti = 0,\\n\\t\\tl = collection.length,\\n\\t\\tiNoClone = l - 1,\\n\\t\\tvalue = args[ 0 ],\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t// We can't cloneNode fragments that contain checked, in WebKit\\n\\tif ( isFunction ||\\n\\t\\t\\t( l > 1 && typeof value === \\\"string\\\" &&\\n\\t\\t\\t\\t!support.checkClone && rchecked.test( value ) ) ) {\\n\\t\\treturn collection.each( function( index ) {\\n\\t\\t\\tvar self = collection.eq( index );\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\targs[ 0 ] = value.call( this, index, self.html() );\\n\\t\\t\\t}\\n\\t\\t\\tdomManip( self, args, callback, ignored );\\n\\t\\t} );\\n\\t}\\n\\n\\tif ( l ) {\\n\\t\\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\\n\\t\\tfirst = fragment.firstChild;\\n\\n\\t\\tif ( fragment.childNodes.length === 1 ) {\\n\\t\\t\\tfragment = first;\\n\\t\\t}\\n\\n\\t\\t// Require either new content or an interest in ignored elements to invoke the callback\\n\\t\\tif ( first || ignored ) {\\n\\t\\t\\tscripts = jQuery.map( getAll( fragment, \\\"script\\\" ), disableScript );\\n\\t\\t\\thasScripts = scripts.length;\\n\\n\\t\\t\\t// Use the original fragment for the last item\\n\\t\\t\\t// instead of the first because it can end up\\n\\t\\t\\t// being emptied incorrectly in certain situations (#8070).\\n\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\tnode = fragment;\\n\\n\\t\\t\\t\\tif ( i !== iNoClone ) {\\n\\t\\t\\t\\t\\tnode = jQuery.clone( node, true, true );\\n\\n\\t\\t\\t\\t\\t// Keep references to cloned scripts for later restoration\\n\\t\\t\\t\\t\\tif ( hasScripts ) {\\n\\n\\t\\t\\t\\t\\t\\t// Support: Android <=4.0 only, PhantomJS 1 only\\n\\t\\t\\t\\t\\t\\t// push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\t\\t\\t\\tjQuery.merge( scripts, getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tcallback.call( collection[ i ], node, i );\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hasScripts ) {\\n\\t\\t\\t\\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\\n\\n\\t\\t\\t\\t// Reenable scripts\\n\\t\\t\\t\\tjQuery.map( scripts, restoreScript );\\n\\n\\t\\t\\t\\t// Evaluate executable scripts on first document insertion\\n\\t\\t\\t\\tfor ( i = 0; i < hasScripts; i++ ) {\\n\\t\\t\\t\\t\\tnode = scripts[ i ];\\n\\t\\t\\t\\t\\tif ( rscriptType.test( node.type || \\\"\\\" ) &&\\n\\t\\t\\t\\t\\t\\t!dataPriv.access( node, \\\"globalEval\\\" ) &&\\n\\t\\t\\t\\t\\t\\tjQuery.contains( doc, node ) ) {\\n\\n\\t\\t\\t\\t\\t\\tif ( node.src ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Optional AJAX dependency, but won't run scripts if not present\\n\\t\\t\\t\\t\\t\\t\\tif ( jQuery._evalUrl ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery._evalUrl( node.src );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tDOMEval( node.textContent.replace( rcleanScript, \\\"\\\" ), doc );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn collection;\\n}\\n\\nfunction remove( elem, selector, keepData ) {\\n\\tvar node,\\n\\t\\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\\n\\t\\ti = 0;\\n\\n\\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\\n\\t\\tif ( !keepData && node.nodeType === 1 ) {\\n\\t\\t\\tjQuery.cleanData( getAll( node ) );\\n\\t\\t}\\n\\n\\t\\tif ( node.parentNode ) {\\n\\t\\t\\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\\n\\t\\t\\t\\tsetGlobalEval( getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t}\\n\\t\\t\\tnode.parentNode.removeChild( node );\\n\\t\\t}\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\njQuery.extend( {\\n\\thtmlPrefilter: function( html ) {\\n\\t\\treturn html.replace( rxhtmlTag, \\\"<$1>\\\" );\\n\\t},\\n\\n\\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\\n\\t\\tvar i, l, srcElements, destElements,\\n\\t\\t\\tclone = elem.cloneNode( true ),\\n\\t\\t\\tinPage = jQuery.contains( elem.ownerDocument, elem );\\n\\n\\t\\t// Fix IE cloning issues\\n\\t\\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\\n\\t\\t\\t\\t!jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\\n\\t\\t\\tdestElements = getAll( clone );\\n\\t\\t\\tsrcElements = getAll( elem );\\n\\n\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\tfixInput( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Copy the events from the original to the clone\\n\\t\\tif ( dataAndEvents ) {\\n\\t\\t\\tif ( deepDataAndEvents ) {\\n\\t\\t\\t\\tsrcElements = srcElements || getAll( elem );\\n\\t\\t\\t\\tdestElements = destElements || getAll( clone );\\n\\n\\t\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcloneCopyEvent( elem, clone );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Preserve script evaluation history\\n\\t\\tdestElements = getAll( clone, \\\"script\\\" );\\n\\t\\tif ( destElements.length > 0 ) {\\n\\t\\t\\tsetGlobalEval( destElements, !inPage && getAll( elem, \\\"script\\\" ) );\\n\\t\\t}\\n\\n\\t\\t// Return the cloned set\\n\\t\\treturn clone;\\n\\t},\\n\\n\\tcleanData: function( elems ) {\\n\\t\\tvar data, elem, type,\\n\\t\\t\\tspecial = jQuery.event.special,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\\n\\t\\t\\tif ( acceptData( elem ) ) {\\n\\t\\t\\t\\tif ( ( data = elem[ dataPriv.expando ] ) ) {\\n\\t\\t\\t\\t\\tif ( data.events ) {\\n\\t\\t\\t\\t\\t\\tfor ( type in data.events ) {\\n\\t\\t\\t\\t\\t\\t\\tif ( special[ type ] ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.event.remove( elem, type );\\n\\n\\t\\t\\t\\t\\t\\t\\t// This is a shortcut to avoid jQuery.event.remove's overhead\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, data.handle );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <=35 - 45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataPriv.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif ( elem[ dataUser.expando ] ) {\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <=35 - 45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataUser.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tdetach: function( selector ) {\\n\\t\\treturn remove( this, selector, true );\\n\\t},\\n\\n\\tremove: function( selector ) {\\n\\t\\treturn remove( this, selector );\\n\\t},\\n\\n\\ttext: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\treturn value === undefined ?\\n\\t\\t\\t\\tjQuery.text( this ) :\\n\\t\\t\\t\\tthis.empty().each( function() {\\n\\t\\t\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\t\\t\\tthis.textContent = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\tappend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.appendChild( elem );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tprepend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.insertBefore( elem, target.firstChild );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tbefore: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tafter: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this.nextSibling );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tempty: function() {\\n\\t\\tvar elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\\n\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\n\\t\\t\\t\\t// Prevent memory leaks\\n\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\n\\t\\t\\t\\t// Remove any remaining nodes\\n\\t\\t\\t\\telem.textContent = \\\"\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tclone: function( dataAndEvents, deepDataAndEvents ) {\\n\\t\\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\\n\\t\\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\\n\\n\\t\\treturn this.map( function() {\\n\\t\\t\\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\\n\\t\\t} );\\n\\t},\\n\\n\\thtml: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\tvar elem = this[ 0 ] || {},\\n\\t\\t\\t\\ti = 0,\\n\\t\\t\\t\\tl = this.length;\\n\\n\\t\\t\\tif ( value === undefined && elem.nodeType === 1 ) {\\n\\t\\t\\t\\treturn elem.innerHTML;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// See if we can take a shortcut and just use innerHTML\\n\\t\\t\\tif ( typeof value === \\\"string\\\" && !rnoInnerhtml.test( value ) &&\\n\\t\\t\\t\\t!wrapMap[ ( rtagName.exec( value ) || [ \\\"\\\", \\\"\\\" ] )[ 1 ].toLowerCase() ] ) {\\n\\n\\t\\t\\t\\tvalue = jQuery.htmlPrefilter( value );\\n\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\t\\t\\telem = this[ i ] || {};\\n\\n\\t\\t\\t\\t\\t\\t// Remove element nodes and prevent memory leaks\\n\\t\\t\\t\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\t\\t\\t\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\t\\t\\t\\t\\t\\t\\telem.innerHTML = value;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\telem = 0;\\n\\n\\t\\t\\t\\t// If using innerHTML throws an exception, use the fallback method\\n\\t\\t\\t\\t} catch ( e ) {}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\tthis.empty().append( value );\\n\\t\\t\\t}\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\treplaceWith: function() {\\n\\t\\tvar ignored = [];\\n\\n\\t\\t// Make the changes, replacing each non-ignored context element with the new content\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tvar parent = this.parentNode;\\n\\n\\t\\t\\tif ( jQuery.inArray( this, ignored ) < 0 ) {\\n\\t\\t\\t\\tjQuery.cleanData( getAll( this ) );\\n\\t\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\t\\tparent.replaceChild( elem, this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t// Force callback invocation\\n\\t\\t}, ignored );\\n\\t}\\n} );\\n\\njQuery.each( {\\n\\tappendTo: \\\"append\\\",\\n\\tprependTo: \\\"prepend\\\",\\n\\tinsertBefore: \\\"before\\\",\\n\\tinsertAfter: \\\"after\\\",\\n\\treplaceAll: \\\"replaceWith\\\"\\n}, function( name, original ) {\\n\\tjQuery.fn[ name ] = function( selector ) {\\n\\t\\tvar elems,\\n\\t\\t\\tret = [],\\n\\t\\t\\tinsert = jQuery( selector ),\\n\\t\\t\\tlast = insert.length - 1,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; i <= last; i++ ) {\\n\\t\\t\\telems = i === last ? this : this.clone( true );\\n\\t\\t\\tjQuery( insert[ i ] )[ original ]( elems );\\n\\n\\t\\t\\t// Support: Android <=4.0 only, PhantomJS 1 only\\n\\t\\t\\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\tpush.apply( ret, elems.get() );\\n\\t\\t}\\n\\n\\t\\treturn this.pushStack( ret );\\n\\t};\\n} );\\nvar rmargin = ( /^margin/ );\\n\\nvar rnumnonpx = new RegExp( \\\"^(\\\" + pnum + \\\")(?!px)[a-z%]+$\\\", \\\"i\\\" );\\n\\nvar getStyles = function( elem ) {\\n\\n\\t\\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\\n\\t\\t// IE throws on elements created in popups\\n\\t\\t// FF meanwhile throws on frame elements through \\\"defaultView.getComputedStyle\\\"\\n\\t\\tvar view = elem.ownerDocument.defaultView;\\n\\n\\t\\tif ( !view || !view.opener ) {\\n\\t\\t\\tview = window;\\n\\t\\t}\\n\\n\\t\\treturn view.getComputedStyle( elem );\\n\\t};\\n\\n\\n\\n( function() {\\n\\n\\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\\n\\t// so they're executed at the same time to save the second computation.\\n\\tfunction computeStyleTests() {\\n\\n\\t\\t// This is a singleton, we need to execute it only once\\n\\t\\tif ( !div ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tdiv.style.cssText =\\n\\t\\t\\t\\\"box-sizing:border-box;\\\" +\\n\\t\\t\\t\\\"position:relative;display:block;\\\" +\\n\\t\\t\\t\\\"margin:auto;border:1px;padding:1px;\\\" +\\n\\t\\t\\t\\\"top:1%;width:50%\\\";\\n\\t\\tdiv.innerHTML = \\\"\\\";\\n\\t\\tdocumentElement.appendChild( container );\\n\\n\\t\\tvar divStyle = window.getComputedStyle( div );\\n\\t\\tpixelPositionVal = divStyle.top !== \\\"1%\\\";\\n\\n\\t\\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\\n\\t\\treliableMarginLeftVal = divStyle.marginLeft === \\\"2px\\\";\\n\\t\\tboxSizingReliableVal = divStyle.width === \\\"4px\\\";\\n\\n\\t\\t// Support: Android 4.0 - 4.3 only\\n\\t\\t// Some styles come back with percentage values, even though they shouldn't\\n\\t\\tdiv.style.marginRight = \\\"50%\\\";\\n\\t\\tpixelMarginRightVal = divStyle.marginRight === \\\"4px\\\";\\n\\n\\t\\tdocumentElement.removeChild( container );\\n\\n\\t\\t// Nullify the div so it wouldn't be stored in the memory and\\n\\t\\t// it will also be a sign that checks already performed\\n\\t\\tdiv = null;\\n\\t}\\n\\n\\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\\n\\t\\tcontainer = document.createElement( \\\"div\\\" ),\\n\\t\\tdiv = document.createElement( \\\"div\\\" );\\n\\n\\t// Finish early in limited (non-browser) environments\\n\\tif ( !div.style ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// Support: IE <=9 - 11 only\\n\\t// Style of cloned element affects source element cloned (#8908)\\n\\tdiv.style.backgroundClip = \\\"content-box\\\";\\n\\tdiv.cloneNode( true ).style.backgroundClip = \\\"\\\";\\n\\tsupport.clearCloneStyle = div.style.backgroundClip === \\\"content-box\\\";\\n\\n\\tcontainer.style.cssText = \\\"border:0;width:8px;height:0;top:0;left:-9999px;\\\" +\\n\\t\\t\\\"padding:0;margin-top:1px;position:absolute\\\";\\n\\tcontainer.appendChild( div );\\n\\n\\tjQuery.extend( support, {\\n\\t\\tpixelPosition: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn pixelPositionVal;\\n\\t\\t},\\n\\t\\tboxSizingReliable: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn boxSizingReliableVal;\\n\\t\\t},\\n\\t\\tpixelMarginRight: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn pixelMarginRightVal;\\n\\t\\t},\\n\\t\\treliableMarginLeft: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn reliableMarginLeftVal;\\n\\t\\t}\\n\\t} );\\n} )();\\n\\n\\nfunction curCSS( elem, name, computed ) {\\n\\tvar width, minWidth, maxWidth, ret,\\n\\n\\t\\t// Support: Firefox 51+\\n\\t\\t// Retrieving style before computed somehow\\n\\t\\t// fixes an issue with getting wrong values\\n\\t\\t// on detached elements\\n\\t\\tstyle = elem.style;\\n\\n\\tcomputed = computed || getStyles( elem );\\n\\n\\t// getPropertyValue is needed for:\\n\\t// .css('filter') (IE 9 only, #12537)\\n\\t// .css('--customProperty) (#3144)\\n\\tif ( computed ) {\\n\\t\\tret = computed.getPropertyValue( name ) || computed[ name ];\\n\\n\\t\\tif ( ret === \\\"\\\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\\n\\t\\t\\tret = jQuery.style( elem, name );\\n\\t\\t}\\n\\n\\t\\t// A tribute to the \\\"awesome hack by Dean Edwards\\\"\\n\\t\\t// Android Browser returns percentage for some values,\\n\\t\\t// but width seems to be reliably pixels.\\n\\t\\t// This is against the CSSOM draft spec:\\n\\t\\t// https://drafts.csswg.org/cssom/#resolved-values\\n\\t\\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\\n\\n\\t\\t\\t// Remember the original values\\n\\t\\t\\twidth = style.width;\\n\\t\\t\\tminWidth = style.minWidth;\\n\\t\\t\\tmaxWidth = style.maxWidth;\\n\\n\\t\\t\\t// Put in the new values to get a computed value out\\n\\t\\t\\tstyle.minWidth = style.maxWidth = style.width = ret;\\n\\t\\t\\tret = computed.width;\\n\\n\\t\\t\\t// Revert the changed values\\n\\t\\t\\tstyle.width = width;\\n\\t\\t\\tstyle.minWidth = minWidth;\\n\\t\\t\\tstyle.maxWidth = maxWidth;\\n\\t\\t}\\n\\t}\\n\\n\\treturn ret !== undefined ?\\n\\n\\t\\t// Support: IE <=9 - 11 only\\n\\t\\t// IE returns zIndex value as an integer.\\n\\t\\tret + \\\"\\\" :\\n\\t\\tret;\\n}\\n\\n\\nfunction addGetHookIf( conditionFn, hookFn ) {\\n\\n\\t// Define the hook, we'll check on the first run if it's really needed.\\n\\treturn {\\n\\t\\tget: function() {\\n\\t\\t\\tif ( conditionFn() ) {\\n\\n\\t\\t\\t\\t// Hook not needed (or it's not possible to use it due\\n\\t\\t\\t\\t// to missing dependency), remove it.\\n\\t\\t\\t\\tdelete this.get;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Hook needed; redefine it so that the support test is not executed again.\\n\\t\\t\\treturn ( this.get = hookFn ).apply( this, arguments );\\n\\t\\t}\\n\\t};\\n}\\n\\n\\nvar\\n\\n\\t// Swappable if display is none or starts with table\\n\\t// except \\\"table\\\", \\\"table-cell\\\", or \\\"table-caption\\\"\\n\\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\\n\\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\\n\\trcustomProp = /^--/,\\n\\tcssShow = { position: \\\"absolute\\\", visibility: \\\"hidden\\\", display: \\\"block\\\" },\\n\\tcssNormalTransform = {\\n\\t\\tletterSpacing: \\\"0\\\",\\n\\t\\tfontWeight: \\\"400\\\"\\n\\t},\\n\\n\\tcssPrefixes = [ \\\"Webkit\\\", \\\"Moz\\\", \\\"ms\\\" ],\\n\\temptyStyle = document.createElement( \\\"div\\\" ).style;\\n\\n// Return a css property mapped to a potentially vendor prefixed property\\nfunction vendorPropName( name ) {\\n\\n\\t// Shortcut for names that are not vendor prefixed\\n\\tif ( name in emptyStyle ) {\\n\\t\\treturn name;\\n\\t}\\n\\n\\t// Check for vendor prefixed names\\n\\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\\n\\t\\ti = cssPrefixes.length;\\n\\n\\twhile ( i-- ) {\\n\\t\\tname = cssPrefixes[ i ] + capName;\\n\\t\\tif ( name in emptyStyle ) {\\n\\t\\t\\treturn name;\\n\\t\\t}\\n\\t}\\n}\\n\\n// Return a property mapped along what jQuery.cssProps suggests or to\\n// a vendor prefixed property.\\nfunction finalPropName( name ) {\\n\\tvar ret = jQuery.cssProps[ name ];\\n\\tif ( !ret ) {\\n\\t\\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\\n\\t}\\n\\treturn ret;\\n}\\n\\nfunction setPositiveNumber( elem, value, subtract ) {\\n\\n\\t// Any relative (+/-) values have already been\\n\\t// normalized at this point\\n\\tvar matches = rcssNum.exec( value );\\n\\treturn matches ?\\n\\n\\t\\t// Guard against undefined \\\"subtract\\\", e.g., when used as in cssHooks\\n\\t\\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \\\"px\\\" ) :\\n\\t\\tvalue;\\n}\\n\\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\\n\\tvar i,\\n\\t\\tval = 0;\\n\\n\\t// If we already have the right measurement, avoid augmentation\\n\\tif ( extra === ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ) ) {\\n\\t\\ti = 4;\\n\\n\\t// Otherwise initialize for horizontal or vertical properties\\n\\t} else {\\n\\t\\ti = name === \\\"width\\\" ? 1 : 0;\\n\\t}\\n\\n\\tfor ( ; i < 4; i += 2 ) {\\n\\n\\t\\t// Both box models exclude margin, so add it if we want it\\n\\t\\tif ( extra === \\\"margin\\\" ) {\\n\\t\\t\\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\\n\\t\\t}\\n\\n\\t\\tif ( isBorderBox ) {\\n\\n\\t\\t\\t// border-box includes padding, so remove it if we want content\\n\\t\\t\\tif ( extra === \\\"content\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// At this point, extra isn't border nor margin, so remove border\\n\\t\\t\\tif ( extra !== \\\"margin\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// At this point, extra isn't content, so add padding\\n\\t\\t\\tval += jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\n\\t\\t\\t// At this point, extra isn't content nor padding, so add border\\n\\t\\t\\tif ( extra !== \\\"padding\\\" ) {\\n\\t\\t\\t\\tval += jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn val;\\n}\\n\\nfunction getWidthOrHeight( elem, name, extra ) {\\n\\n\\t// Start with computed style\\n\\tvar valueIsBorderBox,\\n\\t\\tstyles = getStyles( elem ),\\n\\t\\tval = curCSS( elem, name, styles ),\\n\\t\\tisBorderBox = jQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\";\\n\\n\\t// Computed unit is not pixels. Stop here and return.\\n\\tif ( rnumnonpx.test( val ) ) {\\n\\t\\treturn val;\\n\\t}\\n\\n\\t// Check for style in case a browser which returns unreliable values\\n\\t// for getComputedStyle silently falls back to the reliable elem.style\\n\\tvalueIsBorderBox = isBorderBox &&\\n\\t\\t( support.boxSizingReliable() || val === elem.style[ name ] );\\n\\n\\t// Fall back to offsetWidth/Height when value is \\\"auto\\\"\\n\\t// This happens for inline elements with no explicit setting (gh-3571)\\n\\tif ( val === \\\"auto\\\" ) {\\n\\t\\tval = elem[ \\\"offset\\\" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];\\n\\t}\\n\\n\\t// Normalize \\\"\\\", auto, and prepare for extra\\n\\tval = parseFloat( val ) || 0;\\n\\n\\t// Use the active box-sizing model to add/subtract irrelevant styles\\n\\treturn ( val +\\n\\t\\taugmentWidthOrHeight(\\n\\t\\t\\telem,\\n\\t\\t\\tname,\\n\\t\\t\\textra || ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ),\\n\\t\\t\\tvalueIsBorderBox,\\n\\t\\t\\tstyles\\n\\t\\t)\\n\\t) + \\\"px\\\";\\n}\\n\\njQuery.extend( {\\n\\n\\t// Add in style property hooks for overriding the default\\n\\t// behavior of getting and setting a style property\\n\\tcssHooks: {\\n\\t\\topacity: {\\n\\t\\t\\tget: function( elem, computed ) {\\n\\t\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t\\t// We should always get a number back from opacity\\n\\t\\t\\t\\t\\tvar ret = curCSS( elem, \\\"opacity\\\" );\\n\\t\\t\\t\\t\\treturn ret === \\\"\\\" ? \\\"1\\\" : ret;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\t// Don't automatically add \\\"px\\\" to these possibly-unitless properties\\n\\tcssNumber: {\\n\\t\\t\\\"animationIterationCount\\\": true,\\n\\t\\t\\\"columnCount\\\": true,\\n\\t\\t\\\"fillOpacity\\\": true,\\n\\t\\t\\\"flexGrow\\\": true,\\n\\t\\t\\\"flexShrink\\\": true,\\n\\t\\t\\\"fontWeight\\\": true,\\n\\t\\t\\\"lineHeight\\\": true,\\n\\t\\t\\\"opacity\\\": true,\\n\\t\\t\\\"order\\\": true,\\n\\t\\t\\\"orphans\\\": true,\\n\\t\\t\\\"widows\\\": true,\\n\\t\\t\\\"zIndex\\\": true,\\n\\t\\t\\\"zoom\\\": true\\n\\t},\\n\\n\\t// Add in properties whose names you wish to fix before\\n\\t// setting or getting the value\\n\\tcssProps: {\\n\\t\\t\\\"float\\\": \\\"cssFloat\\\"\\n\\t},\\n\\n\\t// Get and set the style property on a DOM Node\\n\\tstyle: function( elem, name, value, extra ) {\\n\\n\\t\\t// Don't set styles on text and comment nodes\\n\\t\\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Make sure that we're working with the right name\\n\\t\\tvar ret, type, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name ),\\n\\t\\t\\tisCustomProp = rcustomProp.test( name ),\\n\\t\\t\\tstyle = elem.style;\\n\\n\\t\\t// Make sure that we're working with the right name. We don't\\n\\t\\t// want to query the value if it is a CSS custom property\\n\\t\\t// since they are user-defined.\\n\\t\\tif ( !isCustomProp ) {\\n\\t\\t\\tname = finalPropName( origName );\\n\\t\\t}\\n\\n\\t\\t// Gets hook for the prefixed version, then unprefixed version\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// Check if we're setting a value\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\ttype = typeof value;\\n\\n\\t\\t\\t// Convert \\\"+=\\\" or \\\"-=\\\" to relative numbers (#7345)\\n\\t\\t\\tif ( type === \\\"string\\\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\\n\\t\\t\\t\\tvalue = adjustCSS( elem, name, ret );\\n\\n\\t\\t\\t\\t// Fixes bug #9237\\n\\t\\t\\t\\ttype = \\\"number\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Make sure that null and NaN values aren't set (#7116)\\n\\t\\t\\tif ( value == null || value !== value ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a number was passed in, add the unit (except for certain CSS properties)\\n\\t\\t\\tif ( type === \\\"number\\\" ) {\\n\\t\\t\\t\\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \\\"\\\" : \\\"px\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// background-* props affect original clone's values\\n\\t\\t\\tif ( !support.clearCloneStyle && value === \\\"\\\" && name.indexOf( \\\"background\\\" ) === 0 ) {\\n\\t\\t\\t\\tstyle[ name ] = \\\"inherit\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a hook was provided, use that value, otherwise just set the specified value\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) ||\\n\\t\\t\\t\\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\tif ( isCustomProp ) {\\n\\t\\t\\t\\t\\tstyle.setProperty( name, value );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tstyle[ name ] = value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// If a hook was provided get the non-computed value from there\\n\\t\\t\\tif ( hooks && \\\"get\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Otherwise just get the value from the style object\\n\\t\\t\\treturn style[ name ];\\n\\t\\t}\\n\\t},\\n\\n\\tcss: function( elem, name, extra, styles ) {\\n\\t\\tvar val, num, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name ),\\n\\t\\t\\tisCustomProp = rcustomProp.test( name );\\n\\n\\t\\t// Make sure that we're working with the right name. We don't\\n\\t\\t// want to modify the value if it is a CSS custom property\\n\\t\\t// since they are user-defined.\\n\\t\\tif ( !isCustomProp ) {\\n\\t\\t\\tname = finalPropName( origName );\\n\\t\\t}\\n\\n\\t\\t// Try prefixed name followed by the unprefixed name\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// If a hook was provided get the computed value from there\\n\\t\\tif ( hooks && \\\"get\\\" in hooks ) {\\n\\t\\t\\tval = hooks.get( elem, true, extra );\\n\\t\\t}\\n\\n\\t\\t// Otherwise, if a way to get the computed value exists, use that\\n\\t\\tif ( val === undefined ) {\\n\\t\\t\\tval = curCSS( elem, name, styles );\\n\\t\\t}\\n\\n\\t\\t// Convert \\\"normal\\\" to computed value\\n\\t\\tif ( val === \\\"normal\\\" && name in cssNormalTransform ) {\\n\\t\\t\\tval = cssNormalTransform[ name ];\\n\\t\\t}\\n\\n\\t\\t// Make numeric if forced or a qualifier was provided and val looks numeric\\n\\t\\tif ( extra === \\\"\\\" || extra ) {\\n\\t\\t\\tnum = parseFloat( val );\\n\\t\\t\\treturn extra === true || isFinite( num ) ? num || 0 : val;\\n\\t\\t}\\n\\n\\t\\treturn val;\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"height\\\", \\\"width\\\" ], function( i, name ) {\\n\\tjQuery.cssHooks[ name ] = {\\n\\t\\tget: function( elem, computed, extra ) {\\n\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t// Certain elements can have dimension info if we invisibly show them\\n\\t\\t\\t\\t// but it must have a current display style that would benefit\\n\\t\\t\\t\\treturn rdisplayswap.test( jQuery.css( elem, \\\"display\\\" ) ) &&\\n\\n\\t\\t\\t\\t\\t// Support: Safari 8+\\n\\t\\t\\t\\t\\t// Table columns in Safari have non-zero offsetWidth & zero\\n\\t\\t\\t\\t\\t// getBoundingClientRect().width unless display is changed.\\n\\t\\t\\t\\t\\t// Support: IE <=11 only\\n\\t\\t\\t\\t\\t// Running getBoundingClientRect on a disconnected node\\n\\t\\t\\t\\t\\t// in IE throws an error.\\n\\t\\t\\t\\t\\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\\n\\t\\t\\t\\t\\t\\tswap( elem, cssShow, function() {\\n\\t\\t\\t\\t\\t\\t\\treturn getWidthOrHeight( elem, name, extra );\\n\\t\\t\\t\\t\\t\\t} ) :\\n\\t\\t\\t\\t\\t\\tgetWidthOrHeight( elem, name, extra );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tset: function( elem, value, extra ) {\\n\\t\\t\\tvar matches,\\n\\t\\t\\t\\tstyles = extra && getStyles( elem ),\\n\\t\\t\\t\\tsubtract = extra && augmentWidthOrHeight(\\n\\t\\t\\t\\t\\telem,\\n\\t\\t\\t\\t\\tname,\\n\\t\\t\\t\\t\\textra,\\n\\t\\t\\t\\t\\tjQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\",\\n\\t\\t\\t\\t\\tstyles\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t// Convert to pixels if value adjustment is needed\\n\\t\\t\\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\\n\\t\\t\\t\\t( matches[ 3 ] || \\\"px\\\" ) !== \\\"px\\\" ) {\\n\\n\\t\\t\\t\\telem.style[ name ] = value;\\n\\t\\t\\t\\tvalue = jQuery.css( elem, name );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn setPositiveNumber( elem, value, subtract );\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\\n\\tfunction( elem, computed ) {\\n\\t\\tif ( computed ) {\\n\\t\\t\\treturn ( parseFloat( curCSS( elem, \\\"marginLeft\\\" ) ) ||\\n\\t\\t\\t\\telem.getBoundingClientRect().left -\\n\\t\\t\\t\\t\\tswap( elem, { marginLeft: 0 }, function() {\\n\\t\\t\\t\\t\\t\\treturn elem.getBoundingClientRect().left;\\n\\t\\t\\t\\t\\t} )\\n\\t\\t\\t\\t) + \\\"px\\\";\\n\\t\\t}\\n\\t}\\n);\\n\\n// These hooks are used by animate to expand properties\\njQuery.each( {\\n\\tmargin: \\\"\\\",\\n\\tpadding: \\\"\\\",\\n\\tborder: \\\"Width\\\"\\n}, function( prefix, suffix ) {\\n\\tjQuery.cssHooks[ prefix + suffix ] = {\\n\\t\\texpand: function( value ) {\\n\\t\\t\\tvar i = 0,\\n\\t\\t\\t\\texpanded = {},\\n\\n\\t\\t\\t\\t// Assumes a single number if not a string\\n\\t\\t\\t\\tparts = typeof value === \\\"string\\\" ? value.split( \\\" \\\" ) : [ value ];\\n\\n\\t\\t\\tfor ( ; i < 4; i++ ) {\\n\\t\\t\\t\\texpanded[ prefix + cssExpand[ i ] + suffix ] =\\n\\t\\t\\t\\t\\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn expanded;\\n\\t\\t}\\n\\t};\\n\\n\\tif ( !rmargin.test( prefix ) ) {\\n\\t\\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tcss: function( name, value ) {\\n\\t\\treturn access( this, function( elem, name, value ) {\\n\\t\\t\\tvar styles, len,\\n\\t\\t\\t\\tmap = {},\\n\\t\\t\\t\\ti = 0;\\n\\n\\t\\t\\tif ( Array.isArray( name ) ) {\\n\\t\\t\\t\\tstyles = getStyles( elem );\\n\\t\\t\\t\\tlen = name.length;\\n\\n\\t\\t\\t\\tfor ( ; i < len; i++ ) {\\n\\t\\t\\t\\t\\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn map;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn value !== undefined ?\\n\\t\\t\\t\\tjQuery.style( elem, name, value ) :\\n\\t\\t\\t\\tjQuery.css( elem, name );\\n\\t\\t}, name, value, arguments.length > 1 );\\n\\t}\\n} );\\n\\n\\nfunction Tween( elem, options, prop, end, easing ) {\\n\\treturn new Tween.prototype.init( elem, options, prop, end, easing );\\n}\\njQuery.Tween = Tween;\\n\\nTween.prototype = {\\n\\tconstructor: Tween,\\n\\tinit: function( elem, options, prop, end, easing, unit ) {\\n\\t\\tthis.elem = elem;\\n\\t\\tthis.prop = prop;\\n\\t\\tthis.easing = easing || jQuery.easing._default;\\n\\t\\tthis.options = options;\\n\\t\\tthis.start = this.now = this.cur();\\n\\t\\tthis.end = end;\\n\\t\\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \\\"\\\" : \\\"px\\\" );\\n\\t},\\n\\tcur: function() {\\n\\t\\tvar hooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\treturn hooks && hooks.get ?\\n\\t\\t\\thooks.get( this ) :\\n\\t\\t\\tTween.propHooks._default.get( this );\\n\\t},\\n\\trun: function( percent ) {\\n\\t\\tvar eased,\\n\\t\\t\\thooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\tif ( this.options.duration ) {\\n\\t\\t\\tthis.pos = eased = jQuery.easing[ this.easing ](\\n\\t\\t\\t\\tpercent, this.options.duration * percent, 0, 1, this.options.duration\\n\\t\\t\\t);\\n\\t\\t} else {\\n\\t\\t\\tthis.pos = eased = percent;\\n\\t\\t}\\n\\t\\tthis.now = ( this.end - this.start ) * eased + this.start;\\n\\n\\t\\tif ( this.options.step ) {\\n\\t\\t\\tthis.options.step.call( this.elem, this.now, this );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && hooks.set ) {\\n\\t\\t\\thooks.set( this );\\n\\t\\t} else {\\n\\t\\t\\tTween.propHooks._default.set( this );\\n\\t\\t}\\n\\t\\treturn this;\\n\\t}\\n};\\n\\nTween.prototype.init.prototype = Tween.prototype;\\n\\nTween.propHooks = {\\n\\t_default: {\\n\\t\\tget: function( tween ) {\\n\\t\\t\\tvar result;\\n\\n\\t\\t\\t// Use a property on the element directly when it is not a DOM element,\\n\\t\\t\\t// or when there is no matching style property that exists.\\n\\t\\t\\tif ( tween.elem.nodeType !== 1 ||\\n\\t\\t\\t\\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\\n\\t\\t\\t\\treturn tween.elem[ tween.prop ];\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Passing an empty string as a 3rd parameter to .css will automatically\\n\\t\\t\\t// attempt a parseFloat and fallback to a string if the parse fails.\\n\\t\\t\\t// Simple values such as \\\"10px\\\" are parsed to Float;\\n\\t\\t\\t// complex values such as \\\"rotate(1rad)\\\" are returned as-is.\\n\\t\\t\\tresult = jQuery.css( tween.elem, tween.prop, \\\"\\\" );\\n\\n\\t\\t\\t// Empty strings, null, undefined and \\\"auto\\\" are converted to 0.\\n\\t\\t\\treturn !result || result === \\\"auto\\\" ? 0 : result;\\n\\t\\t},\\n\\t\\tset: function( tween ) {\\n\\n\\t\\t\\t// Use step hook for back compat.\\n\\t\\t\\t// Use cssHook if its there.\\n\\t\\t\\t// Use .style if available and use plain properties where available.\\n\\t\\t\\tif ( jQuery.fx.step[ tween.prop ] ) {\\n\\t\\t\\t\\tjQuery.fx.step[ tween.prop ]( tween );\\n\\t\\t\\t} else if ( tween.elem.nodeType === 1 &&\\n\\t\\t\\t\\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\\n\\t\\t\\t\\t\\tjQuery.cssHooks[ tween.prop ] ) ) {\\n\\t\\t\\t\\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\n// Support: IE <=9 only\\n// Panic based approach to setting things on disconnected nodes\\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\\n\\tset: function( tween ) {\\n\\t\\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\\n\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.easing = {\\n\\tlinear: function( p ) {\\n\\t\\treturn p;\\n\\t},\\n\\tswing: function( p ) {\\n\\t\\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\\n\\t},\\n\\t_default: \\\"swing\\\"\\n};\\n\\njQuery.fx = Tween.prototype.init;\\n\\n// Back compat <1.8 extension point\\njQuery.fx.step = {};\\n\\n\\n\\n\\nvar\\n\\tfxNow, inProgress,\\n\\trfxtypes = /^(?:toggle|show|hide)$/,\\n\\trrun = /queueHooks$/;\\n\\nfunction schedule() {\\n\\tif ( inProgress ) {\\n\\t\\tif ( document.hidden === false && window.requestAnimationFrame ) {\\n\\t\\t\\twindow.requestAnimationFrame( schedule );\\n\\t\\t} else {\\n\\t\\t\\twindow.setTimeout( schedule, jQuery.fx.interval );\\n\\t\\t}\\n\\n\\t\\tjQuery.fx.tick();\\n\\t}\\n}\\n\\n// Animations created synchronously will run synchronously\\nfunction createFxNow() {\\n\\twindow.setTimeout( function() {\\n\\t\\tfxNow = undefined;\\n\\t} );\\n\\treturn ( fxNow = jQuery.now() );\\n}\\n\\n// Generate parameters to create a standard animation\\nfunction genFx( type, includeWidth ) {\\n\\tvar which,\\n\\t\\ti = 0,\\n\\t\\tattrs = { height: type };\\n\\n\\t// If we include width, step value is 1 to do all cssExpand values,\\n\\t// otherwise step value is 2 to skip over Left and Right\\n\\tincludeWidth = includeWidth ? 1 : 0;\\n\\tfor ( ; i < 4; i += 2 - includeWidth ) {\\n\\t\\twhich = cssExpand[ i ];\\n\\t\\tattrs[ \\\"margin\\\" + which ] = attrs[ \\\"padding\\\" + which ] = type;\\n\\t}\\n\\n\\tif ( includeWidth ) {\\n\\t\\tattrs.opacity = attrs.width = type;\\n\\t}\\n\\n\\treturn attrs;\\n}\\n\\nfunction createTween( value, prop, animation ) {\\n\\tvar tween,\\n\\t\\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \\\"*\\\" ] ),\\n\\t\\tindex = 0,\\n\\t\\tlength = collection.length;\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\\n\\n\\t\\t\\t// We're done with this property\\n\\t\\t\\treturn tween;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction defaultPrefilter( elem, props, opts ) {\\n\\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\\n\\t\\tisBox = \\\"width\\\" in props || \\\"height\\\" in props,\\n\\t\\tanim = this,\\n\\t\\torig = {},\\n\\t\\tstyle = elem.style,\\n\\t\\thidden = elem.nodeType && isHiddenWithinTree( elem ),\\n\\t\\tdataShow = dataPriv.get( elem, \\\"fxshow\\\" );\\n\\n\\t// Queue-skipping animations hijack the fx hooks\\n\\tif ( !opts.queue ) {\\n\\t\\thooks = jQuery._queueHooks( elem, \\\"fx\\\" );\\n\\t\\tif ( hooks.unqueued == null ) {\\n\\t\\t\\thooks.unqueued = 0;\\n\\t\\t\\toldfire = hooks.empty.fire;\\n\\t\\t\\thooks.empty.fire = function() {\\n\\t\\t\\t\\tif ( !hooks.unqueued ) {\\n\\t\\t\\t\\t\\toldfire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t}\\n\\t\\thooks.unqueued++;\\n\\n\\t\\tanim.always( function() {\\n\\n\\t\\t\\t// Ensure the complete handler is called before this completes\\n\\t\\t\\tanim.always( function() {\\n\\t\\t\\t\\thooks.unqueued--;\\n\\t\\t\\t\\tif ( !jQuery.queue( elem, \\\"fx\\\" ).length ) {\\n\\t\\t\\t\\t\\thooks.empty.fire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t} );\\n\\t}\\n\\n\\t// Detect show/hide animations\\n\\tfor ( prop in props ) {\\n\\t\\tvalue = props[ prop ];\\n\\t\\tif ( rfxtypes.test( value ) ) {\\n\\t\\t\\tdelete props[ prop ];\\n\\t\\t\\ttoggle = toggle || value === \\\"toggle\\\";\\n\\t\\t\\tif ( value === ( hidden ? \\\"hide\\\" : \\\"show\\\" ) ) {\\n\\n\\t\\t\\t\\t// Pretend to be hidden if this is a \\\"show\\\" and\\n\\t\\t\\t\\t// there is still data from a stopped show/hide\\n\\t\\t\\t\\tif ( value === \\\"show\\\" && dataShow && dataShow[ prop ] !== undefined ) {\\n\\t\\t\\t\\t\\thidden = true;\\n\\n\\t\\t\\t\\t// Ignore all other no-op show/hide data\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\\n\\t\\t}\\n\\t}\\n\\n\\t// Bail out if this is a no-op like .hide().hide()\\n\\tpropTween = !jQuery.isEmptyObject( props );\\n\\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// Restrict \\\"overflow\\\" and \\\"display\\\" styles during box animations\\n\\tif ( isBox && elem.nodeType === 1 ) {\\n\\n\\t\\t// Support: IE <=9 - 11, Edge 12 - 13\\n\\t\\t// Record all 3 overflow attributes because IE does not infer the shorthand\\n\\t\\t// from identically-valued overflowX and overflowY\\n\\t\\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\\n\\n\\t\\t// Identify a display type, preferring old show/hide data over the CSS cascade\\n\\t\\trestoreDisplay = dataShow && dataShow.display;\\n\\t\\tif ( restoreDisplay == null ) {\\n\\t\\t\\trestoreDisplay = dataPriv.get( elem, \\\"display\\\" );\\n\\t\\t}\\n\\t\\tdisplay = jQuery.css( elem, \\\"display\\\" );\\n\\t\\tif ( display === \\\"none\\\" ) {\\n\\t\\t\\tif ( restoreDisplay ) {\\n\\t\\t\\t\\tdisplay = restoreDisplay;\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Get nonempty value(s) by temporarily forcing visibility\\n\\t\\t\\t\\tshowHide( [ elem ], true );\\n\\t\\t\\t\\trestoreDisplay = elem.style.display || restoreDisplay;\\n\\t\\t\\t\\tdisplay = jQuery.css( elem, \\\"display\\\" );\\n\\t\\t\\t\\tshowHide( [ elem ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Animate inline elements as inline-block\\n\\t\\tif ( display === \\\"inline\\\" || display === \\\"inline-block\\\" && restoreDisplay != null ) {\\n\\t\\t\\tif ( jQuery.css( elem, \\\"float\\\" ) === \\\"none\\\" ) {\\n\\n\\t\\t\\t\\t// Restore the original display value at the end of pure show/hide animations\\n\\t\\t\\t\\tif ( !propTween ) {\\n\\t\\t\\t\\t\\tanim.done( function() {\\n\\t\\t\\t\\t\\t\\tstyle.display = restoreDisplay;\\n\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\tif ( restoreDisplay == null ) {\\n\\t\\t\\t\\t\\t\\tdisplay = style.display;\\n\\t\\t\\t\\t\\t\\trestoreDisplay = display === \\\"none\\\" ? \\\"\\\" : display;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tstyle.display = \\\"inline-block\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tif ( opts.overflow ) {\\n\\t\\tstyle.overflow = \\\"hidden\\\";\\n\\t\\tanim.always( function() {\\n\\t\\t\\tstyle.overflow = opts.overflow[ 0 ];\\n\\t\\t\\tstyle.overflowX = opts.overflow[ 1 ];\\n\\t\\t\\tstyle.overflowY = opts.overflow[ 2 ];\\n\\t\\t} );\\n\\t}\\n\\n\\t// Implement show/hide animations\\n\\tpropTween = false;\\n\\tfor ( prop in orig ) {\\n\\n\\t\\t// General show/hide setup for this element animation\\n\\t\\tif ( !propTween ) {\\n\\t\\t\\tif ( dataShow ) {\\n\\t\\t\\t\\tif ( \\\"hidden\\\" in dataShow ) {\\n\\t\\t\\t\\t\\thidden = dataShow.hidden;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdataShow = dataPriv.access( elem, \\\"fxshow\\\", { display: restoreDisplay } );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Store hidden/visible for toggle so `.stop().toggle()` \\\"reverses\\\"\\n\\t\\t\\tif ( toggle ) {\\n\\t\\t\\t\\tdataShow.hidden = !hidden;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Show elements before animating them\\n\\t\\t\\tif ( hidden ) {\\n\\t\\t\\t\\tshowHide( [ elem ], true );\\n\\t\\t\\t}\\n\\n\\t\\t\\t/* eslint-disable no-loop-func */\\n\\n\\t\\t\\tanim.done( function() {\\n\\n\\t\\t\\t/* eslint-enable no-loop-func */\\n\\n\\t\\t\\t\\t// The final step of a \\\"hide\\\" animation is actually hiding the element\\n\\t\\t\\t\\tif ( !hidden ) {\\n\\t\\t\\t\\t\\tshowHide( [ elem ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataPriv.remove( elem, \\\"fxshow\\\" );\\n\\t\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\t\\tjQuery.style( elem, prop, orig[ prop ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\t// Per-property setup\\n\\t\\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\\n\\t\\tif ( !( prop in dataShow ) ) {\\n\\t\\t\\tdataShow[ prop ] = propTween.start;\\n\\t\\t\\tif ( hidden ) {\\n\\t\\t\\t\\tpropTween.end = propTween.start;\\n\\t\\t\\t\\tpropTween.start = 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction propFilter( props, specialEasing ) {\\n\\tvar index, name, easing, value, hooks;\\n\\n\\t// camelCase, specialEasing and expand cssHook pass\\n\\tfor ( index in props ) {\\n\\t\\tname = jQuery.camelCase( index );\\n\\t\\teasing = specialEasing[ name ];\\n\\t\\tvalue = props[ index ];\\n\\t\\tif ( Array.isArray( value ) ) {\\n\\t\\t\\teasing = value[ 1 ];\\n\\t\\t\\tvalue = props[ index ] = value[ 0 ];\\n\\t\\t}\\n\\n\\t\\tif ( index !== name ) {\\n\\t\\t\\tprops[ name ] = value;\\n\\t\\t\\tdelete props[ index ];\\n\\t\\t}\\n\\n\\t\\thooks = jQuery.cssHooks[ name ];\\n\\t\\tif ( hooks && \\\"expand\\\" in hooks ) {\\n\\t\\t\\tvalue = hooks.expand( value );\\n\\t\\t\\tdelete props[ name ];\\n\\n\\t\\t\\t// Not quite $.extend, this won't overwrite existing keys.\\n\\t\\t\\t// Reusing 'index' because we have the correct \\\"name\\\"\\n\\t\\t\\tfor ( index in value ) {\\n\\t\\t\\t\\tif ( !( index in props ) ) {\\n\\t\\t\\t\\t\\tprops[ index ] = value[ index ];\\n\\t\\t\\t\\t\\tspecialEasing[ index ] = easing;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tspecialEasing[ name ] = easing;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction Animation( elem, properties, options ) {\\n\\tvar result,\\n\\t\\tstopped,\\n\\t\\tindex = 0,\\n\\t\\tlength = Animation.prefilters.length,\\n\\t\\tdeferred = jQuery.Deferred().always( function() {\\n\\n\\t\\t\\t// Don't match elem in the :animated selector\\n\\t\\t\\tdelete tick.elem;\\n\\t\\t} ),\\n\\t\\ttick = function() {\\n\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\tvar currentTime = fxNow || createFxNow(),\\n\\t\\t\\t\\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\\n\\n\\t\\t\\t\\t// Support: Android 2.3 only\\n\\t\\t\\t\\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\\n\\t\\t\\t\\ttemp = remaining / animation.duration || 0,\\n\\t\\t\\t\\tpercent = 1 - temp,\\n\\t\\t\\t\\tindex = 0,\\n\\t\\t\\t\\tlength = animation.tweens.length;\\n\\n\\t\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\t\\tanimation.tweens[ index ].run( percent );\\n\\t\\t\\t}\\n\\n\\t\\t\\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\\n\\n\\t\\t\\t// If there's more to do, yield\\n\\t\\t\\tif ( percent < 1 && length ) {\\n\\t\\t\\t\\treturn remaining;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If this was an empty animation, synthesize a final progress notification\\n\\t\\t\\tif ( !length ) {\\n\\t\\t\\t\\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Resolve the animation and report its conclusion\\n\\t\\t\\tdeferred.resolveWith( elem, [ animation ] );\\n\\t\\t\\treturn false;\\n\\t\\t},\\n\\t\\tanimation = deferred.promise( {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tprops: jQuery.extend( {}, properties ),\\n\\t\\t\\topts: jQuery.extend( true, {\\n\\t\\t\\t\\tspecialEasing: {},\\n\\t\\t\\t\\teasing: jQuery.easing._default\\n\\t\\t\\t}, options ),\\n\\t\\t\\toriginalProperties: properties,\\n\\t\\t\\toriginalOptions: options,\\n\\t\\t\\tstartTime: fxNow || createFxNow(),\\n\\t\\t\\tduration: options.duration,\\n\\t\\t\\ttweens: [],\\n\\t\\t\\tcreateTween: function( prop, end ) {\\n\\t\\t\\t\\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\\n\\t\\t\\t\\t\\t\\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\\n\\t\\t\\t\\tanimation.tweens.push( tween );\\n\\t\\t\\t\\treturn tween;\\n\\t\\t\\t},\\n\\t\\t\\tstop: function( gotoEnd ) {\\n\\t\\t\\t\\tvar index = 0,\\n\\n\\t\\t\\t\\t\\t// If we are going to the end, we want to run all the tweens\\n\\t\\t\\t\\t\\t// otherwise we skip this part\\n\\t\\t\\t\\t\\tlength = gotoEnd ? animation.tweens.length : 0;\\n\\t\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tstopped = true;\\n\\t\\t\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\t\\t\\tanimation.tweens[ index ].run( 1 );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Resolve when we played the last frame; otherwise, reject\\n\\t\\t\\t\\tif ( gotoEnd ) {\\n\\t\\t\\t\\t\\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\\n\\t\\t\\t\\t\\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t}\\n\\t\\t} ),\\n\\t\\tprops = animation.props;\\n\\n\\tpropFilter( props, animation.opts.specialEasing );\\n\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\\n\\t\\tif ( result ) {\\n\\t\\t\\tif ( jQuery.isFunction( result.stop ) ) {\\n\\t\\t\\t\\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\\n\\t\\t\\t\\t\\tjQuery.proxy( result.stop, result );\\n\\t\\t\\t}\\n\\t\\t\\treturn result;\\n\\t\\t}\\n\\t}\\n\\n\\tjQuery.map( props, createTween, animation );\\n\\n\\tif ( jQuery.isFunction( animation.opts.start ) ) {\\n\\t\\tanimation.opts.start.call( elem, animation );\\n\\t}\\n\\n\\t// Attach callbacks from options\\n\\tanimation\\n\\t\\t.progress( animation.opts.progress )\\n\\t\\t.done( animation.opts.done, animation.opts.complete )\\n\\t\\t.fail( animation.opts.fail )\\n\\t\\t.always( animation.opts.always );\\n\\n\\tjQuery.fx.timer(\\n\\t\\tjQuery.extend( tick, {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tanim: animation,\\n\\t\\t\\tqueue: animation.opts.queue\\n\\t\\t} )\\n\\t);\\n\\n\\treturn animation;\\n}\\n\\njQuery.Animation = jQuery.extend( Animation, {\\n\\n\\ttweeners: {\\n\\t\\t\\\"*\\\": [ function( prop, value ) {\\n\\t\\t\\tvar tween = this.createTween( prop, value );\\n\\t\\t\\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\\n\\t\\t\\treturn tween;\\n\\t\\t} ]\\n\\t},\\n\\n\\ttweener: function( props, callback ) {\\n\\t\\tif ( jQuery.isFunction( props ) ) {\\n\\t\\t\\tcallback = props;\\n\\t\\t\\tprops = [ \\\"*\\\" ];\\n\\t\\t} else {\\n\\t\\t\\tprops = props.match( rnothtmlwhite );\\n\\t\\t}\\n\\n\\t\\tvar prop,\\n\\t\\t\\tindex = 0,\\n\\t\\t\\tlength = props.length;\\n\\n\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\tprop = props[ index ];\\n\\t\\t\\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\\n\\t\\t\\tAnimation.tweeners[ prop ].unshift( callback );\\n\\t\\t}\\n\\t},\\n\\n\\tprefilters: [ defaultPrefilter ],\\n\\n\\tprefilter: function( callback, prepend ) {\\n\\t\\tif ( prepend ) {\\n\\t\\t\\tAnimation.prefilters.unshift( callback );\\n\\t\\t} else {\\n\\t\\t\\tAnimation.prefilters.push( callback );\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.speed = function( speed, easing, fn ) {\\n\\tvar opt = speed && typeof speed === \\\"object\\\" ? jQuery.extend( {}, speed ) : {\\n\\t\\tcomplete: fn || !fn && easing ||\\n\\t\\t\\tjQuery.isFunction( speed ) && speed,\\n\\t\\tduration: speed,\\n\\t\\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\\n\\t};\\n\\n\\t// Go to the end state if fx are off\\n\\tif ( jQuery.fx.off ) {\\n\\t\\topt.duration = 0;\\n\\n\\t} else {\\n\\t\\tif ( typeof opt.duration !== \\\"number\\\" ) {\\n\\t\\t\\tif ( opt.duration in jQuery.fx.speeds ) {\\n\\t\\t\\t\\topt.duration = jQuery.fx.speeds[ opt.duration ];\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\topt.duration = jQuery.fx.speeds._default;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Normalize opt.queue - true/undefined/null -> \\\"fx\\\"\\n\\tif ( opt.queue == null || opt.queue === true ) {\\n\\t\\topt.queue = \\\"fx\\\";\\n\\t}\\n\\n\\t// Queueing\\n\\topt.old = opt.complete;\\n\\n\\topt.complete = function() {\\n\\t\\tif ( jQuery.isFunction( opt.old ) ) {\\n\\t\\t\\topt.old.call( this );\\n\\t\\t}\\n\\n\\t\\tif ( opt.queue ) {\\n\\t\\t\\tjQuery.dequeue( this, opt.queue );\\n\\t\\t}\\n\\t};\\n\\n\\treturn opt;\\n};\\n\\njQuery.fn.extend( {\\n\\tfadeTo: function( speed, to, easing, callback ) {\\n\\n\\t\\t// Show any hidden elements after setting opacity to 0\\n\\t\\treturn this.filter( isHiddenWithinTree ).css( \\\"opacity\\\", 0 ).show()\\n\\n\\t\\t\\t// Animate to the value specified\\n\\t\\t\\t.end().animate( { opacity: to }, speed, easing, callback );\\n\\t},\\n\\tanimate: function( prop, speed, easing, callback ) {\\n\\t\\tvar empty = jQuery.isEmptyObject( prop ),\\n\\t\\t\\toptall = jQuery.speed( speed, easing, callback ),\\n\\t\\t\\tdoAnimation = function() {\\n\\n\\t\\t\\t\\t// Operate on a copy of prop so per-property easing won't be lost\\n\\t\\t\\t\\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\\n\\n\\t\\t\\t\\t// Empty animations, or finishing resolves immediately\\n\\t\\t\\t\\tif ( empty || dataPriv.get( this, \\\"finish\\\" ) ) {\\n\\t\\t\\t\\t\\tanim.stop( true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t\\tdoAnimation.finish = doAnimation;\\n\\n\\t\\treturn empty || optall.queue === false ?\\n\\t\\t\\tthis.each( doAnimation ) :\\n\\t\\t\\tthis.queue( optall.queue, doAnimation );\\n\\t},\\n\\tstop: function( type, clearQueue, gotoEnd ) {\\n\\t\\tvar stopQueue = function( hooks ) {\\n\\t\\t\\tvar stop = hooks.stop;\\n\\t\\t\\tdelete hooks.stop;\\n\\t\\t\\tstop( gotoEnd );\\n\\t\\t};\\n\\n\\t\\tif ( typeof type !== \\\"string\\\" ) {\\n\\t\\t\\tgotoEnd = clearQueue;\\n\\t\\t\\tclearQueue = type;\\n\\t\\t\\ttype = undefined;\\n\\t\\t}\\n\\t\\tif ( clearQueue && type !== false ) {\\n\\t\\t\\tthis.queue( type || \\\"fx\\\", [] );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar dequeue = true,\\n\\t\\t\\t\\tindex = type != null && type + \\\"queueHooks\\\",\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tdata = dataPriv.get( this );\\n\\n\\t\\t\\tif ( index ) {\\n\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop ) {\\n\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tfor ( index in data ) {\\n\\t\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\\n\\t\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this &&\\n\\t\\t\\t\\t\\t( type == null || timers[ index ].queue === type ) ) {\\n\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( gotoEnd );\\n\\t\\t\\t\\t\\tdequeue = false;\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Start the next in the queue if the last step wasn't forced.\\n\\t\\t\\t// Timers currently will call their complete callbacks, which\\n\\t\\t\\t// will dequeue but only if they were gotoEnd.\\n\\t\\t\\tif ( dequeue || !gotoEnd ) {\\n\\t\\t\\t\\tjQuery.dequeue( this, type );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\tfinish: function( type ) {\\n\\t\\tif ( type !== false ) {\\n\\t\\t\\ttype = type || \\\"fx\\\";\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar index,\\n\\t\\t\\t\\tdata = dataPriv.get( this ),\\n\\t\\t\\t\\tqueue = data[ type + \\\"queue\\\" ],\\n\\t\\t\\t\\thooks = data[ type + \\\"queueHooks\\\" ],\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tlength = queue ? queue.length : 0;\\n\\n\\t\\t\\t// Enable finishing flag on private data\\n\\t\\t\\tdata.finish = true;\\n\\n\\t\\t\\t// Empty the queue first\\n\\t\\t\\tjQuery.queue( this, type, [] );\\n\\n\\t\\t\\tif ( hooks && hooks.stop ) {\\n\\t\\t\\t\\thooks.stop.call( this, true );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any active animations, and finish them\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( true );\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any animations in the old queue and finish them\\n\\t\\t\\tfor ( index = 0; index < length; index++ ) {\\n\\t\\t\\t\\tif ( queue[ index ] && queue[ index ].finish ) {\\n\\t\\t\\t\\t\\tqueue[ index ].finish.call( this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Turn off finishing flag\\n\\t\\t\\tdelete data.finish;\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"toggle\\\", \\\"show\\\", \\\"hide\\\" ], function( i, name ) {\\n\\tvar cssFn = jQuery.fn[ name ];\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn speed == null || typeof speed === \\\"boolean\\\" ?\\n\\t\\t\\tcssFn.apply( this, arguments ) :\\n\\t\\t\\tthis.animate( genFx( name, true ), speed, easing, callback );\\n\\t};\\n} );\\n\\n// Generate shortcuts for custom animations\\njQuery.each( {\\n\\tslideDown: genFx( \\\"show\\\" ),\\n\\tslideUp: genFx( \\\"hide\\\" ),\\n\\tslideToggle: genFx( \\\"toggle\\\" ),\\n\\tfadeIn: { opacity: \\\"show\\\" },\\n\\tfadeOut: { opacity: \\\"hide\\\" },\\n\\tfadeToggle: { opacity: \\\"toggle\\\" }\\n}, function( name, props ) {\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn this.animate( props, speed, easing, callback );\\n\\t};\\n} );\\n\\njQuery.timers = [];\\njQuery.fx.tick = function() {\\n\\tvar timer,\\n\\t\\ti = 0,\\n\\t\\ttimers = jQuery.timers;\\n\\n\\tfxNow = jQuery.now();\\n\\n\\tfor ( ; i < timers.length; i++ ) {\\n\\t\\ttimer = timers[ i ];\\n\\n\\t\\t// Run the timer and safely remove it when done (allowing for external removal)\\n\\t\\tif ( !timer() && timers[ i ] === timer ) {\\n\\t\\t\\ttimers.splice( i--, 1 );\\n\\t\\t}\\n\\t}\\n\\n\\tif ( !timers.length ) {\\n\\t\\tjQuery.fx.stop();\\n\\t}\\n\\tfxNow = undefined;\\n};\\n\\njQuery.fx.timer = function( timer ) {\\n\\tjQuery.timers.push( timer );\\n\\tjQuery.fx.start();\\n};\\n\\njQuery.fx.interval = 13;\\njQuery.fx.start = function() {\\n\\tif ( inProgress ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\tinProgress = true;\\n\\tschedule();\\n};\\n\\njQuery.fx.stop = function() {\\n\\tinProgress = null;\\n};\\n\\njQuery.fx.speeds = {\\n\\tslow: 600,\\n\\tfast: 200,\\n\\n\\t// Default speed\\n\\t_default: 400\\n};\\n\\n\\n// Based off of the plugin by Clint Helfers, with permission.\\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\\njQuery.fn.delay = function( time, type ) {\\n\\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\\n\\ttype = type || \\\"fx\\\";\\n\\n\\treturn this.queue( type, function( next, hooks ) {\\n\\t\\tvar timeout = window.setTimeout( next, time );\\n\\t\\thooks.stop = function() {\\n\\t\\t\\twindow.clearTimeout( timeout );\\n\\t\\t};\\n\\t} );\\n};\\n\\n\\n( function() {\\n\\tvar input = document.createElement( \\\"input\\\" ),\\n\\t\\tselect = document.createElement( \\\"select\\\" ),\\n\\t\\topt = select.appendChild( document.createElement( \\\"option\\\" ) );\\n\\n\\tinput.type = \\\"checkbox\\\";\\n\\n\\t// Support: Android <=4.3 only\\n\\t// Default value for a checkbox should be \\\"on\\\"\\n\\tsupport.checkOn = input.value !== \\\"\\\";\\n\\n\\t// Support: IE <=11 only\\n\\t// Must access selectedIndex to make default options select\\n\\tsupport.optSelected = opt.selected;\\n\\n\\t// Support: IE <=11 only\\n\\t// An input loses its value after becoming a radio\\n\\tinput = document.createElement( \\\"input\\\" );\\n\\tinput.value = \\\"t\\\";\\n\\tinput.type = \\\"radio\\\";\\n\\tsupport.radioValue = input.value === \\\"t\\\";\\n} )();\\n\\n\\nvar boolHook,\\n\\tattrHandle = jQuery.expr.attrHandle;\\n\\njQuery.fn.extend( {\\n\\tattr: function( name, value ) {\\n\\t\\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveAttr: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.removeAttr( this, name );\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tattr: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set attributes on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Fallback to prop when attributes are not supported\\n\\t\\tif ( typeof elem.getAttribute === \\\"undefined\\\" ) {\\n\\t\\t\\treturn jQuery.prop( elem, name, value );\\n\\t\\t}\\n\\n\\t\\t// Attribute hooks are determined by the lowercase version\\n\\t\\t// Grab necessary hook if one is defined\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\t\\t\\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\\n\\t\\t\\t\\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( value === null ) {\\n\\t\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\telem.setAttribute( name, value + \\\"\\\" );\\n\\t\\t\\treturn value;\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\tret = jQuery.find.attr( elem, name );\\n\\n\\t\\t// Non-existent attributes return null, we normalize to undefined\\n\\t\\treturn ret == null ? undefined : ret;\\n\\t},\\n\\n\\tattrHooks: {\\n\\t\\ttype: {\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tif ( !support.radioValue && value === \\\"radio\\\" &&\\n\\t\\t\\t\\t\\tnodeName( elem, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tvar val = elem.value;\\n\\t\\t\\t\\t\\telem.setAttribute( \\\"type\\\", value );\\n\\t\\t\\t\\t\\tif ( val ) {\\n\\t\\t\\t\\t\\t\\telem.value = val;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tremoveAttr: function( elem, value ) {\\n\\t\\tvar name,\\n\\t\\t\\ti = 0,\\n\\n\\t\\t\\t// Attribute names can contain non-HTML whitespace characters\\n\\t\\t\\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\\n\\t\\t\\tattrNames = value && value.match( rnothtmlwhite );\\n\\n\\t\\tif ( attrNames && elem.nodeType === 1 ) {\\n\\t\\t\\twhile ( ( name = attrNames[ i++ ] ) ) {\\n\\t\\t\\t\\telem.removeAttribute( name );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Hooks for boolean attributes\\nboolHook = {\\n\\tset: function( elem, value, name ) {\\n\\t\\tif ( value === false ) {\\n\\n\\t\\t\\t// Remove boolean attributes when set to false\\n\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t} else {\\n\\t\\t\\telem.setAttribute( name, name );\\n\\t\\t}\\n\\t\\treturn name;\\n\\t}\\n};\\n\\njQuery.each( jQuery.expr.match.bool.source.match( /\\\\w+/g ), function( i, name ) {\\n\\tvar getter = attrHandle[ name ] || jQuery.find.attr;\\n\\n\\tattrHandle[ name ] = function( elem, name, isXML ) {\\n\\t\\tvar ret, handle,\\n\\t\\t\\tlowercaseName = name.toLowerCase();\\n\\n\\t\\tif ( !isXML ) {\\n\\n\\t\\t\\t// Avoid an infinite loop by temporarily removing this function from the getter\\n\\t\\t\\thandle = attrHandle[ lowercaseName ];\\n\\t\\t\\tattrHandle[ lowercaseName ] = ret;\\n\\t\\t\\tret = getter( elem, name, isXML ) != null ?\\n\\t\\t\\t\\tlowercaseName :\\n\\t\\t\\t\\tnull;\\n\\t\\t\\tattrHandle[ lowercaseName ] = handle;\\n\\t\\t}\\n\\t\\treturn ret;\\n\\t};\\n} );\\n\\n\\n\\n\\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\\n\\trclickable = /^(?:a|area)$/i;\\n\\njQuery.fn.extend( {\\n\\tprop: function( name, value ) {\\n\\t\\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveProp: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tdelete this[ jQuery.propFix[ name ] || name ];\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tprop: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set properties on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// Fix name and attach hooks\\n\\t\\t\\tname = jQuery.propFix[ name ] || name;\\n\\t\\t\\thooks = jQuery.propHooks[ name ];\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn ( elem[ name ] = value );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\treturn elem[ name ];\\n\\t},\\n\\n\\tpropHooks: {\\n\\t\\ttabIndex: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\t// Support: IE <=9 - 11 only\\n\\t\\t\\t\\t// elem.tabIndex doesn't always return the\\n\\t\\t\\t\\t// correct value when it hasn't been explicitly set\\n\\t\\t\\t\\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\\n\\t\\t\\t\\t// Use proper attribute retrieval(#12072)\\n\\t\\t\\t\\tvar tabindex = jQuery.find.attr( elem, \\\"tabindex\\\" );\\n\\n\\t\\t\\t\\tif ( tabindex ) {\\n\\t\\t\\t\\t\\treturn parseInt( tabindex, 10 );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tif (\\n\\t\\t\\t\\t\\trfocusable.test( elem.nodeName ) ||\\n\\t\\t\\t\\t\\trclickable.test( elem.nodeName ) &&\\n\\t\\t\\t\\t\\telem.href\\n\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\treturn 0;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn -1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tpropFix: {\\n\\t\\t\\\"for\\\": \\\"htmlFor\\\",\\n\\t\\t\\\"class\\\": \\\"className\\\"\\n\\t}\\n} );\\n\\n// Support: IE <=11 only\\n// Accessing the selectedIndex property\\n// forces the browser to respect setting selected\\n// on the option\\n// The getter ensures a default option is selected\\n// when in an optgroup\\n// eslint rule \\\"no-unused-expressions\\\" is disabled for this code\\n// since it considers such accessions noop\\nif ( !support.optSelected ) {\\n\\tjQuery.propHooks.selected = {\\n\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t/* eslint no-unused-expressions: \\\"off\\\" */\\n\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent && parent.parentNode ) {\\n\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t}\\n\\t\\t\\treturn null;\\n\\t\\t},\\n\\t\\tset: function( elem ) {\\n\\n\\t\\t\\t/* eslint no-unused-expressions: \\\"off\\\" */\\n\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\tparent.selectedIndex;\\n\\n\\t\\t\\t\\tif ( parent.parentNode ) {\\n\\t\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\njQuery.each( [\\n\\t\\\"tabIndex\\\",\\n\\t\\\"readOnly\\\",\\n\\t\\\"maxLength\\\",\\n\\t\\\"cellSpacing\\\",\\n\\t\\\"cellPadding\\\",\\n\\t\\\"rowSpan\\\",\\n\\t\\\"colSpan\\\",\\n\\t\\\"useMap\\\",\\n\\t\\\"frameBorder\\\",\\n\\t\\\"contentEditable\\\"\\n], function() {\\n\\tjQuery.propFix[ this.toLowerCase() ] = this;\\n} );\\n\\n\\n\\n\\n\\t// Strip and collapse whitespace according to HTML spec\\n\\t// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace\\n\\tfunction stripAndCollapse( value ) {\\n\\t\\tvar tokens = value.match( rnothtmlwhite ) || [];\\n\\t\\treturn tokens.join( \\\" \\\" );\\n\\t}\\n\\n\\nfunction getClass( elem ) {\\n\\treturn elem.getAttribute && elem.getAttribute( \\\"class\\\" ) || \\\"\\\";\\n}\\n\\njQuery.fn.extend( {\\n\\taddClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\t\\t\\t\\tcur = elem.nodeType === 1 && ( \\\" \\\" + stripAndCollapse( curValue ) + \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\t\\t\\t\\t\\t\\tif ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) < 0 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur += clazz + \\\" \\\";\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = stripAndCollapse( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tremoveClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\treturn this.attr( \\\"class\\\", \\\"\\\" );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\n\\t\\t\\t\\t// This expression is here for better compressibility (see addClass)\\n\\t\\t\\t\\tcur = elem.nodeType === 1 && ( \\\" \\\" + stripAndCollapse( curValue ) + \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Remove *all* instances\\n\\t\\t\\t\\t\\t\\twhile ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) > -1 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur = cur.replace( \\\" \\\" + clazz + \\\" \\\", \\\" \\\" );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = stripAndCollapse( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\ttoggleClass: function( value, stateVal ) {\\n\\t\\tvar type = typeof value;\\n\\n\\t\\tif ( typeof stateVal === \\\"boolean\\\" && type === \\\"string\\\" ) {\\n\\t\\t\\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\\n\\t\\t}\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).toggleClass(\\n\\t\\t\\t\\t\\tvalue.call( this, i, getClass( this ), stateVal ),\\n\\t\\t\\t\\t\\tstateVal\\n\\t\\t\\t\\t);\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar className, i, self, classNames;\\n\\n\\t\\t\\tif ( type === \\\"string\\\" ) {\\n\\n\\t\\t\\t\\t// Toggle individual class names\\n\\t\\t\\t\\ti = 0;\\n\\t\\t\\t\\tself = jQuery( this );\\n\\t\\t\\t\\tclassNames = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\t\\twhile ( ( className = classNames[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t// Check each className given, space separated list\\n\\t\\t\\t\\t\\tif ( self.hasClass( className ) ) {\\n\\t\\t\\t\\t\\t\\tself.removeClass( className );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tself.addClass( className );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Toggle whole class name\\n\\t\\t\\t} else if ( value === undefined || type === \\\"boolean\\\" ) {\\n\\t\\t\\t\\tclassName = getClass( this );\\n\\t\\t\\t\\tif ( className ) {\\n\\n\\t\\t\\t\\t\\t// Store className if set\\n\\t\\t\\t\\t\\tdataPriv.set( this, \\\"__className__\\\", className );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// If the element has a class name or if we're passed `false`,\\n\\t\\t\\t\\t// then remove the whole classname (if there was one, the above saved it).\\n\\t\\t\\t\\t// Otherwise bring back whatever was previously saved (if anything),\\n\\t\\t\\t\\t// falling back to the empty string if nothing was stored.\\n\\t\\t\\t\\tif ( this.setAttribute ) {\\n\\t\\t\\t\\t\\tthis.setAttribute( \\\"class\\\",\\n\\t\\t\\t\\t\\t\\tclassName || value === false ?\\n\\t\\t\\t\\t\\t\\t\\\"\\\" :\\n\\t\\t\\t\\t\\t\\tdataPriv.get( this, \\\"__className__\\\" ) || \\\"\\\"\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\thasClass: function( selector ) {\\n\\t\\tvar className, elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tclassName = \\\" \\\" + selector + \\\" \\\";\\n\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\tif ( elem.nodeType === 1 &&\\n\\t\\t\\t\\t( \\\" \\\" + stripAndCollapse( getClass( elem ) ) + \\\" \\\" ).indexOf( className ) > -1 ) {\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn false;\\n\\t}\\n} );\\n\\n\\n\\n\\nvar rreturn = /\\\\r/g;\\n\\njQuery.fn.extend( {\\n\\tval: function( value ) {\\n\\t\\tvar hooks, ret, isFunction,\\n\\t\\t\\telem = this[ 0 ];\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\thooks = jQuery.valHooks[ elem.type ] ||\\n\\t\\t\\t\\t\\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t\\tif ( hooks &&\\n\\t\\t\\t\\t\\t\\\"get\\\" in hooks &&\\n\\t\\t\\t\\t\\t( ret = hooks.get( elem, \\\"value\\\" ) ) !== undefined\\n\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\treturn ret;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tret = elem.value;\\n\\n\\t\\t\\t\\t// Handle most common string cases\\n\\t\\t\\t\\tif ( typeof ret === \\\"string\\\" ) {\\n\\t\\t\\t\\t\\treturn ret.replace( rreturn, \\\"\\\" );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Handle cases where value is null/undef or number\\n\\t\\t\\t\\treturn ret == null ? \\\"\\\" : ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tvar val;\\n\\n\\t\\t\\tif ( this.nodeType !== 1 ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\tval = value.call( this, i, jQuery( this ).val() );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tval = value;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Treat null/undefined as \\\"\\\"; convert numbers to string\\n\\t\\t\\tif ( val == null ) {\\n\\t\\t\\t\\tval = \\\"\\\";\\n\\n\\t\\t\\t} else if ( typeof val === \\\"number\\\" ) {\\n\\t\\t\\t\\tval += \\\"\\\";\\n\\n\\t\\t\\t} else if ( Array.isArray( val ) ) {\\n\\t\\t\\t\\tval = jQuery.map( val, function( value ) {\\n\\t\\t\\t\\t\\treturn value == null ? \\\"\\\" : value + \\\"\\\";\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\n\\t\\t\\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t// If set returns undefined, fall back to normal setting\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) || hooks.set( this, val, \\\"value\\\" ) === undefined ) {\\n\\t\\t\\t\\tthis.value = val;\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tvalHooks: {\\n\\t\\toption: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\tvar val = jQuery.find.attr( elem, \\\"value\\\" );\\n\\t\\t\\t\\treturn val != null ?\\n\\t\\t\\t\\t\\tval :\\n\\n\\t\\t\\t\\t\\t// Support: IE <=10 - 11 only\\n\\t\\t\\t\\t\\t// option.text throws exceptions (#14686, #14858)\\n\\t\\t\\t\\t\\t// Strip and collapse whitespace\\n\\t\\t\\t\\t\\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\\n\\t\\t\\t\\t\\tstripAndCollapse( jQuery.text( elem ) );\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tselect: {\\n\\t\\t\\tget: function( elem ) {\\n\\t\\t\\t\\tvar value, option, i,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tindex = elem.selectedIndex,\\n\\t\\t\\t\\t\\tone = elem.type === \\\"select-one\\\",\\n\\t\\t\\t\\t\\tvalues = one ? null : [],\\n\\t\\t\\t\\t\\tmax = one ? index + 1 : options.length;\\n\\n\\t\\t\\t\\tif ( index < 0 ) {\\n\\t\\t\\t\\t\\ti = max;\\n\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ti = one ? index : 0;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Loop through all the selected options\\n\\t\\t\\t\\tfor ( ; i < max; i++ ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\n\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t// IE8-9 doesn't update selected after form reset (#2551)\\n\\t\\t\\t\\t\\tif ( ( option.selected || i === index ) &&\\n\\n\\t\\t\\t\\t\\t\\t\\t// Don't return options that are disabled or in a disabled optgroup\\n\\t\\t\\t\\t\\t\\t\\t!option.disabled &&\\n\\t\\t\\t\\t\\t\\t\\t( !option.parentNode.disabled ||\\n\\t\\t\\t\\t\\t\\t\\t\\t!nodeName( option.parentNode, \\\"optgroup\\\" ) ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Get the specific value for the option\\n\\t\\t\\t\\t\\t\\tvalue = jQuery( option ).val();\\n\\n\\t\\t\\t\\t\\t\\t// We don't need an array for one selects\\n\\t\\t\\t\\t\\t\\tif ( one ) {\\n\\t\\t\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// Multi-Selects return an array\\n\\t\\t\\t\\t\\t\\tvalues.push( value );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t},\\n\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tvar optionSet, option,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tvalues = jQuery.makeArray( value ),\\n\\t\\t\\t\\t\\ti = options.length;\\n\\n\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\n\\t\\t\\t\\t\\t/* eslint-disable no-cond-assign */\\n\\n\\t\\t\\t\\t\\tif ( option.selected =\\n\\t\\t\\t\\t\\t\\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\\n\\t\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\t\\toptionSet = true;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t/* eslint-enable no-cond-assign */\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Force browsers to behave consistently when non-matching value is set\\n\\t\\t\\t\\tif ( !optionSet ) {\\n\\t\\t\\t\\t\\telem.selectedIndex = -1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Radios and checkboxes getter/setter\\njQuery.each( [ \\\"radio\\\", \\\"checkbox\\\" ], function() {\\n\\tjQuery.valHooks[ this ] = {\\n\\t\\tset: function( elem, value ) {\\n\\t\\t\\tif ( Array.isArray( value ) ) {\\n\\t\\t\\t\\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\tif ( !support.checkOn ) {\\n\\t\\tjQuery.valHooks[ this ].get = function( elem ) {\\n\\t\\t\\treturn elem.getAttribute( \\\"value\\\" ) === null ? \\\"on\\\" : elem.value;\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Return jQuery for attributes-only inclusion\\n\\n\\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\\n\\njQuery.extend( jQuery.event, {\\n\\n\\ttrigger: function( event, data, elem, onlyHandlers ) {\\n\\n\\t\\tvar i, cur, tmp, bubbleType, ontype, handle, special,\\n\\t\\t\\teventPath = [ elem || document ],\\n\\t\\t\\ttype = hasOwn.call( event, \\\"type\\\" ) ? event.type : event,\\n\\t\\t\\tnamespaces = hasOwn.call( event, \\\"namespace\\\" ) ? event.namespace.split( \\\".\\\" ) : [];\\n\\n\\t\\tcur = tmp = elem = elem || document;\\n\\n\\t\\t// Don't do events on text and comment nodes\\n\\t\\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\\n\\t\\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( type.indexOf( \\\".\\\" ) > -1 ) {\\n\\n\\t\\t\\t// Namespaced trigger; create a regexp to match event type in handle()\\n\\t\\t\\tnamespaces = type.split( \\\".\\\" );\\n\\t\\t\\ttype = namespaces.shift();\\n\\t\\t\\tnamespaces.sort();\\n\\t\\t}\\n\\t\\tontype = type.indexOf( \\\":\\\" ) < 0 && \\\"on\\\" + type;\\n\\n\\t\\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\\n\\t\\tevent = event[ jQuery.expando ] ?\\n\\t\\t\\tevent :\\n\\t\\t\\tnew jQuery.Event( type, typeof event === \\\"object\\\" && event );\\n\\n\\t\\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\\n\\t\\tevent.isTrigger = onlyHandlers ? 2 : 3;\\n\\t\\tevent.namespace = namespaces.join( \\\".\\\" );\\n\\t\\tevent.rnamespace = event.namespace ?\\n\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" ) :\\n\\t\\t\\tnull;\\n\\n\\t\\t// Clean up the event in case it is being reused\\n\\t\\tevent.result = undefined;\\n\\t\\tif ( !event.target ) {\\n\\t\\t\\tevent.target = elem;\\n\\t\\t}\\n\\n\\t\\t// Clone any incoming data and prepend the event, creating the handler arg list\\n\\t\\tdata = data == null ?\\n\\t\\t\\t[ event ] :\\n\\t\\t\\tjQuery.makeArray( data, [ event ] );\\n\\n\\t\\t// Allow special events to draw outside the lines\\n\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine event propagation path in advance, per W3C events spec (#9951)\\n\\t\\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\\n\\t\\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\tbubbleType = special.delegateType || type;\\n\\t\\t\\tif ( !rfocusMorph.test( bubbleType + type ) ) {\\n\\t\\t\\t\\tcur = cur.parentNode;\\n\\t\\t\\t}\\n\\t\\t\\tfor ( ; cur; cur = cur.parentNode ) {\\n\\t\\t\\t\\teventPath.push( cur );\\n\\t\\t\\t\\ttmp = cur;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\\n\\t\\t\\tif ( tmp === ( elem.ownerDocument || document ) ) {\\n\\t\\t\\t\\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Fire handlers on the event path\\n\\t\\ti = 0;\\n\\t\\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\n\\t\\t\\tevent.type = i > 1 ?\\n\\t\\t\\t\\tbubbleType :\\n\\t\\t\\t\\tspecial.bindType || type;\\n\\n\\t\\t\\t// jQuery handler\\n\\t\\t\\thandle = ( dataPriv.get( cur, \\\"events\\\" ) || {} )[ event.type ] &&\\n\\t\\t\\t\\tdataPriv.get( cur, \\\"handle\\\" );\\n\\t\\t\\tif ( handle ) {\\n\\t\\t\\t\\thandle.apply( cur, data );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Native handler\\n\\t\\t\\thandle = ontype && cur[ ontype ];\\n\\t\\t\\tif ( handle && handle.apply && acceptData( cur ) ) {\\n\\t\\t\\t\\tevent.result = handle.apply( cur, data );\\n\\t\\t\\t\\tif ( event.result === false ) {\\n\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tevent.type = type;\\n\\n\\t\\t// If nobody prevented the default action, do it now\\n\\t\\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\\n\\n\\t\\t\\tif ( ( !special._default ||\\n\\t\\t\\t\\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\\n\\t\\t\\t\\tacceptData( elem ) ) {\\n\\n\\t\\t\\t\\t// Call a native DOM method on the target with the same name as the event.\\n\\t\\t\\t\\t// Don't do default actions on window, that's where global variables be (#6170)\\n\\t\\t\\t\\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\t\\t\\t// Don't re-trigger an onFOO event when we call its FOO() method\\n\\t\\t\\t\\t\\ttmp = elem[ ontype ];\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = null;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Prevent re-triggering of the same event, since we already bubbled it above\\n\\t\\t\\t\\t\\tjQuery.event.triggered = type;\\n\\t\\t\\t\\t\\telem[ type ]();\\n\\t\\t\\t\\t\\tjQuery.event.triggered = undefined;\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = tmp;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\t// Piggyback on a donor event to simulate a different one\\n\\t// Used only for `focus(in | out)` events\\n\\tsimulate: function( type, elem, event ) {\\n\\t\\tvar e = jQuery.extend(\\n\\t\\t\\tnew jQuery.Event(),\\n\\t\\t\\tevent,\\n\\t\\t\\t{\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\tisSimulated: true\\n\\t\\t\\t}\\n\\t\\t);\\n\\n\\t\\tjQuery.event.trigger( e, null, elem );\\n\\t}\\n\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\ttrigger: function( type, data ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.trigger( type, data, this );\\n\\t\\t} );\\n\\t},\\n\\ttriggerHandler: function( type, data ) {\\n\\t\\tvar elem = this[ 0 ];\\n\\t\\tif ( elem ) {\\n\\t\\t\\treturn jQuery.event.trigger( type, data, elem, true );\\n\\t\\t}\\n\\t}\\n} );\\n\\n\\njQuery.each( ( \\\"blur focus focusin focusout resize scroll click dblclick \\\" +\\n\\t\\\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \\\" +\\n\\t\\\"change select submit keydown keypress keyup contextmenu\\\" ).split( \\\" \\\" ),\\n\\tfunction( i, name ) {\\n\\n\\t// Handle event binding\\n\\tjQuery.fn[ name ] = function( data, fn ) {\\n\\t\\treturn arguments.length > 0 ?\\n\\t\\t\\tthis.on( name, null, data, fn ) :\\n\\t\\t\\tthis.trigger( name );\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\thover: function( fnOver, fnOut ) {\\n\\t\\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\\n\\t}\\n} );\\n\\n\\n\\n\\nsupport.focusin = \\\"onfocusin\\\" in window;\\n\\n\\n// Support: Firefox <=44\\n// Firefox doesn't have focus(in | out) events\\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\\n//\\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\\n// focus(in | out) events fire after focus & blur events,\\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\\nif ( !support.focusin ) {\\n\\tjQuery.each( { focus: \\\"focusin\\\", blur: \\\"focusout\\\" }, function( orig, fix ) {\\n\\n\\t\\t// Attach a single capturing handler on the document while someone wants focusin/focusout\\n\\t\\tvar handler = function( event ) {\\n\\t\\t\\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\\n\\t\\t};\\n\\n\\t\\tjQuery.event.special[ fix ] = {\\n\\t\\t\\tsetup: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix );\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.addEventListener( orig, handler, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\\n\\t\\t\\t},\\n\\t\\t\\tteardown: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix ) - 1;\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.removeEventListener( orig, handler, true );\\n\\t\\t\\t\\t\\tdataPriv.remove( doc, fix );\\n\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdataPriv.access( doc, fix, attaches );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t} );\\n}\\nvar location = window.location;\\n\\nvar nonce = jQuery.now();\\n\\nvar rquery = ( /\\\\?/ );\\n\\n\\n\\n// Cross-browser xml parsing\\njQuery.parseXML = function( data ) {\\n\\tvar xml;\\n\\tif ( !data || typeof data !== \\\"string\\\" ) {\\n\\t\\treturn null;\\n\\t}\\n\\n\\t// Support: IE 9 - 11 only\\n\\t// IE throws on parseFromString with invalid input.\\n\\ttry {\\n\\t\\txml = ( new window.DOMParser() ).parseFromString( data, \\\"text/xml\\\" );\\n\\t} catch ( e ) {\\n\\t\\txml = undefined;\\n\\t}\\n\\n\\tif ( !xml || xml.getElementsByTagName( \\\"parsererror\\\" ).length ) {\\n\\t\\tjQuery.error( \\\"Invalid XML: \\\" + data );\\n\\t}\\n\\treturn xml;\\n};\\n\\n\\nvar\\n\\trbracket = /\\\\[\\\\]$/,\\n\\trCRLF = /\\\\r?\\\\n/g,\\n\\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\\n\\trsubmittable = /^(?:input|select|textarea|keygen)/i;\\n\\nfunction buildParams( prefix, obj, traditional, add ) {\\n\\tvar name;\\n\\n\\tif ( Array.isArray( obj ) ) {\\n\\n\\t\\t// Serialize array item.\\n\\t\\tjQuery.each( obj, function( i, v ) {\\n\\t\\t\\tif ( traditional || rbracket.test( prefix ) ) {\\n\\n\\t\\t\\t\\t// Treat each array item as a scalar.\\n\\t\\t\\t\\tadd( prefix, v );\\n\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Item is non-scalar (array or object), encode its numeric index.\\n\\t\\t\\t\\tbuildParams(\\n\\t\\t\\t\\t\\tprefix + \\\"[\\\" + ( typeof v === \\\"object\\\" && v != null ? i : \\\"\\\" ) + \\\"]\\\",\\n\\t\\t\\t\\t\\tv,\\n\\t\\t\\t\\t\\ttraditional,\\n\\t\\t\\t\\t\\tadd\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t} );\\n\\n\\t} else if ( !traditional && jQuery.type( obj ) === \\\"object\\\" ) {\\n\\n\\t\\t// Serialize object item.\\n\\t\\tfor ( name in obj ) {\\n\\t\\t\\tbuildParams( prefix + \\\"[\\\" + name + \\\"]\\\", obj[ name ], traditional, add );\\n\\t\\t}\\n\\n\\t} else {\\n\\n\\t\\t// Serialize scalar item.\\n\\t\\tadd( prefix, obj );\\n\\t}\\n}\\n\\n// Serialize an array of form elements or a set of\\n// key/values into a query string\\njQuery.param = function( a, traditional ) {\\n\\tvar prefix,\\n\\t\\ts = [],\\n\\t\\tadd = function( key, valueOrFunction ) {\\n\\n\\t\\t\\t// If value is a function, invoke it and use its return value\\n\\t\\t\\tvar value = jQuery.isFunction( valueOrFunction ) ?\\n\\t\\t\\t\\tvalueOrFunction() :\\n\\t\\t\\t\\tvalueOrFunction;\\n\\n\\t\\t\\ts[ s.length ] = encodeURIComponent( key ) + \\\"=\\\" +\\n\\t\\t\\t\\tencodeURIComponent( value == null ? \\\"\\\" : value );\\n\\t\\t};\\n\\n\\t// If an array was passed in, assume that it is an array of form elements.\\n\\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\\n\\n\\t\\t// Serialize the form elements\\n\\t\\tjQuery.each( a, function() {\\n\\t\\t\\tadd( this.name, this.value );\\n\\t\\t} );\\n\\n\\t} else {\\n\\n\\t\\t// If traditional, encode the \\\"old\\\" way (the way 1.3.2 or older\\n\\t\\t// did it), otherwise encode params recursively.\\n\\t\\tfor ( prefix in a ) {\\n\\t\\t\\tbuildParams( prefix, a[ prefix ], traditional, add );\\n\\t\\t}\\n\\t}\\n\\n\\t// Return the resulting serialization\\n\\treturn s.join( \\\"&\\\" );\\n};\\n\\njQuery.fn.extend( {\\n\\tserialize: function() {\\n\\t\\treturn jQuery.param( this.serializeArray() );\\n\\t},\\n\\tserializeArray: function() {\\n\\t\\treturn this.map( function() {\\n\\n\\t\\t\\t// Can add propHook for \\\"elements\\\" to filter or add form elements\\n\\t\\t\\tvar elements = jQuery.prop( this, \\\"elements\\\" );\\n\\t\\t\\treturn elements ? jQuery.makeArray( elements ) : this;\\n\\t\\t} )\\n\\t\\t.filter( function() {\\n\\t\\t\\tvar type = this.type;\\n\\n\\t\\t\\t// Use .is( \\\":disabled\\\" ) so that fieldset[disabled] works\\n\\t\\t\\treturn this.name && !jQuery( this ).is( \\\":disabled\\\" ) &&\\n\\t\\t\\t\\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\\n\\t\\t\\t\\t( this.checked || !rcheckableType.test( type ) );\\n\\t\\t} )\\n\\t\\t.map( function( i, elem ) {\\n\\t\\t\\tvar val = jQuery( this ).val();\\n\\n\\t\\t\\tif ( val == null ) {\\n\\t\\t\\t\\treturn null;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( Array.isArray( val ) ) {\\n\\t\\t\\t\\treturn jQuery.map( val, function( val ) {\\n\\t\\t\\t\\t\\treturn { name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn { name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t} ).get();\\n\\t}\\n} );\\n\\n\\nvar\\n\\tr20 = /%20/g,\\n\\trhash = /#.*$/,\\n\\trantiCache = /([?&])_=[^&]*/,\\n\\trheaders = /^(.*?):[ \\\\t]*([^\\\\r\\\\n]*)$/mg,\\n\\n\\t// #7653, #8125, #8152: local protocol detection\\n\\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\\n\\trnoContent = /^(?:GET|HEAD)$/,\\n\\trprotocol = /^\\\\/\\\\//,\\n\\n\\t/* Prefilters\\n\\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\\n\\t * 2) These are called:\\n\\t * - BEFORE asking for a transport\\n\\t * - AFTER param serialization (s.data is a string if s.processData is true)\\n\\t * 3) key is the dataType\\n\\t * 4) the catchall symbol \\\"*\\\" can be used\\n\\t * 5) execution will start with transport dataType and THEN continue down to \\\"*\\\" if needed\\n\\t */\\n\\tprefilters = {},\\n\\n\\t/* Transports bindings\\n\\t * 1) key is the dataType\\n\\t * 2) the catchall symbol \\\"*\\\" can be used\\n\\t * 3) selection will start with transport dataType and THEN go to \\\"*\\\" if needed\\n\\t */\\n\\ttransports = {},\\n\\n\\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\\n\\tallTypes = \\\"*/\\\".concat( \\\"*\\\" ),\\n\\n\\t// Anchor tag for parsing the document origin\\n\\toriginAnchor = document.createElement( \\\"a\\\" );\\n\\toriginAnchor.href = location.href;\\n\\n// Base \\\"constructor\\\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\\nfunction addToPrefiltersOrTransports( structure ) {\\n\\n\\t// dataTypeExpression is optional and defaults to \\\"*\\\"\\n\\treturn function( dataTypeExpression, func ) {\\n\\n\\t\\tif ( typeof dataTypeExpression !== \\\"string\\\" ) {\\n\\t\\t\\tfunc = dataTypeExpression;\\n\\t\\t\\tdataTypeExpression = \\\"*\\\";\\n\\t\\t}\\n\\n\\t\\tvar dataType,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\\n\\n\\t\\tif ( jQuery.isFunction( func ) ) {\\n\\n\\t\\t\\t// For each dataType in the dataTypeExpression\\n\\t\\t\\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t// Prepend if requested\\n\\t\\t\\t\\tif ( dataType[ 0 ] === \\\"+\\\" ) {\\n\\t\\t\\t\\t\\tdataType = dataType.slice( 1 ) || \\\"*\\\";\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\\n\\n\\t\\t\\t\\t// Otherwise append\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\n// Base inspection function for prefilters and transports\\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\\n\\n\\tvar inspected = {},\\n\\t\\tseekingTransport = ( structure === transports );\\n\\n\\tfunction inspect( dataType ) {\\n\\t\\tvar selected;\\n\\t\\tinspected[ dataType ] = true;\\n\\t\\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\\n\\t\\t\\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\\n\\t\\t\\tif ( typeof dataTypeOrTransport === \\\"string\\\" &&\\n\\t\\t\\t\\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\\n\\n\\t\\t\\t\\toptions.dataTypes.unshift( dataTypeOrTransport );\\n\\t\\t\\t\\tinspect( dataTypeOrTransport );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t} else if ( seekingTransport ) {\\n\\t\\t\\t\\treturn !( selected = dataTypeOrTransport );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t\\treturn selected;\\n\\t}\\n\\n\\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \\\"*\\\" ] && inspect( \\\"*\\\" );\\n}\\n\\n// A special extend for ajax options\\n// that takes \\\"flat\\\" options (not to be deep extended)\\n// Fixes #9887\\nfunction ajaxExtend( target, src ) {\\n\\tvar key, deep,\\n\\t\\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\\n\\n\\tfor ( key in src ) {\\n\\t\\tif ( src[ key ] !== undefined ) {\\n\\t\\t\\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\\n\\t\\t}\\n\\t}\\n\\tif ( deep ) {\\n\\t\\tjQuery.extend( true, target, deep );\\n\\t}\\n\\n\\treturn target;\\n}\\n\\n/* Handles responses to an ajax request:\\n * - finds the right dataType (mediates between content-type and expected dataType)\\n * - returns the corresponding response\\n */\\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\\n\\n\\tvar ct, type, finalDataType, firstDataType,\\n\\t\\tcontents = s.contents,\\n\\t\\tdataTypes = s.dataTypes;\\n\\n\\t// Remove auto dataType and get content-type in the process\\n\\twhile ( dataTypes[ 0 ] === \\\"*\\\" ) {\\n\\t\\tdataTypes.shift();\\n\\t\\tif ( ct === undefined ) {\\n\\t\\t\\tct = s.mimeType || jqXHR.getResponseHeader( \\\"Content-Type\\\" );\\n\\t\\t}\\n\\t}\\n\\n\\t// Check if we're dealing with a known content-type\\n\\tif ( ct ) {\\n\\t\\tfor ( type in contents ) {\\n\\t\\t\\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\\n\\t\\t\\t\\tdataTypes.unshift( type );\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Check to see if we have a response for the expected dataType\\n\\tif ( dataTypes[ 0 ] in responses ) {\\n\\t\\tfinalDataType = dataTypes[ 0 ];\\n\\t} else {\\n\\n\\t\\t// Try convertible dataTypes\\n\\t\\tfor ( type in responses ) {\\n\\t\\t\\tif ( !dataTypes[ 0 ] || s.converters[ type + \\\" \\\" + dataTypes[ 0 ] ] ) {\\n\\t\\t\\t\\tfinalDataType = type;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tif ( !firstDataType ) {\\n\\t\\t\\t\\tfirstDataType = type;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Or just use first one\\n\\t\\tfinalDataType = finalDataType || firstDataType;\\n\\t}\\n\\n\\t// If we found a dataType\\n\\t// We add the dataType to the list if needed\\n\\t// and return the corresponding response\\n\\tif ( finalDataType ) {\\n\\t\\tif ( finalDataType !== dataTypes[ 0 ] ) {\\n\\t\\t\\tdataTypes.unshift( finalDataType );\\n\\t\\t}\\n\\t\\treturn responses[ finalDataType ];\\n\\t}\\n}\\n\\n/* Chain conversions given the request and the original response\\n * Also sets the responseXXX fields on the jqXHR instance\\n */\\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\\n\\tvar conv2, current, conv, tmp, prev,\\n\\t\\tconverters = {},\\n\\n\\t\\t// Work with a copy of dataTypes in case we need to modify it for conversion\\n\\t\\tdataTypes = s.dataTypes.slice();\\n\\n\\t// Create converters map with lowercased keys\\n\\tif ( dataTypes[ 1 ] ) {\\n\\t\\tfor ( conv in s.converters ) {\\n\\t\\t\\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\\n\\t\\t}\\n\\t}\\n\\n\\tcurrent = dataTypes.shift();\\n\\n\\t// Convert to each sequential dataType\\n\\twhile ( current ) {\\n\\n\\t\\tif ( s.responseFields[ current ] ) {\\n\\t\\t\\tjqXHR[ s.responseFields[ current ] ] = response;\\n\\t\\t}\\n\\n\\t\\t// Apply the dataFilter if provided\\n\\t\\tif ( !prev && isSuccess && s.dataFilter ) {\\n\\t\\t\\tresponse = s.dataFilter( response, s.dataType );\\n\\t\\t}\\n\\n\\t\\tprev = current;\\n\\t\\tcurrent = dataTypes.shift();\\n\\n\\t\\tif ( current ) {\\n\\n\\t\\t\\t// There's only work to do if current dataType is non-auto\\n\\t\\t\\tif ( current === \\\"*\\\" ) {\\n\\n\\t\\t\\t\\tcurrent = prev;\\n\\n\\t\\t\\t// Convert response if prev dataType is non-auto and differs from current\\n\\t\\t\\t} else if ( prev !== \\\"*\\\" && prev !== current ) {\\n\\n\\t\\t\\t\\t// Seek a direct converter\\n\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + current ] || converters[ \\\"* \\\" + current ];\\n\\n\\t\\t\\t\\t// If none found, seek a pair\\n\\t\\t\\t\\tif ( !conv ) {\\n\\t\\t\\t\\t\\tfor ( conv2 in converters ) {\\n\\n\\t\\t\\t\\t\\t\\t// If conv2 outputs current\\n\\t\\t\\t\\t\\t\\ttmp = conv2.split( \\\" \\\" );\\n\\t\\t\\t\\t\\t\\tif ( tmp[ 1 ] === current ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// If prev can be converted to accepted input\\n\\t\\t\\t\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + tmp[ 0 ] ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\tconverters[ \\\"* \\\" + tmp[ 0 ] ];\\n\\t\\t\\t\\t\\t\\t\\tif ( conv ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Condense equivalence converters\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( conv === true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tconv = converters[ conv2 ];\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Otherwise, insert the intermediate dataType\\n\\t\\t\\t\\t\\t\\t\\t\\t} else if ( converters[ conv2 ] !== true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcurrent = tmp[ 0 ];\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdataTypes.unshift( tmp[ 1 ] );\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Apply converter (if not an equivalence)\\n\\t\\t\\t\\tif ( conv !== true ) {\\n\\n\\t\\t\\t\\t\\t// Unless errors are allowed to bubble, catch and return them\\n\\t\\t\\t\\t\\tif ( conv && s.throws ) {\\n\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t\\t} catch ( e ) {\\n\\t\\t\\t\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\t\\t\\t\\tstate: \\\"parsererror\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\terror: conv ? e : \\\"No conversion from \\\" + prev + \\\" to \\\" + current\\n\\t\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn { state: \\\"success\\\", data: response };\\n}\\n\\njQuery.extend( {\\n\\n\\t// Counter for holding the number of active queries\\n\\tactive: 0,\\n\\n\\t// Last-Modified header cache for next request\\n\\tlastModified: {},\\n\\tetag: {},\\n\\n\\tajaxSettings: {\\n\\t\\turl: location.href,\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tisLocal: rlocalProtocol.test( location.protocol ),\\n\\t\\tglobal: true,\\n\\t\\tprocessData: true,\\n\\t\\tasync: true,\\n\\t\\tcontentType: \\\"application/x-www-form-urlencoded; charset=UTF-8\\\",\\n\\n\\t\\t/*\\n\\t\\ttimeout: 0,\\n\\t\\tdata: null,\\n\\t\\tdataType: null,\\n\\t\\tusername: null,\\n\\t\\tpassword: null,\\n\\t\\tcache: null,\\n\\t\\tthrows: false,\\n\\t\\ttraditional: false,\\n\\t\\theaders: {},\\n\\t\\t*/\\n\\n\\t\\taccepts: {\\n\\t\\t\\t\\\"*\\\": allTypes,\\n\\t\\t\\ttext: \\\"text/plain\\\",\\n\\t\\t\\thtml: \\\"text/html\\\",\\n\\t\\t\\txml: \\\"application/xml, text/xml\\\",\\n\\t\\t\\tjson: \\\"application/json, text/javascript\\\"\\n\\t\\t},\\n\\n\\t\\tcontents: {\\n\\t\\t\\txml: /\\\\bxml\\\\b/,\\n\\t\\t\\thtml: /\\\\bhtml/,\\n\\t\\t\\tjson: /\\\\bjson\\\\b/\\n\\t\\t},\\n\\n\\t\\tresponseFields: {\\n\\t\\t\\txml: \\\"responseXML\\\",\\n\\t\\t\\ttext: \\\"responseText\\\",\\n\\t\\t\\tjson: \\\"responseJSON\\\"\\n\\t\\t},\\n\\n\\t\\t// Data converters\\n\\t\\t// Keys separate source (or catchall \\\"*\\\") and destination types with a single space\\n\\t\\tconverters: {\\n\\n\\t\\t\\t// Convert anything to text\\n\\t\\t\\t\\\"* text\\\": String,\\n\\n\\t\\t\\t// Text to html (true = no transformation)\\n\\t\\t\\t\\\"text html\\\": true,\\n\\n\\t\\t\\t// Evaluate text as a json expression\\n\\t\\t\\t\\\"text json\\\": JSON.parse,\\n\\n\\t\\t\\t// Parse text as xml\\n\\t\\t\\t\\\"text xml\\\": jQuery.parseXML\\n\\t\\t},\\n\\n\\t\\t// For options that shouldn't be deep extended:\\n\\t\\t// you can add your own custom options here if\\n\\t\\t// and when you create one that shouldn't be\\n\\t\\t// deep extended (see ajaxExtend)\\n\\t\\tflatOptions: {\\n\\t\\t\\turl: true,\\n\\t\\t\\tcontext: true\\n\\t\\t}\\n\\t},\\n\\n\\t// Creates a full fledged settings object into target\\n\\t// with both ajaxSettings and settings fields.\\n\\t// If target is omitted, writes into ajaxSettings.\\n\\tajaxSetup: function( target, settings ) {\\n\\t\\treturn settings ?\\n\\n\\t\\t\\t// Building a settings object\\n\\t\\t\\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\\n\\n\\t\\t\\t// Extending ajaxSettings\\n\\t\\t\\tajaxExtend( jQuery.ajaxSettings, target );\\n\\t},\\n\\n\\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\\n\\tajaxTransport: addToPrefiltersOrTransports( transports ),\\n\\n\\t// Main method\\n\\tajax: function( url, options ) {\\n\\n\\t\\t// If url is an object, simulate pre-1.5 signature\\n\\t\\tif ( typeof url === \\\"object\\\" ) {\\n\\t\\t\\toptions = url;\\n\\t\\t\\turl = undefined;\\n\\t\\t}\\n\\n\\t\\t// Force options to be an object\\n\\t\\toptions = options || {};\\n\\n\\t\\tvar transport,\\n\\n\\t\\t\\t// URL without anti-cache param\\n\\t\\t\\tcacheURL,\\n\\n\\t\\t\\t// Response headers\\n\\t\\t\\tresponseHeadersString,\\n\\t\\t\\tresponseHeaders,\\n\\n\\t\\t\\t// timeout handle\\n\\t\\t\\ttimeoutTimer,\\n\\n\\t\\t\\t// Url cleanup var\\n\\t\\t\\turlAnchor,\\n\\n\\t\\t\\t// Request state (becomes false upon send and true upon completion)\\n\\t\\t\\tcompleted,\\n\\n\\t\\t\\t// To know if global events are to be dispatched\\n\\t\\t\\tfireGlobals,\\n\\n\\t\\t\\t// Loop variable\\n\\t\\t\\ti,\\n\\n\\t\\t\\t// uncached part of the url\\n\\t\\t\\tuncached,\\n\\n\\t\\t\\t// Create the final options object\\n\\t\\t\\ts = jQuery.ajaxSetup( {}, options ),\\n\\n\\t\\t\\t// Callbacks context\\n\\t\\t\\tcallbackContext = s.context || s,\\n\\n\\t\\t\\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\\n\\t\\t\\tglobalEventContext = s.context &&\\n\\t\\t\\t\\t( callbackContext.nodeType || callbackContext.jquery ) ?\\n\\t\\t\\t\\t\\tjQuery( callbackContext ) :\\n\\t\\t\\t\\t\\tjQuery.event,\\n\\n\\t\\t\\t// Deferreds\\n\\t\\t\\tdeferred = jQuery.Deferred(),\\n\\t\\t\\tcompleteDeferred = jQuery.Callbacks( \\\"once memory\\\" ),\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tstatusCode = s.statusCode || {},\\n\\n\\t\\t\\t// Headers (they are sent all at once)\\n\\t\\t\\trequestHeaders = {},\\n\\t\\t\\trequestHeadersNames = {},\\n\\n\\t\\t\\t// Default abort message\\n\\t\\t\\tstrAbort = \\\"canceled\\\",\\n\\n\\t\\t\\t// Fake xhr\\n\\t\\t\\tjqXHR = {\\n\\t\\t\\t\\treadyState: 0,\\n\\n\\t\\t\\t\\t// Builds headers hashtable if needed\\n\\t\\t\\t\\tgetResponseHeader: function( key ) {\\n\\t\\t\\t\\t\\tvar match;\\n\\t\\t\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\t\\t\\tif ( !responseHeaders ) {\\n\\t\\t\\t\\t\\t\\t\\tresponseHeaders = {};\\n\\t\\t\\t\\t\\t\\t\\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tmatch = responseHeaders[ key.toLowerCase() ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn match == null ? null : match;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Raw string\\n\\t\\t\\t\\tgetAllResponseHeaders: function() {\\n\\t\\t\\t\\t\\treturn completed ? responseHeadersString : null;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Caches the header\\n\\t\\t\\t\\tsetRequestHeader: function( name, value ) {\\n\\t\\t\\t\\t\\tif ( completed == null ) {\\n\\t\\t\\t\\t\\t\\tname = requestHeadersNames[ name.toLowerCase() ] =\\n\\t\\t\\t\\t\\t\\t\\trequestHeadersNames[ name.toLowerCase() ] || name;\\n\\t\\t\\t\\t\\t\\trequestHeaders[ name ] = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Overrides response content-type header\\n\\t\\t\\t\\toverrideMimeType: function( type ) {\\n\\t\\t\\t\\t\\tif ( completed == null ) {\\n\\t\\t\\t\\t\\t\\ts.mimeType = type;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\t\\tstatusCode: function( map ) {\\n\\t\\t\\t\\t\\tvar code;\\n\\t\\t\\t\\t\\tif ( map ) {\\n\\t\\t\\t\\t\\t\\tif ( completed ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Execute the appropriate callbacks\\n\\t\\t\\t\\t\\t\\t\\tjqXHR.always( map[ jqXHR.status ] );\\n\\t\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Lazy-add the new callbacks in a way that preserves old ones\\n\\t\\t\\t\\t\\t\\t\\tfor ( code in map ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Cancel the request\\n\\t\\t\\t\\tabort: function( statusText ) {\\n\\t\\t\\t\\t\\tvar finalText = statusText || strAbort;\\n\\t\\t\\t\\t\\tif ( transport ) {\\n\\t\\t\\t\\t\\t\\ttransport.abort( finalText );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdone( 0, finalText );\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\n\\t\\t// Attach deferreds\\n\\t\\tdeferred.promise( jqXHR );\\n\\n\\t\\t// Add protocol if not provided (prefilters might expect it)\\n\\t\\t// Handle falsy url in the settings object (#10093: consistency with old signature)\\n\\t\\t// We also use the url parameter if available\\n\\t\\ts.url = ( ( url || s.url || location.href ) + \\\"\\\" )\\n\\t\\t\\t.replace( rprotocol, location.protocol + \\\"//\\\" );\\n\\n\\t\\t// Alias method option to type as per ticket #12004\\n\\t\\ts.type = options.method || options.type || s.method || s.type;\\n\\n\\t\\t// Extract dataTypes list\\n\\t\\ts.dataTypes = ( s.dataType || \\\"*\\\" ).toLowerCase().match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\n\\t\\t// A cross-domain request is in order when the origin doesn't match the current origin.\\n\\t\\tif ( s.crossDomain == null ) {\\n\\t\\t\\turlAnchor = document.createElement( \\\"a\\\" );\\n\\n\\t\\t\\t// Support: IE <=8 - 11, Edge 12 - 13\\n\\t\\t\\t// IE throws exception on accessing the href property if url is malformed,\\n\\t\\t\\t// e.g. http://example.com:80x/\\n\\t\\t\\ttry {\\n\\t\\t\\t\\turlAnchor.href = s.url;\\n\\n\\t\\t\\t\\t// Support: IE <=8 - 11 only\\n\\t\\t\\t\\t// Anchor's host property isn't correctly set when s.url is relative\\n\\t\\t\\t\\turlAnchor.href = urlAnchor.href;\\n\\t\\t\\t\\ts.crossDomain = originAnchor.protocol + \\\"//\\\" + originAnchor.host !==\\n\\t\\t\\t\\t\\turlAnchor.protocol + \\\"//\\\" + urlAnchor.host;\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// If there is an error parsing the URL, assume it is crossDomain,\\n\\t\\t\\t\\t// it can be rejected by the transport if it is invalid\\n\\t\\t\\t\\ts.crossDomain = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Convert data if not already a string\\n\\t\\tif ( s.data && s.processData && typeof s.data !== \\\"string\\\" ) {\\n\\t\\t\\ts.data = jQuery.param( s.data, s.traditional );\\n\\t\\t}\\n\\n\\t\\t// Apply prefilters\\n\\t\\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\\n\\n\\t\\t// If request was aborted inside a prefilter, stop there\\n\\t\\tif ( completed ) {\\n\\t\\t\\treturn jqXHR;\\n\\t\\t}\\n\\n\\t\\t// We can fire global events as of now if asked to\\n\\t\\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\\n\\t\\tfireGlobals = jQuery.event && s.global;\\n\\n\\t\\t// Watch for a new set of requests\\n\\t\\tif ( fireGlobals && jQuery.active++ === 0 ) {\\n\\t\\t\\tjQuery.event.trigger( \\\"ajaxStart\\\" );\\n\\t\\t}\\n\\n\\t\\t// Uppercase the type\\n\\t\\ts.type = s.type.toUpperCase();\\n\\n\\t\\t// Determine if request has content\\n\\t\\ts.hasContent = !rnoContent.test( s.type );\\n\\n\\t\\t// Save the URL in case we're toying with the If-Modified-Since\\n\\t\\t// and/or If-None-Match header later on\\n\\t\\t// Remove hash to simplify url manipulation\\n\\t\\tcacheURL = s.url.replace( rhash, \\\"\\\" );\\n\\n\\t\\t// More options handling for requests with no content\\n\\t\\tif ( !s.hasContent ) {\\n\\n\\t\\t\\t// Remember the hash so we can put it back\\n\\t\\t\\tuncached = s.url.slice( cacheURL.length );\\n\\n\\t\\t\\t// If data is available, append data to url\\n\\t\\t\\tif ( s.data ) {\\n\\t\\t\\t\\tcacheURL += ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + s.data;\\n\\n\\t\\t\\t\\t// #9682: remove data so that it's not used in an eventual retry\\n\\t\\t\\t\\tdelete s.data;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add or update anti-cache param if needed\\n\\t\\t\\tif ( s.cache === false ) {\\n\\t\\t\\t\\tcacheURL = cacheURL.replace( rantiCache, \\\"$1\\\" );\\n\\t\\t\\t\\tuncached = ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + \\\"_=\\\" + ( nonce++ ) + uncached;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\\n\\t\\t\\ts.url = cacheURL + uncached;\\n\\n\\t\\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\\n\\t\\t} else if ( s.data && s.processData &&\\n\\t\\t\\t( s.contentType || \\\"\\\" ).indexOf( \\\"application/x-www-form-urlencoded\\\" ) === 0 ) {\\n\\t\\t\\ts.data = s.data.replace( r20, \\\"+\\\" );\\n\\t\\t}\\n\\n\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\tif ( s.ifModified ) {\\n\\t\\t\\tif ( jQuery.lastModified[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-Modified-Since\\\", jQuery.lastModified[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t\\tif ( jQuery.etag[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-None-Match\\\", jQuery.etag[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Set the correct header, if data is being sent\\n\\t\\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\\n\\t\\t\\tjqXHR.setRequestHeader( \\\"Content-Type\\\", s.contentType );\\n\\t\\t}\\n\\n\\t\\t// Set the Accepts header for the server, depending on the dataType\\n\\t\\tjqXHR.setRequestHeader(\\n\\t\\t\\t\\\"Accept\\\",\\n\\t\\t\\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\\n\\t\\t\\t\\ts.accepts[ s.dataTypes[ 0 ] ] +\\n\\t\\t\\t\\t\\t( s.dataTypes[ 0 ] !== \\\"*\\\" ? \\\", \\\" + allTypes + \\\"; q=0.01\\\" : \\\"\\\" ) :\\n\\t\\t\\t\\ts.accepts[ \\\"*\\\" ]\\n\\t\\t);\\n\\n\\t\\t// Check for headers option\\n\\t\\tfor ( i in s.headers ) {\\n\\t\\t\\tjqXHR.setRequestHeader( i, s.headers[ i ] );\\n\\t\\t}\\n\\n\\t\\t// Allow custom headers/mimetypes and early abort\\n\\t\\tif ( s.beforeSend &&\\n\\t\\t\\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\\n\\n\\t\\t\\t// Abort if not done already and return\\n\\t\\t\\treturn jqXHR.abort();\\n\\t\\t}\\n\\n\\t\\t// Aborting is no longer a cancellation\\n\\t\\tstrAbort = \\\"abort\\\";\\n\\n\\t\\t// Install callbacks on deferreds\\n\\t\\tcompleteDeferred.add( s.complete );\\n\\t\\tjqXHR.done( s.success );\\n\\t\\tjqXHR.fail( s.error );\\n\\n\\t\\t// Get transport\\n\\t\\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\\n\\n\\t\\t// If no transport, we auto-abort\\n\\t\\tif ( !transport ) {\\n\\t\\t\\tdone( -1, \\\"No Transport\\\" );\\n\\t\\t} else {\\n\\t\\t\\tjqXHR.readyState = 1;\\n\\n\\t\\t\\t// Send global event\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxSend\\\", [ jqXHR, s ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If request was aborted inside ajaxSend, stop there\\n\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\treturn jqXHR;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Timeout\\n\\t\\t\\tif ( s.async && s.timeout > 0 ) {\\n\\t\\t\\t\\ttimeoutTimer = window.setTimeout( function() {\\n\\t\\t\\t\\t\\tjqXHR.abort( \\\"timeout\\\" );\\n\\t\\t\\t\\t}, s.timeout );\\n\\t\\t\\t}\\n\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tcompleted = false;\\n\\t\\t\\t\\ttransport.send( requestHeaders, done );\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// Rethrow post-completion exceptions\\n\\t\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Propagate others as results\\n\\t\\t\\t\\tdone( -1, e );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Callback for when everything is done\\n\\t\\tfunction done( status, nativeStatusText, responses, headers ) {\\n\\t\\t\\tvar isSuccess, success, error, response, modified,\\n\\t\\t\\t\\tstatusText = nativeStatusText;\\n\\n\\t\\t\\t// Ignore repeat invocations\\n\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tcompleted = true;\\n\\n\\t\\t\\t// Clear timeout if it exists\\n\\t\\t\\tif ( timeoutTimer ) {\\n\\t\\t\\t\\twindow.clearTimeout( timeoutTimer );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Dereference transport for early garbage collection\\n\\t\\t\\t// (no matter how long the jqXHR object will be used)\\n\\t\\t\\ttransport = undefined;\\n\\n\\t\\t\\t// Cache response headers\\n\\t\\t\\tresponseHeadersString = headers || \\\"\\\";\\n\\n\\t\\t\\t// Set readyState\\n\\t\\t\\tjqXHR.readyState = status > 0 ? 4 : 0;\\n\\n\\t\\t\\t// Determine if successful\\n\\t\\t\\tisSuccess = status >= 200 && status < 300 || status === 304;\\n\\n\\t\\t\\t// Get response data\\n\\t\\t\\tif ( responses ) {\\n\\t\\t\\t\\tresponse = ajaxHandleResponses( s, jqXHR, responses );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Convert no matter what (that way responseXXX fields are always set)\\n\\t\\t\\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\\n\\n\\t\\t\\t// If successful, handle type chaining\\n\\t\\t\\tif ( isSuccess ) {\\n\\n\\t\\t\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\t\\t\\tif ( s.ifModified ) {\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"Last-Modified\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.lastModified[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"etag\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.etag[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// if no content\\n\\t\\t\\t\\tif ( status === 204 || s.type === \\\"HEAD\\\" ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"nocontent\\\";\\n\\n\\t\\t\\t\\t// if not modified\\n\\t\\t\\t\\t} else if ( status === 304 ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"notmodified\\\";\\n\\n\\t\\t\\t\\t// If we have data, let's convert it\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tstatusText = response.state;\\n\\t\\t\\t\\t\\tsuccess = response.data;\\n\\t\\t\\t\\t\\terror = response.error;\\n\\t\\t\\t\\t\\tisSuccess = !error;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Extract error from statusText and normalize for non-aborts\\n\\t\\t\\t\\terror = statusText;\\n\\t\\t\\t\\tif ( status || !statusText ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"error\\\";\\n\\t\\t\\t\\t\\tif ( status < 0 ) {\\n\\t\\t\\t\\t\\t\\tstatus = 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Set data for the fake xhr object\\n\\t\\t\\tjqXHR.status = status;\\n\\t\\t\\tjqXHR.statusText = ( nativeStatusText || statusText ) + \\\"\\\";\\n\\n\\t\\t\\t// Success/Error\\n\\t\\t\\tif ( isSuccess ) {\\n\\t\\t\\t\\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tjqXHR.statusCode( statusCode );\\n\\t\\t\\tstatusCode = undefined;\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( isSuccess ? \\\"ajaxSuccess\\\" : \\\"ajaxError\\\",\\n\\t\\t\\t\\t\\t[ jqXHR, s, isSuccess ? success : error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Complete\\n\\t\\t\\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxComplete\\\", [ jqXHR, s ] );\\n\\n\\t\\t\\t\\t// Handle the global AJAX counter\\n\\t\\t\\t\\tif ( !( --jQuery.active ) ) {\\n\\t\\t\\t\\t\\tjQuery.event.trigger( \\\"ajaxStop\\\" );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn jqXHR;\\n\\t},\\n\\n\\tgetJSON: function( url, data, callback ) {\\n\\t\\treturn jQuery.get( url, data, callback, \\\"json\\\" );\\n\\t},\\n\\n\\tgetScript: function( url, callback ) {\\n\\t\\treturn jQuery.get( url, undefined, callback, \\\"script\\\" );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"get\\\", \\\"post\\\" ], function( i, method ) {\\n\\tjQuery[ method ] = function( url, data, callback, type ) {\\n\\n\\t\\t// Shift arguments if data argument was omitted\\n\\t\\tif ( jQuery.isFunction( data ) ) {\\n\\t\\t\\ttype = type || callback;\\n\\t\\t\\tcallback = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t}\\n\\n\\t\\t// The url can be an options object (which then must have .url)\\n\\t\\treturn jQuery.ajax( jQuery.extend( {\\n\\t\\t\\turl: url,\\n\\t\\t\\ttype: method,\\n\\t\\t\\tdataType: type,\\n\\t\\t\\tdata: data,\\n\\t\\t\\tsuccess: callback\\n\\t\\t}, jQuery.isPlainObject( url ) && url ) );\\n\\t};\\n} );\\n\\n\\njQuery._evalUrl = function( url ) {\\n\\treturn jQuery.ajax( {\\n\\t\\turl: url,\\n\\n\\t\\t// Make this explicit, since user can override this through ajaxSetup (#11264)\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tdataType: \\\"script\\\",\\n\\t\\tcache: true,\\n\\t\\tasync: false,\\n\\t\\tglobal: false,\\n\\t\\t\\\"throws\\\": true\\n\\t} );\\n};\\n\\n\\njQuery.fn.extend( {\\n\\twrapAll: function( html ) {\\n\\t\\tvar wrap;\\n\\n\\t\\tif ( this[ 0 ] ) {\\n\\t\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\t\\thtml = html.call( this[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// The elements to wrap the target around\\n\\t\\t\\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\\n\\n\\t\\t\\tif ( this[ 0 ].parentNode ) {\\n\\t\\t\\t\\twrap.insertBefore( this[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\twrap.map( function() {\\n\\t\\t\\t\\tvar elem = this;\\n\\n\\t\\t\\t\\twhile ( elem.firstElementChild ) {\\n\\t\\t\\t\\t\\telem = elem.firstElementChild;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn elem;\\n\\t\\t\\t} ).append( this );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\twrapInner: function( html ) {\\n\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).wrapInner( html.call( this, i ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar self = jQuery( this ),\\n\\t\\t\\t\\tcontents = self.contents();\\n\\n\\t\\t\\tif ( contents.length ) {\\n\\t\\t\\t\\tcontents.wrapAll( html );\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.append( html );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\twrap: function( html ) {\\n\\t\\tvar isFunction = jQuery.isFunction( html );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\\n\\t\\t} );\\n\\t},\\n\\n\\tunwrap: function( selector ) {\\n\\t\\tthis.parent( selector ).not( \\\"body\\\" ).each( function() {\\n\\t\\t\\tjQuery( this ).replaceWith( this.childNodes );\\n\\t\\t} );\\n\\t\\treturn this;\\n\\t}\\n} );\\n\\n\\njQuery.expr.pseudos.hidden = function( elem ) {\\n\\treturn !jQuery.expr.pseudos.visible( elem );\\n};\\njQuery.expr.pseudos.visible = function( elem ) {\\n\\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\\n};\\n\\n\\n\\n\\njQuery.ajaxSettings.xhr = function() {\\n\\ttry {\\n\\t\\treturn new window.XMLHttpRequest();\\n\\t} catch ( e ) {}\\n};\\n\\nvar xhrSuccessStatus = {\\n\\n\\t\\t// File protocol always yields status code 0, assume 200\\n\\t\\t0: 200,\\n\\n\\t\\t// Support: IE <=9 only\\n\\t\\t// #1450: sometimes IE returns 1223 when it should be 204\\n\\t\\t1223: 204\\n\\t},\\n\\txhrSupported = jQuery.ajaxSettings.xhr();\\n\\nsupport.cors = !!xhrSupported && ( \\\"withCredentials\\\" in xhrSupported );\\nsupport.ajax = xhrSupported = !!xhrSupported;\\n\\njQuery.ajaxTransport( function( options ) {\\n\\tvar callback, errorCallback;\\n\\n\\t// Cross domain only allowed if supported through XMLHttpRequest\\n\\tif ( support.cors || xhrSupported && !options.crossDomain ) {\\n\\t\\treturn {\\n\\t\\t\\tsend: function( headers, complete ) {\\n\\t\\t\\t\\tvar i,\\n\\t\\t\\t\\t\\txhr = options.xhr();\\n\\n\\t\\t\\t\\txhr.open(\\n\\t\\t\\t\\t\\toptions.type,\\n\\t\\t\\t\\t\\toptions.url,\\n\\t\\t\\t\\t\\toptions.async,\\n\\t\\t\\t\\t\\toptions.username,\\n\\t\\t\\t\\t\\toptions.password\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t\\t// Apply custom fields if provided\\n\\t\\t\\t\\tif ( options.xhrFields ) {\\n\\t\\t\\t\\t\\tfor ( i in options.xhrFields ) {\\n\\t\\t\\t\\t\\t\\txhr[ i ] = options.xhrFields[ i ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Override mime type if needed\\n\\t\\t\\t\\tif ( options.mimeType && xhr.overrideMimeType ) {\\n\\t\\t\\t\\t\\txhr.overrideMimeType( options.mimeType );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// X-Requested-With header\\n\\t\\t\\t\\t// For cross-domain requests, seeing as conditions for a preflight are\\n\\t\\t\\t\\t// akin to a jigsaw puzzle, we simply never set it to be sure.\\n\\t\\t\\t\\t// (it can always be set on a per-request basis or even using ajaxSetup)\\n\\t\\t\\t\\t// For same-domain requests, won't change header if already provided.\\n\\t\\t\\t\\tif ( !options.crossDomain && !headers[ \\\"X-Requested-With\\\" ] ) {\\n\\t\\t\\t\\t\\theaders[ \\\"X-Requested-With\\\" ] = \\\"XMLHttpRequest\\\";\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Set headers\\n\\t\\t\\t\\tfor ( i in headers ) {\\n\\t\\t\\t\\t\\txhr.setRequestHeader( i, headers[ i ] );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Callback\\n\\t\\t\\t\\tcallback = function( type ) {\\n\\t\\t\\t\\t\\treturn function() {\\n\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\tcallback = errorCallback = xhr.onload =\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\\n\\n\\t\\t\\t\\t\\t\\t\\tif ( type === \\\"abort\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.abort();\\n\\t\\t\\t\\t\\t\\t\\t} else if ( type === \\\"error\\\" ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t// On a manual native abort, IE9 throws\\n\\t\\t\\t\\t\\t\\t\\t\\t// errors on any property access that is not readyState\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( typeof xhr.status !== \\\"number\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete( 0, \\\"error\\\" );\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// File: protocol always yields status 0; see #8605, #14207\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhrSuccessStatus[ xhr.status ] || xhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText,\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// IE9 has no XHR2 but throws on binary (trac-11426)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// For XHR2 non-text, let the caller handle it (gh-2498)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t( xhr.responseType || \\\"text\\\" ) !== \\\"text\\\" ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttypeof xhr.responseText !== \\\"string\\\" ?\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ binary: xhr.response } :\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ text: xhr.responseText },\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.getAllResponseHeaders()\\n\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t};\\n\\n\\t\\t\\t\\t// Listen to events\\n\\t\\t\\t\\txhr.onload = callback();\\n\\t\\t\\t\\terrorCallback = xhr.onerror = callback( \\\"error\\\" );\\n\\n\\t\\t\\t\\t// Support: IE 9 only\\n\\t\\t\\t\\t// Use onreadystatechange to replace onabort\\n\\t\\t\\t\\t// to handle uncaught aborts\\n\\t\\t\\t\\tif ( xhr.onabort !== undefined ) {\\n\\t\\t\\t\\t\\txhr.onabort = errorCallback;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\txhr.onreadystatechange = function() {\\n\\n\\t\\t\\t\\t\\t\\t// Check readyState before timeout as it changes\\n\\t\\t\\t\\t\\t\\tif ( xhr.readyState === 4 ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Allow onerror to be called first,\\n\\t\\t\\t\\t\\t\\t\\t// but that will not handle a native abort\\n\\t\\t\\t\\t\\t\\t\\t// Also, save errorCallback to a variable\\n\\t\\t\\t\\t\\t\\t\\t// as xhr.onerror cannot be accessed\\n\\t\\t\\t\\t\\t\\t\\twindow.setTimeout( function() {\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\terrorCallback();\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Create the abort callback\\n\\t\\t\\t\\tcallback = callback( \\\"abort\\\" );\\n\\n\\t\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t\\t// Do send the request (this may raise an exception)\\n\\t\\t\\t\\t\\txhr.send( options.hasContent && options.data || null );\\n\\t\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t\\t// #14683: Only rethrow if this hasn't been notified as an error yet\\n\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\tabort: function() {\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\\njQuery.ajaxPrefilter( function( s ) {\\n\\tif ( s.crossDomain ) {\\n\\t\\ts.contents.script = false;\\n\\t}\\n} );\\n\\n// Install script dataType\\njQuery.ajaxSetup( {\\n\\taccepts: {\\n\\t\\tscript: \\\"text/javascript, application/javascript, \\\" +\\n\\t\\t\\t\\\"application/ecmascript, application/x-ecmascript\\\"\\n\\t},\\n\\tcontents: {\\n\\t\\tscript: /\\\\b(?:java|ecma)script\\\\b/\\n\\t},\\n\\tconverters: {\\n\\t\\t\\\"text script\\\": function( text ) {\\n\\t\\t\\tjQuery.globalEval( text );\\n\\t\\t\\treturn text;\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Handle cache's special case and crossDomain\\njQuery.ajaxPrefilter( \\\"script\\\", function( s ) {\\n\\tif ( s.cache === undefined ) {\\n\\t\\ts.cache = false;\\n\\t}\\n\\tif ( s.crossDomain ) {\\n\\t\\ts.type = \\\"GET\\\";\\n\\t}\\n} );\\n\\n// Bind script tag hack transport\\njQuery.ajaxTransport( \\\"script\\\", function( s ) {\\n\\n\\t// This transport only deals with cross domain requests\\n\\tif ( s.crossDomain ) {\\n\\t\\tvar script, callback;\\n\\t\\treturn {\\n\\t\\t\\tsend: function( _, complete ) {\\n\\t\\t\\t\\tscript = jQuery( \\\"\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlP2FiYTYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjdGlvbi1saW5rW2RhdGEtdi0yMjU3NzhjMl0ge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5tLWItbm9uZVtkYXRhLXYtMjI1Nzc4YzJdIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIlBlcnNvbmFsQWNjZXNzVG9rZW5zLnZ1ZT81NzM0ZjRlNFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJQZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVxcXCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2Vuc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cXFwiYWN0aW9uLWxpbmtcXFwiIEBjbGljaz1cXFwic2hvd0NyZWF0ZVRva2VuRm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBOZXcgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBUb2tlbnMgTm90aWNlIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XFxcIm0tYi1ub25lXFxcIiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID09PSAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZSBub3QgY3JlYXRlZCBhbnkgcGVyc29uYWwgYWNjZXNzIHRva2Vucy5cXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUGVyc29uYWwgQWNjZXNzIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCIgdi1pZj1cXFwidG9rZW5zLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cXFwidG9rZW4gaW4gdG9rZW5zXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xpZW50IE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b2tlbi5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGUgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gTW9kYWwgLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbCBmYWRlXFxcIiBpZD1cXFwibW9kYWwtY3JlYXRlLXRva2VuXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZm9ybS5lcnJvcnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+V2hvb3BzITwvc3Ryb25nPiBTb21ldGhpbmcgd2VudCB3cm9uZyE8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIHYtZm9yPVxcXCJlcnJvciBpbiBmb3JtLmVycm9yc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXJyb3IgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gRm9ybSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cXFwiZm9ybS1ob3Jpem9udGFsXFxcIiByb2xlPVxcXCJmb3JtXFxcIiBAc3VibWl0LnByZXZlbnQ9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+TmFtZTwvbGFiZWw+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJjcmVhdGUtdG9rZW4tbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwibmFtZVxcXCIgdi1tb2RlbD1cXFwiZm9ybS5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTY29wZXMgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIHYtaWY9XFxcInNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+U2NvcGVzPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC02XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtZm9yPVxcXCJzY29wZSBpbiBzY29wZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjaGVja2JveFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcInRvZ2dsZVNjb3BlKHNjb3BlLmlkKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNoZWNrZWQ9XFxcInNjb3BlSXNBc3NpZ25lZChzY29wZS5pZClcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzY29wZS5pZCB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQWNjZXNzIFRva2VuIE1vZGFsIC0tPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwgZmFkZVxcXCIgaWQ9XFxcIm1vZGFsLWFjY2Vzcy10b2tlblxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2VuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgeW91ciBuZXcgcGVyc29uYWwgYWNjZXNzIHRva2VuLiBUaGlzIGlzIHRoZSBvbmx5IHRpbWUgaXQgd2lsbCBiZSBzaG93biBzbyBkb24ndCBsb3NlIGl0IVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IG5vdyB1c2UgdGhpcyB0b2tlbiB0byBtYWtlIEFQSSByZXF1ZXN0cy5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT57eyBhY2Nlc3NUb2tlbiB9fTwvY29kZT48L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNb2RhbCBBY3Rpb25zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCI+Q2xvc2U8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogbnVsbCxcXG5cXG4gICAgICAgICAgICAgICAgdG9rZW5zOiBbXSxcXG4gICAgICAgICAgICAgICAgc2NvcGVzOiBbXSxcXG5cXG4gICAgICAgICAgICAgICAgZm9ybToge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICBzY29wZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW5zKCk7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2NvcGVzKCk7XFxuXFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5vbignc2hvd24uYnMubW9kYWwnLCAoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAkKCcjY3JlYXRlLXRva2VuLW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zID0gcmVzcG9uc2UuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBzY29wZXMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgZ2V0U2NvcGVzKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmdldCgnL29hdXRoL3Njb3BlcycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlcyA9IHJlc3BvbnNlLmRhdGE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBTaG93IHRoZSBmb3JtIGZvciBjcmVhdGluZyBuZXcgdG9rZW5zLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dDcmVhdGVUb2tlbkZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5tb2RhbCgnc2hvdycpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogQ3JlYXRlIGEgbmV3IHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBzdG9yZSgpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XFxuXFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2VucycsIHRoaXMuZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5uYW1lID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmVycm9ycyA9IFtdO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHJlc3BvbnNlLmRhdGEudG9rZW4pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBY2Nlc3NUb2tlbihyZXNwb25zZS5kYXRhLmFjY2Vzc1Rva2VuKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBfLmZsYXR0ZW4oXy50b0FycmF5KHJlc3BvbnNlLmRhdGEpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kaXIodGhpcy5mb3JtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLiddO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBUb2dnbGUgdGhlIGdpdmVuIHNjb3BlIGluIHRoZSBsaXN0IG9mIGFzc2lnbmVkIHNjb3Blcy5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB0b2dnbGVTY29wZShzY29wZSkge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZUlzQXNzaWduZWQoc2NvcGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2NvcGVzID0gXy5yZWplY3QodGhpcy5mb3JtLnNjb3BlcywgcyA9PiBzID09IHNjb3BlKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMucHVzaChzY29wZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gc2NvcGUgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRva2VuLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNjb3BlSXNBc3NpZ25lZChzY29wZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5pbmRleE9mKHRoaXMuZm9ybS5zY29wZXMsIHNjb3BlKSA+PSAwO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZ2l2ZW4gYWNjZXNzIHRva2VuIHRvIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLXRva2VuJykubW9kYWwoJ2hpZGUnKTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtYWNjZXNzLXRva2VuJykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFJldm9rZSB0aGUgZ2l2ZW4gdG9rZW4uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcmV2b2tlKHRva2VuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZGVsZXRlKCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2Vucy8nICsgdG9rZW4uaWQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXX1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0yMjU3NzhjMiZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9wYXNzcG9ydC9QZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcbi8vIG1vZHVsZSBpZCA9IDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"alert.vue\\\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvYWxlcnQudnVlP2EwMWUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJcIixcImZpbGVcIjpcImFsZXJ0LnZ1ZVwifV0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNlZGVmM2JhJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2FsZXJ0LnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\ntd[data-v-5301a236] {\\\\n font-size: 14px;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"importer.vue?ec28e03c\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA\\\",\\\"file\\\":\\\"importer.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXIudnVlPzNiMGEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxudGRbZGF0YS12LTUzMDFhMjM2XSB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcImltcG9ydGVyLnZ1ZT9lYzI4ZTAzY1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJpbXBvcnRlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG50ZCB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuPC9zdHlsZT5cXG48dGVtcGxhdGU+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJvd1xcXCI+XFxuICAgICAgICA8YWxlcnQgdi1zaG93PVxcXCJhbGVydC52aXNpYmxlXFxcIiA6YWxlcnRUeXBlPVxcXCJhbGVydC50eXBlXFxcIiB2LW9uOmhpZGU9XFxcImFsZXJ0LnZpc2libGUgPSBmYWxzZVxcXCI+e3sgYWxlcnQubWVzc2FnZSB9fTwvYWxlcnQ+XFxuICAgICAgICA8ZXJyb3JzIDplcnJvcnM9XFxcImltcG9ydEVycm9yc1xcXCI+PC9lcnJvcnM+XFxuICAgICAgICA8bW9kYWwgdi1tb2RlbD1cXFwiZGlzcGxheUltcG9ydE1vZGFsXFxcIiBlZmZlY3Q9XFxcImZhZGVcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgc2xvdD1cXFwibW9kYWwtaGVhZGVyXFxcIiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVxcXCJtb2RhbC10aXRsZVxcXCI+SW1wb3J0IEZpbGU6PC9oND5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IHNsb3Q9XFxcIm1vZGFsLWJvZHlcXFwiIGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZHluYW1pYy1mb3JtLXJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNCBjb2wteHMtMTJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJpbXBvcnQtdHlwZVxcXCI+SW1wb3J0IFR5cGU6PC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTggY29sLXhzLTEyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0MiA6b3B0aW9ucz1cXFwibW9kYWwuaW1wb3J0VHlwZXNcXFwiIHYtbW9kZWw9XFxcIm1vZGFsLmltcG9ydFR5cGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPVxcXCIwXFxcIj48L29wdGlvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdDI+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkeW5hbWljLWZvcm0tcm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC00IGNvbC14cy0xMlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImltcG9ydC11cGRhdGVcXFwiPlVwZGF0ZSBFeGlzdGluZyBWYWx1ZXM/OjwvbGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC04IGNvbC14cy0xMlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBuYW1lPVxcXCJpbXBvcnQtdXBkYXRlXFxcIiB2LW1vZGVsPVxcXCJtb2RhbC51cGRhdGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIiBzbG90PVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1zdWNjZXNzIGNvbC1tZC01IGNvbC1tZC1vZmZzZXQtMVxcXCIgc3R5bGU9XFxcInRleHQtYWxpZ246bGVmdFxcXCIgdi1pZj1cXFwibW9kYWwuc3RhdHVzVGV4dFxcXCI+e3sgdGhpcy5tb2RhbC5zdGF0dXNUZXh0IH19PC9kaXY+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBAY2xpY2s9XFxcImRpc3BsYXlJbXBvcnRNb2RhbCA9IGZhbHNlXFxcIj5DYW5jZWw8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwicG9zdFNhdmVcXFwiPlByb2Nlc3M8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvbW9kYWw+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTJcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBmaWxlaW5wdXQtYnV0dG9uIHNwYW4gaXMgdXNlZCB0byBzdHlsZSB0aGUgZmlsZSBpbnB1dCBmaWVsZCBhcyBidXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJidG4gYnRuLWluZm8gZmlsZWlucHV0LWJ1dHRvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TZWxlY3QgSW1wb3J0IEZpbGUuLi48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBmaWxlIGlucHV0IGZpZWxkIHVzZWQgYXMgdGFyZ2V0IGZvciB0aGUgZmlsZSB1cGxvYWQgd2lkZ2V0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJmaWxldXBsb2FkXFxcIiB0eXBlPVxcXCJmaWxlXFxcIiBuYW1lPVxcXCJmaWxlc1tdXFxcIiBkYXRhLXVybD1cXFwiL2FwaS92MS9pbXBvcnRzXFxcIiBhY2NlcHQ9XFxcInRleHQvY3N2XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC05XFxcIiB2LXNob3c9XFxcInByb2dyZXNzLnZpc2libGVcXFwiIHN0eWxlPVxcXCJwYWRkaW5nLWJvdHRvbToyMHB4XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTExXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInByb2dyZXNzIHByb2dyZXNzLXN0cmlwZWQtYWN0aXZlXFxcIiBzdHlsZT1cXFwibWFyZ2luLXRvcDogOHB4XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwcm9ncmVzcy1iYXJcXFwiIDpjbGFzcz1cXFwicHJvZ3Jlc3MuY3VycmVudENsYXNzXFxcIiByb2xlPVxcXCJwcm9ncmVzc2JhclxcXCIgOnN0eWxlPVxcXCJwcm9ncmVzc1dpZHRoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJvZ3Jlc3Muc3RhdHVzVGV4dCB9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XFxcInRhYmxlIHRhYmxlLXN0cmlwZWRcXFwiIGlkPVxcXCJ1cGxvYWQtdGFibGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5GaWxlPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+Q3JlYXRlZDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNpemU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImZpbGUgaW4gZmlsZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZmlsZS5maWxlX3BhdGggfX08L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZmlsZS5jcmVhdGVkX2F0IH19IDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBmaWxlLmZpbGVzaXplIH19PC90ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiYnRuIGJ0bi1zbSBidG4taW5mb1xcXCIgQGNsaWNrPVxcXCJzaG93TW9kYWwoZmlsZSlcXFwiPjxpIGNsYXNzPVxcXCJmYSBmYS1zcGlubmVyIHByb2Nlc3NcXFwiPjwvaT5Qcm9jZXNzPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJidG4gYnRuLXNtIGJ0bi1kYW5nZXJcXFwiIEBjbGljaz1cXFwiZGVsZXRlRmlsZShmaWxlKVxcXCI+PGkgY2xhc3M9XFxcImZhIGZhLXRyYXNoIGljb24td2hpdGVcXFwiPjwvaT48L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIHJlcXVpcmUoJ2JsdWVpbXAtZmlsZS11cGxvYWQnKTtcXG4gICAgdmFyIG1vZGFsID0gcmVxdWlyZSgndnVlLXN0cmFwJykubW9kYWxcXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGZpbGVzOiBbXSxcXG4gICAgICAgICAgICAgICAgZGlzcGxheUltcG9ydE1vZGFsOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgYWN0aXZlRmlsZTogbnVsbCxcXG4gICAgICAgICAgICAgICAgYWxlcnQ6IHtcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBudWxsLFxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIG1vZGFsOiB7XFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRUeXBlOiAnYXNzZXQnLFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydFR5cGVzOiBbXFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogJ2Fzc2V0JywgdGV4dDogJ0Fzc2V0cycgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAnYWNjZXNzb3J5JywgdGV4dDogJ0FjY2Vzc29yaWVzJyB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdjb25zdW1hYmxlJywgdGV4dDogJ0NvbnN1bWFibGUnIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogJ2NvbXBvbmVudCcsIHRleHQ6ICdDb21wb25lbnRzJyB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdsaWNlbnNlJywgdGV4dDogJ0xpY2Vuc2VzJyB9XFxuICAgICAgICAgICAgICAgICAgICBdLFxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogbnVsbCxcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgaW1wb3J0RXJyb3JzOiBudWxsLFxcbiAgICAgICAgICAgICAgICBwcm9ncmVzczoge1xcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzOiBcXFwicHJvZ3Jlc3MtYmFyLXdhcm5pbmdcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBlcmNlbnQ6IFxcXCIwXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6ICcnLFxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLyoqXFxuICAgICAgICAgKiBQcmVwYXJlIHRoZSBjb21wb25lbnQgKFZ1ZSAyLngpLlxcbiAgICAgICAgICovXFxuICAgICAgICBtb3VudGVkKCkge1xcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hGaWxlcygpO1xcbiAgICAgICAgICAgIGxldCB2bSA9IHRoaXM7XFxuICAgICAgICAgICAgJCgnI2ZpbGV1cGxvYWQnKS5maWxldXBsb2FkKHtcXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcXG4gICAgICAgICAgICAgICAgZG9uZShlLCBkYXRhKSB7XFxuICAgICAgICAgICAgICAgICAgICB2bS5wcm9ncmVzcy5jdXJyZW50Q2xhc3M9XFxcInByb2dyZXNzLWJhci1zdWNjZXNzXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLnN0YXR1c1RleHQgPSBcXFwiU3VjY2VzcyFcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgdm0uZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlcy5jb25jYXQodm0uZmlsZXMpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBhZGQoZSwgZGF0YSkge1xcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5oZWFkZXJzID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJYLVJlcXVlc3RlZC1XaXRoXFxcIjogJ1hNTEh0dHBSZXF1ZXN0JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiWC1DU1JGLVRPS0VOXFxcIjogTGFyYXZlbC5jc3JmVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKCAoKSA9PiB7ZGF0YS5zdWJtaXQoKTt9KTtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLnZpc2libGU9dHJ1ZTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3MoZSwgZGF0YSkge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2dyZXNzID0gcGFyc2VJbnQoKGRhdGEubG9hZGVkIC8gZGF0YS50b3RhbCAqIDEwMCwgMTApKTtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLmN1cnJlbnRQZXJjZW50ID0gcHJvZ3Jlc3M7XFxuICAgICAgICAgICAgICAgICAgICB2bS5wcm9ncmVzcy5zdGF0dXNUZXh0ID0gcHJvZ3Jlc3MrJyUgQ29tcGxldGUnO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBmYWlsKGUsIGRhdGEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLmN1cnJlbnRDbGFzcyA9IFxcXCJwcm9ncmVzcy1iYXItZGFuZ2VyXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIC8vIERpc3BsYXkgYW55IGVycm9ycyByZXR1cm5lZCBmcm9tIHRoZSAkLmFqYXgoKVxcbiAgICAgICAgICAgICAgICAgICAgdm0ucHJvZ3Jlc3Muc3RhdHVzVGV4dCA9IGRhdGEuanFYSFIucmVzcG9uc2VKU09OLm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgZmV0Y2hGaWxlcygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9hcGkvdjEvaW1wb3J0cycpXFxuICAgICAgICAgICAgICAgIC50aGVuKCAoe2RhdGF9KSA9PiB0aGlzLmZpbGVzID0gZGF0YSwgLy8gU3VjY2Vzc1xcbiAgICAgICAgICAgICAgICAgICAgLy9GYWlsXFxuICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC50eXBlPVxcXCJkYW5nZXJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC52aXNpYmxlPXRydWU7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0Lm1lc3NhZ2U9XFxcIlNvbWV0aGluZyB3ZW50IHdyb25nIGZldGNoaW5nIGZpbGVzLi4uXFxcIjtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBkZWxldGVGaWxlKGZpbGUsIGtleSkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZShcXFwiL2FwaS92MS9pbXBvcnRzL1xcXCIrZmlsZS5pZClcXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB0aGlzLmZpbGVzLnNwbGljZShrZXksIDEpLCAvLyBTdWNjZXNzXFxuICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHsvLyBGYWlsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC50eXBlPVxcXCJkYW5nZXJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQudmlzaWJsZT10cnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQubWVzc2FnZT1yZXNwb25zZS5ib2R5Lm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgc2hvd01vZGFsKGZpbGUpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGaWxlID0gZmlsZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SW1wb3J0TW9kYWwgPSB0cnVlO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgcG9zdFNhdmUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuc3RhdHVzVGV4dCA9IFxcXCJQcm9jZXNzaW5nLi4uXFxcIjtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvYXBpL3YxL2ltcG9ydHMvcHJvY2Vzcy8nK3RoaXMuYWN0aXZlRmlsZS5pZCwge1xcbiAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydC11cGRhdGUnOiB0aGlzLm1vZGFsLnVwZGF0ZSxcXG4gICAgICAgICAgICAgICAgICAgICdpbXBvcnQtdHlwZSc6IHRoaXMubW9kYWwuaW1wb3J0VHlwZVxcbiAgICAgICAgICAgICAgICB9KS50aGVuKCAocmVzcG9uc2UpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3NcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuc3RhdHVzVGV4dCA9IFxcXCJTdWNjZXNzLi4uIFJlZGlyZWN0aW5nLlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlLmJvZHkubWVzc2FnZXMucmVkaXJlY3RfdXJsO1xcbiAgICAgICAgICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vIEZhaWx1cmVcXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmJvZHkuc3RhdHVzID09ICdpbXBvcnQtZXJyb3JzJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0RXJyb3JzID0gcmVzcG9uc2UuYm9keS5tZXNzYWdlcztcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC5tZXNzYWdlPSByZXNwb25zZS5ib2R5Lm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQudHlwZT1cXFwiZGFuZ2VyXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0LnZpc2libGU9dHJ1ZTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUltcG9ydE1vZGFsPWZhbHNlO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICB9LFxcblxcbiAgICAgICAgY29tcHV0ZWQ6IHtcXG4gICAgICAgICAgICBwcm9ncmVzc1dpZHRoKCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcIndpZHRoOiBcXFwiK3RoaXMucHJvZ3Jlc3MuY3VycmVudFBlcmNlbnQqMTArJyUnO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBjb21wb25lbnRzOiB7XFxuICAgICAgICAgICAgbW9kYWwsXFxuICAgICAgICAgICAgZXJyb3JzOiByZXF1aXJlKCcuL2ltcG9ydGVyLWVycm9ycy52dWUnKSxcXG4gICAgICAgICAgICBhbGVydDogcmVxdWlyZSgnLi4vYWxlcnQudnVlJyksXFxuICAgICAgICAgICAgc2VsZWN0MjogcmVxdWlyZSgnLi4vc2VsZWN0Mi52dWUnKVxcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuPC9zY3JpcHQ+XFxuXCJdfV0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTUzMDFhMjM2JnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2ltcG9ydGVyL2ltcG9ydGVyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"importer-errors.vue\\\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZT8zYWQ2Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcblxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiXCIsXCJmaWxlXCI6XCJpbXBvcnRlci1lcnJvcnMudnVlXCJ9XSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNTY2N2MzMTImc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n.action-link[data-v-de0d0e4e] {\\\\n cursor: pointer;\\\\n}\\\\n.m-b-none[data-v-de0d0e4e] {\\\\n margin-bottom: 0;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"AuthorizedClients.vue?a99076c0\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\\\",\\\"file\\\":\\\"AuthorizedClients.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlPzA2NGIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjdGlvbi1saW5rW2RhdGEtdi1kZTBkMGU0ZV0ge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5tLWItbm9uZVtkYXRhLXYtZGUwZDBlNGVdIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIkF1dGhvcml6ZWRDbGllbnRzLnZ1ZT9hOTkwNzZjMFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBdXRob3JpemVkQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmdcXFwiPkF1dGhvcml6ZWQgQXBwbGljYXRpb25zPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRob3JpemVkIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+U2NvcGVzPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcInRva2VuIGluIHRva2Vuc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudCBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uY2xpZW50Lm5hbWUgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNjb3BlcyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XFxcInRva2VuLnNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uc2NvcGVzLmpvaW4oJywgJykgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXZva2UgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZva2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICB0b2tlbnM6IFtdXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBwcmVwYXJlQ29tcG9uZW50KCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogR2V0IGFsbCBvZiB0aGUgYXV0aG9yaXplZCB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC90b2tlbnMnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbnMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUmV2b2tlIHRoZSBnaXZlbiB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICByZXZva2UodG9rZW4pIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5kZWxldGUoJy9vYXV0aC90b2tlbnMvJyArIHRva2VuLmlkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbnMoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cIl19XSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZGUwZDBlNGUmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlXG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n.action-link[data-v-e9c80318] {\\\\n cursor: pointer;\\\\n}\\\\n.m-b-none[data-v-e9c80318] {\\\\n margin-bottom: 0;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"Clients.vue?35867ce4\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\\\",\\\"file\\\":\\\"Clients.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/ZjE0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LWU5YzgwMzE4XSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi1lOWM4MDMxOF0ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiQ2xpZW50cy52dWU/MzU4NjdjZTRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0EsZ0JBQUE7Q0FDQTtBQUVBO0lBQ0EsaUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XFxcImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgT0F1dGggQ2xpZW50c1xcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcInNob3dDcmVhdGVDbGllbnRGb3JtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IENsaWVudFxcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBDdXJyZW50IENsaWVudHMgLS0+XFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVxcXCJtLWItbm9uZVxcXCIgdi1pZj1cXFwiY2xpZW50cy5sZW5ndGggPT09IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgWW91IGhhdmUgbm90IGNyZWF0ZWQgYW55IE9BdXRoIGNsaWVudHMuXFxuICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVxcXCJ0YWJsZSB0YWJsZS1ib3JkZXJsZXNzIG0tYi1ub25lXFxcIiB2LWlmPVxcXCJjbGllbnRzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkNsaWVudCBJRDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNlY3JldDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImNsaWVudCBpbiBjbGllbnRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJRCAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjbGllbnQuaWQgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNsaWVudC5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VjcmV0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt7IGNsaWVudC5zZWNyZXQgfX08L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRWRpdCBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcImVkaXQoY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZSBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcImRlc3Ryb3koY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgIDwvdGFibGU+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1jcmVhdGUtY2xpZW50XFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgQ2xpZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtIEVycm9ycyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1kYW5nZXJcXFwiIHYtaWY9XFxcImNyZWF0ZUZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gY3JlYXRlRm9ybS5lcnJvcnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVycm9yIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBGb3JtIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVxcXCJmb3JtLWhvcml6b250YWxcXFwiIHJvbGU9XFxcImZvcm1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5OYW1lPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImNyZWF0ZS1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJzdG9yZVxcXCIgdi1tb2RlbD1cXFwiY3JlYXRlRm9ybS5uYW1lXFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aGluZyB5b3VyIHVzZXJzIHdpbGwgcmVjb2duaXplIGFuZCB0cnVzdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVkaXJlY3QgVVJMIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTMgY29udHJvbC1sYWJlbFxcXCI+UmVkaXJlY3QgVVJMPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwicmVkaXJlY3RcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBrZXl1cC5lbnRlcj1cXFwic3RvcmVcXFwiIHYtbW9kZWw9XFxcImNyZWF0ZUZvcm0ucmVkaXJlY3RcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91ciBhcHBsaWNhdGlvbidzIGF1dGhvcml6YXRpb24gY2FsbGJhY2sgVVJMLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTW9kYWwgQWN0aW9ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIGRhdGEtZGlzbWlzcz1cXFwibW9kYWxcXFwiPkNsb3NlPC9idXR0b24+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwic3RvcmVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBFZGl0IENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1lZGl0LWNsaWVudFxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBDbGllbnRcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZWRpdEZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gZWRpdEZvcm0uZXJyb3JzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlcnJvciB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVkaXQgQ2xpZW50IEZvcm0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XFxcImZvcm0taG9yaXpvbnRhbFxcXCIgcm9sZT1cXFwiZm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmFtZSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XFxcImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcXFwiPk5hbWU8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwiZWRpdC1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLm5hbWVcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZXRoaW5nIHlvdXIgdXNlcnMgd2lsbCByZWNvZ25pemUgYW5kIHRydXN0LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWRpcmVjdCBVUkwgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5SZWRpcmVjdCBVUkw8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuYW1lPVxcXCJyZWRpcmVjdFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLnJlZGlyZWN0XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdXIgYXBwbGljYXRpb24ncyBhdXRob3JpemF0aW9uIGNhbGxiYWNrIFVSTC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInVwZGF0ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgQ2hhbmdlc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvdGVtcGxhdGU+XFxuXFxuPHNjcmlwdD5cXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGNsaWVudHM6IFtdLFxcblxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb3JtOiB7XFxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogJydcXG4gICAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAgICAgZWRpdEZvcm06IHtcXG4gICAgICAgICAgICAgICAgICAgIGVycm9yczogW10sXFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyxcXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnJ1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLWNsaWVudCcpLm9uKCdzaG93bi5icy5tb2RhbCcsICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGUtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50Jykub24oJ3Nob3duLmJzLm1vZGFsJywgKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgJCgnI2VkaXQtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIE9BdXRoIGNsaWVudHMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldENsaWVudHMoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZ2V0KCcvb2F1dGgvY2xpZW50cycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZm9ybSBmb3IgY3JlYXRpbmcgbmV3IGNsaWVudHMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgc2hvd0NyZWF0ZUNsaWVudEZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIENyZWF0ZSBhIG5ldyBPQXV0aCBjbGllbnQgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHN0b3JlKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RDbGllbnQoXFxuICAgICAgICAgICAgICAgICAgICAncG9zdCcsICcvb2F1dGgvY2xpZW50cycsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm0sICcjbW9kYWwtY3JlYXRlLWNsaWVudCdcXG4gICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEVkaXQgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBlZGl0KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLmlkID0gY2xpZW50LmlkO1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLm5hbWUgPSBjbGllbnQubmFtZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5yZWRpcmVjdCA9IGNsaWVudC5yZWRpcmVjdDtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgY2xpZW50IGJlaW5nIGVkaXRlZC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB1cGRhdGUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdENsaWVudChcXG4gICAgICAgICAgICAgICAgICAgICdwdXQnLCAnL29hdXRoL2NsaWVudHMvJyArIHRoaXMuZWRpdEZvcm0uaWQsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLCAnI21vZGFsLWVkaXQtY2xpZW50J1xcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUGVyc2lzdCB0aGUgY2xpZW50IHRvIHN0b3JhZ2UgdXNpbmcgdGhlIGdpdmVuIGZvcm0uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcGVyc2lzdENsaWVudChtZXRob2QsIHVyaSwgZm9ybSwgbW9kYWwpIHtcXG4gICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cFttZXRob2RdKHVyaSwgZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsaWVudHMoKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLm5hbWUgPSAnJztcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlZGlyZWN0ID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAkKG1vZGFsKS5tb2RhbCgnaGlkZScpO1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5kYXRhID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmVycm9ycyA9IF8uZmxhdHRlbihfLnRvQXJyYXkocmVzcG9uc2UuZGF0YSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZXJyb3JzID0gWydTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERlc3Ryb3kgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBkZXN0cm95KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZSgnL29hdXRoL2NsaWVudHMvJyArIGNsaWVudC5pZClcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXX1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1lOWM4MDMxOCZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9wYXNzcG9ydC9DbGllbnRzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"select2.vue\\\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvc2VsZWN0Mi52dWU/MTkwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwic2VsZWN0Mi52dWVcIn1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZjU2NGE4NiZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9zZWxlY3QyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {\\n\\tif ( true ) {\\n\\n\\t\\t// AMD. Register as an anonymous module.\\n\\t\\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\t} else {\\n\\n\\t\\t// Browser globals\\n\\t\\tfactory( jQuery );\\n\\t}\\n} ( function( $ ) {\\n\\n$.ui = $.ui || {};\\n\\nreturn $.ui.version = \\\"1.12.1\\\";\\n\\n} ) );\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzP2JkNDEiXSwic291cmNlc0NvbnRlbnQiOlsiKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSAoIGZ1bmN0aW9uKCAkICkge1xuXG4kLnVpID0gJC51aSB8fCB7fTtcblxucmV0dXJuICQudWkudmVyc2lvbiA9IFwiMS4xMi4xXCI7XG5cbn0gKSApO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\\n * jQuery UI Widget 1.12.1\\n * http://jqueryui.com\\n *\\n * Copyright jQuery Foundation and other contributors\\n * Released under the MIT license.\\n * http://jquery.org/license\\n */\\n\\n//>>label: Widget\\n//>>group: Core\\n//>>description: Provides a factory for creating stateful widgets with a common API.\\n//>>docs: http://api.jqueryui.com/jQuery.widget/\\n//>>demos: http://jqueryui.com/widget/\\n\\n( function( factory ) {\\n\\tif ( true ) {\\n\\n\\t\\t// AMD. Register as an anonymous module.\\n\\t\\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3), __webpack_require__(26) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\t} else {\\n\\n\\t\\t// Browser globals\\n\\t\\tfactory( jQuery );\\n\\t}\\n}( function( $ ) {\\n\\nvar widgetUuid = 0;\\nvar widgetSlice = Array.prototype.slice;\\n\\n$.cleanData = ( function( orig ) {\\n\\treturn function( elems ) {\\n\\t\\tvar events, elem, i;\\n\\t\\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\\n\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t// Only trigger remove when necessary to save time\\n\\t\\t\\t\\tevents = $._data( elem, \\\"events\\\" );\\n\\t\\t\\t\\tif ( events && events.remove ) {\\n\\t\\t\\t\\t\\t$( elem ).triggerHandler( \\\"remove\\\" );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Http://bugs.jquery.com/ticket/8235\\n\\t\\t\\t} catch ( e ) {}\\n\\t\\t}\\n\\t\\torig( elems );\\n\\t};\\n} )( $.cleanData );\\n\\n$.widget = function( name, base, prototype ) {\\n\\tvar existingConstructor, constructor, basePrototype;\\n\\n\\t// ProxiedPrototype allows the provided prototype to remain unmodified\\n\\t// so that it can be used as a mixin for multiple widgets (#8876)\\n\\tvar proxiedPrototype = {};\\n\\n\\tvar namespace = name.split( \\\".\\\" )[ 0 ];\\n\\tname = name.split( \\\".\\\" )[ 1 ];\\n\\tvar fullName = namespace + \\\"-\\\" + name;\\n\\n\\tif ( !prototype ) {\\n\\t\\tprototype = base;\\n\\t\\tbase = $.Widget;\\n\\t}\\n\\n\\tif ( $.isArray( prototype ) ) {\\n\\t\\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\\n\\t}\\n\\n\\t// Create selector for plugin\\n\\t$.expr[ \\\":\\\" ][ fullName.toLowerCase() ] = function( elem ) {\\n\\t\\treturn !!$.data( elem, fullName );\\n\\t};\\n\\n\\t$[ namespace ] = $[ namespace ] || {};\\n\\texistingConstructor = $[ namespace ][ name ];\\n\\tconstructor = $[ namespace ][ name ] = function( options, element ) {\\n\\n\\t\\t// Allow instantiation without \\\"new\\\" keyword\\n\\t\\tif ( !this._createWidget ) {\\n\\t\\t\\treturn new constructor( options, element );\\n\\t\\t}\\n\\n\\t\\t// Allow instantiation without initializing for simple inheritance\\n\\t\\t// must use \\\"new\\\" keyword (the code above always passes args)\\n\\t\\tif ( arguments.length ) {\\n\\t\\t\\tthis._createWidget( options, element );\\n\\t\\t}\\n\\t};\\n\\n\\t// Extend with the existing constructor to carry over any static properties\\n\\t$.extend( constructor, existingConstructor, {\\n\\t\\tversion: prototype.version,\\n\\n\\t\\t// Copy the object used to create the prototype in case we need to\\n\\t\\t// redefine the widget later\\n\\t\\t_proto: $.extend( {}, prototype ),\\n\\n\\t\\t// Track widgets that inherit from this widget in case this widget is\\n\\t\\t// redefined after a widget inherits from it\\n\\t\\t_childConstructors: []\\n\\t} );\\n\\n\\tbasePrototype = new base();\\n\\n\\t// We need to make the options hash a property directly on the new instance\\n\\t// otherwise we'll modify the options hash on the prototype that we're\\n\\t// inheriting from\\n\\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\\n\\t$.each( prototype, function( prop, value ) {\\n\\t\\tif ( !$.isFunction( value ) ) {\\n\\t\\t\\tproxiedPrototype[ prop ] = value;\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tproxiedPrototype[ prop ] = ( function() {\\n\\t\\t\\tfunction _super() {\\n\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\tfunction _superApply( args ) {\\n\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, args );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn function() {\\n\\t\\t\\t\\tvar __super = this._super;\\n\\t\\t\\t\\tvar __superApply = this._superApply;\\n\\t\\t\\t\\tvar returnValue;\\n\\n\\t\\t\\t\\tthis._super = _super;\\n\\t\\t\\t\\tthis._superApply = _superApply;\\n\\n\\t\\t\\t\\treturnValue = value.apply( this, arguments );\\n\\n\\t\\t\\t\\tthis._super = __super;\\n\\t\\t\\t\\tthis._superApply = __superApply;\\n\\n\\t\\t\\t\\treturn returnValue;\\n\\t\\t\\t};\\n\\t\\t} )();\\n\\t} );\\n\\tconstructor.prototype = $.widget.extend( basePrototype, {\\n\\n\\t\\t// TODO: remove support for widgetEventPrefix\\n\\t\\t// always use the name + a colon as the prefix, e.g., draggable:start\\n\\t\\t// don't prefix for widgets that aren't DOM-based\\n\\t\\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\\n\\t}, proxiedPrototype, {\\n\\t\\tconstructor: constructor,\\n\\t\\tnamespace: namespace,\\n\\t\\twidgetName: name,\\n\\t\\twidgetFullName: fullName\\n\\t} );\\n\\n\\t// If this widget is being redefined then we need to find all widgets that\\n\\t// are inheriting from it and redefine all of them so that they inherit from\\n\\t// the new version of this widget. We're essentially trying to replace one\\n\\t// level in the prototype chain.\\n\\tif ( existingConstructor ) {\\n\\t\\t$.each( existingConstructor._childConstructors, function( i, child ) {\\n\\t\\t\\tvar childPrototype = child.prototype;\\n\\n\\t\\t\\t// Redefine the child widget using the same prototype that was\\n\\t\\t\\t// originally used, but inherit from the new version of the base\\n\\t\\t\\t$.widget( childPrototype.namespace + \\\".\\\" + childPrototype.widgetName, constructor,\\n\\t\\t\\t\\tchild._proto );\\n\\t\\t} );\\n\\n\\t\\t// Remove the list of existing child constructors from the old constructor\\n\\t\\t// so the old child constructors can be garbage collected\\n\\t\\tdelete existingConstructor._childConstructors;\\n\\t} else {\\n\\t\\tbase._childConstructors.push( constructor );\\n\\t}\\n\\n\\t$.widget.bridge( name, constructor );\\n\\n\\treturn constructor;\\n};\\n\\n$.widget.extend = function( target ) {\\n\\tvar input = widgetSlice.call( arguments, 1 );\\n\\tvar inputIndex = 0;\\n\\tvar inputLength = input.length;\\n\\tvar key;\\n\\tvar value;\\n\\n\\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\\n\\t\\tfor ( key in input[ inputIndex ] ) {\\n\\t\\t\\tvalue = input[ inputIndex ][ key ];\\n\\t\\t\\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\\n\\n\\t\\t\\t\\t// Clone objects\\n\\t\\t\\t\\tif ( $.isPlainObject( value ) ) {\\n\\t\\t\\t\\t\\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, target[ key ], value ) :\\n\\n\\t\\t\\t\\t\\t\\t// Don't extend strings, arrays, etc. with objects\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, value );\\n\\n\\t\\t\\t\\t// Copy everything else by reference\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttarget[ key ] = value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn target;\\n};\\n\\n$.widget.bridge = function( name, object ) {\\n\\tvar fullName = object.prototype.widgetFullName || name;\\n\\t$.fn[ name ] = function( options ) {\\n\\t\\tvar isMethodCall = typeof options === \\\"string\\\";\\n\\t\\tvar args = widgetSlice.call( arguments, 1 );\\n\\t\\tvar returnValue = this;\\n\\n\\t\\tif ( isMethodCall ) {\\n\\n\\t\\t\\t// If this is an empty collection, we need to have the instance method\\n\\t\\t\\t// return undefined instead of the jQuery instance\\n\\t\\t\\tif ( !this.length && options === \\\"instance\\\" ) {\\n\\t\\t\\t\\treturnValue = undefined;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\t\\tvar methodValue;\\n\\t\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\n\\t\\t\\t\\t\\tif ( options === \\\"instance\\\" ) {\\n\\t\\t\\t\\t\\t\\treturnValue = instance;\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif ( !instance ) {\\n\\t\\t\\t\\t\\t\\treturn $.error( \\\"cannot call methods on \\\" + name +\\n\\t\\t\\t\\t\\t\\t\\t\\\" prior to initialization; \\\" +\\n\\t\\t\\t\\t\\t\\t\\t\\\"attempted to call method '\\\" + options + \\\"'\\\" );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \\\"_\\\" ) {\\n\\t\\t\\t\\t\\t\\treturn $.error( \\\"no such method '\\\" + options + \\\"' for \\\" + name +\\n\\t\\t\\t\\t\\t\\t\\t\\\" widget instance\\\" );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tmethodValue = instance[ options ].apply( instance, args );\\n\\n\\t\\t\\t\\t\\tif ( methodValue !== instance && methodValue !== undefined ) {\\n\\t\\t\\t\\t\\t\\treturnValue = methodValue && methodValue.jquery ?\\n\\t\\t\\t\\t\\t\\t\\treturnValue.pushStack( methodValue.get() ) :\\n\\t\\t\\t\\t\\t\\t\\tmethodValue;\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// Allow multiple hashes to be passed on init\\n\\t\\t\\tif ( args.length ) {\\n\\t\\t\\t\\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\\n\\t\\t\\t}\\n\\n\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\t\\t\\t\\tif ( instance ) {\\n\\t\\t\\t\\t\\tinstance.option( options || {} );\\n\\t\\t\\t\\t\\tif ( instance._init ) {\\n\\t\\t\\t\\t\\t\\tinstance._init();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t$.data( this, fullName, new object( options, this ) );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn returnValue;\\n\\t};\\n};\\n\\n$.Widget = function( /* options, element */ ) {};\\n$.Widget._childConstructors = [];\\n\\n$.Widget.prototype = {\\n\\twidgetName: \\\"widget\\\",\\n\\twidgetEventPrefix: \\\"\\\",\\n\\tdefaultElement: \\\"
\\\",\\n\\n\\toptions: {\\n\\t\\tclasses: {},\\n\\t\\tdisabled: false,\\n\\n\\t\\t// Callbacks\\n\\t\\tcreate: null\\n\\t},\\n\\n\\t_createWidget: function( options, element ) {\\n\\t\\telement = $( element || this.defaultElement || this )[ 0 ];\\n\\t\\tthis.element = $( element );\\n\\t\\tthis.uuid = widgetUuid++;\\n\\t\\tthis.eventNamespace = \\\".\\\" + this.widgetName + this.uuid;\\n\\n\\t\\tthis.bindings = $();\\n\\t\\tthis.hoverable = $();\\n\\t\\tthis.focusable = $();\\n\\t\\tthis.classesElementLookup = {};\\n\\n\\t\\tif ( element !== this ) {\\n\\t\\t\\t$.data( element, this.widgetFullName, this );\\n\\t\\t\\tthis._on( true, this.element, {\\n\\t\\t\\t\\tremove: function( event ) {\\n\\t\\t\\t\\t\\tif ( event.target === element ) {\\n\\t\\t\\t\\t\\t\\tthis.destroy();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t\\tthis.document = $( element.style ?\\n\\n\\t\\t\\t\\t// Element within the document\\n\\t\\t\\t\\telement.ownerDocument :\\n\\n\\t\\t\\t\\t// Element is window or document\\n\\t\\t\\t\\telement.document || element );\\n\\t\\t\\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\\n\\t\\t}\\n\\n\\t\\tthis.options = $.widget.extend( {},\\n\\t\\t\\tthis.options,\\n\\t\\t\\tthis._getCreateOptions(),\\n\\t\\t\\toptions );\\n\\n\\t\\tthis._create();\\n\\n\\t\\tif ( this.options.disabled ) {\\n\\t\\t\\tthis._setOptionDisabled( this.options.disabled );\\n\\t\\t}\\n\\n\\t\\tthis._trigger( \\\"create\\\", null, this._getCreateEventData() );\\n\\t\\tthis._init();\\n\\t},\\n\\n\\t_getCreateOptions: function() {\\n\\t\\treturn {};\\n\\t},\\n\\n\\t_getCreateEventData: $.noop,\\n\\n\\t_create: $.noop,\\n\\n\\t_init: $.noop,\\n\\n\\tdestroy: function() {\\n\\t\\tvar that = this;\\n\\n\\t\\tthis._destroy();\\n\\t\\t$.each( this.classesElementLookup, function( key, value ) {\\n\\t\\t\\tthat._removeClass( value, key );\\n\\t\\t} );\\n\\n\\t\\t// We can probably remove the unbind calls in 2.0\\n\\t\\t// all event bindings should go through this._on()\\n\\t\\tthis.element\\n\\t\\t\\t.off( this.eventNamespace )\\n\\t\\t\\t.removeData( this.widgetFullName );\\n\\t\\tthis.widget()\\n\\t\\t\\t.off( this.eventNamespace )\\n\\t\\t\\t.removeAttr( \\\"aria-disabled\\\" );\\n\\n\\t\\t// Clean up events and states\\n\\t\\tthis.bindings.off( this.eventNamespace );\\n\\t},\\n\\n\\t_destroy: $.noop,\\n\\n\\twidget: function() {\\n\\t\\treturn this.element;\\n\\t},\\n\\n\\toption: function( key, value ) {\\n\\t\\tvar options = key;\\n\\t\\tvar parts;\\n\\t\\tvar curOption;\\n\\t\\tvar i;\\n\\n\\t\\tif ( arguments.length === 0 ) {\\n\\n\\t\\t\\t// Don't return a reference to the internal hash\\n\\t\\t\\treturn $.widget.extend( {}, this.options );\\n\\t\\t}\\n\\n\\t\\tif ( typeof key === \\\"string\\\" ) {\\n\\n\\t\\t\\t// Handle nested keys, e.g., \\\"foo.bar\\\" => { foo: { bar: ___ } }\\n\\t\\t\\toptions = {};\\n\\t\\t\\tparts = key.split( \\\".\\\" );\\n\\t\\t\\tkey = parts.shift();\\n\\t\\t\\tif ( parts.length ) {\\n\\t\\t\\t\\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\\n\\t\\t\\t\\tfor ( i = 0; i < parts.length - 1; i++ ) {\\n\\t\\t\\t\\t\\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\\n\\t\\t\\t\\t\\tcurOption = curOption[ parts[ i ] ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tkey = parts.pop();\\n\\t\\t\\t\\tif ( arguments.length === 1 ) {\\n\\t\\t\\t\\t\\treturn curOption[ key ] === undefined ? null : curOption[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcurOption[ key ] = value;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif ( arguments.length === 1 ) {\\n\\t\\t\\t\\t\\treturn this.options[ key ] === undefined ? null : this.options[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\toptions[ key ] = value;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._setOptions( options );\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOptions: function( options ) {\\n\\t\\tvar key;\\n\\n\\t\\tfor ( key in options ) {\\n\\t\\t\\tthis._setOption( key, options[ key ] );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOption: function( key, value ) {\\n\\t\\tif ( key === \\\"classes\\\" ) {\\n\\t\\t\\tthis._setOptionClasses( value );\\n\\t\\t}\\n\\n\\t\\tthis.options[ key ] = value;\\n\\n\\t\\tif ( key === \\\"disabled\\\" ) {\\n\\t\\t\\tthis._setOptionDisabled( value );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOptionClasses: function( value ) {\\n\\t\\tvar classKey, elements, currentElements;\\n\\n\\t\\tfor ( classKey in value ) {\\n\\t\\t\\tcurrentElements = this.classesElementLookup[ classKey ];\\n\\t\\t\\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\\n\\t\\t\\t\\t\\t!currentElements ||\\n\\t\\t\\t\\t\\t!currentElements.length ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// We are doing this to create a new jQuery object because the _removeClass() call\\n\\t\\t\\t// on the next line is going to destroy the reference to the current elements being\\n\\t\\t\\t// tracked. We need to save a copy of this collection so that we can add the new classes\\n\\t\\t\\t// below.\\n\\t\\t\\telements = $( currentElements.get() );\\n\\t\\t\\tthis._removeClass( currentElements, classKey );\\n\\n\\t\\t\\t// We don't use _addClass() here, because that uses this.options.classes\\n\\t\\t\\t// for generating the string of classes. We want to use the value passed in from\\n\\t\\t\\t// _setOption(), this is the new value of the classes option which was passed to\\n\\t\\t\\t// _setOption(). We pass this value directly to _classes().\\n\\t\\t\\telements.addClass( this._classes( {\\n\\t\\t\\t\\telement: elements,\\n\\t\\t\\t\\tkeys: classKey,\\n\\t\\t\\t\\tclasses: value,\\n\\t\\t\\t\\tadd: true\\n\\t\\t\\t} ) );\\n\\t\\t}\\n\\t},\\n\\n\\t_setOptionDisabled: function( value ) {\\n\\t\\tthis._toggleClass( this.widget(), this.widgetFullName + \\\"-disabled\\\", null, !!value );\\n\\n\\t\\t// If the widget is becoming disabled, then nothing is interactive\\n\\t\\tif ( value ) {\\n\\t\\t\\tthis._removeClass( this.hoverable, null, \\\"ui-state-hover\\\" );\\n\\t\\t\\tthis._removeClass( this.focusable, null, \\\"ui-state-focus\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tenable: function() {\\n\\t\\treturn this._setOptions( { disabled: false } );\\n\\t},\\n\\n\\tdisable: function() {\\n\\t\\treturn this._setOptions( { disabled: true } );\\n\\t},\\n\\n\\t_classes: function( options ) {\\n\\t\\tvar full = [];\\n\\t\\tvar that = this;\\n\\n\\t\\toptions = $.extend( {\\n\\t\\t\\telement: this.element,\\n\\t\\t\\tclasses: this.options.classes || {}\\n\\t\\t}, options );\\n\\n\\t\\tfunction processClassString( classes, checkOption ) {\\n\\t\\t\\tvar current, i;\\n\\t\\t\\tfor ( i = 0; i < classes.length; i++ ) {\\n\\t\\t\\t\\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\\n\\t\\t\\t\\tif ( options.add ) {\\n\\t\\t\\t\\t\\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcurrent = $( current.not( options.element ).get() );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tthat.classesElementLookup[ classes[ i ] ] = current;\\n\\t\\t\\t\\tfull.push( classes[ i ] );\\n\\t\\t\\t\\tif ( checkOption && options.classes[ classes[ i ] ] ) {\\n\\t\\t\\t\\t\\tfull.push( options.classes[ classes[ i ] ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._on( options.element, {\\n\\t\\t\\t\\\"remove\\\": \\\"_untrackClassesElement\\\"\\n\\t\\t} );\\n\\n\\t\\tif ( options.keys ) {\\n\\t\\t\\tprocessClassString( options.keys.match( /\\\\S+/g ) || [], true );\\n\\t\\t}\\n\\t\\tif ( options.extra ) {\\n\\t\\t\\tprocessClassString( options.extra.match( /\\\\S+/g ) || [] );\\n\\t\\t}\\n\\n\\t\\treturn full.join( \\\" \\\" );\\n\\t},\\n\\n\\t_untrackClassesElement: function( event ) {\\n\\t\\tvar that = this;\\n\\t\\t$.each( that.classesElementLookup, function( key, value ) {\\n\\t\\t\\tif ( $.inArray( event.target, value ) !== -1 ) {\\n\\t\\t\\t\\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_removeClass: function( element, keys, extra ) {\\n\\t\\treturn this._toggleClass( element, keys, extra, false );\\n\\t},\\n\\n\\t_addClass: function( element, keys, extra ) {\\n\\t\\treturn this._toggleClass( element, keys, extra, true );\\n\\t},\\n\\n\\t_toggleClass: function( element, keys, extra, add ) {\\n\\t\\tadd = ( typeof add === \\\"boolean\\\" ) ? add : extra;\\n\\t\\tvar shift = ( typeof element === \\\"string\\\" || element === null ),\\n\\t\\t\\toptions = {\\n\\t\\t\\t\\textra: shift ? keys : extra,\\n\\t\\t\\t\\tkeys: shift ? element : keys,\\n\\t\\t\\t\\telement: shift ? this.element : element,\\n\\t\\t\\t\\tadd: add\\n\\t\\t\\t};\\n\\t\\toptions.element.toggleClass( this._classes( options ), add );\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_on: function( suppressDisabledCheck, element, handlers ) {\\n\\t\\tvar delegateElement;\\n\\t\\tvar instance = this;\\n\\n\\t\\t// No suppressDisabledCheck flag, shuffle arguments\\n\\t\\tif ( typeof suppressDisabledCheck !== \\\"boolean\\\" ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = suppressDisabledCheck;\\n\\t\\t\\tsuppressDisabledCheck = false;\\n\\t\\t}\\n\\n\\t\\t// No element argument, shuffle and use this.element\\n\\t\\tif ( !handlers ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = this.element;\\n\\t\\t\\tdelegateElement = this.widget();\\n\\t\\t} else {\\n\\t\\t\\telement = delegateElement = $( element );\\n\\t\\t\\tthis.bindings = this.bindings.add( element );\\n\\t\\t}\\n\\n\\t\\t$.each( handlers, function( event, handler ) {\\n\\t\\t\\tfunction handlerProxy() {\\n\\n\\t\\t\\t\\t// Allow widgets to customize the disabled handling\\n\\t\\t\\t\\t// - disabled as an array instead of boolean\\n\\t\\t\\t\\t// - disabled class as method for disabling individual parts\\n\\t\\t\\t\\tif ( !suppressDisabledCheck &&\\n\\t\\t\\t\\t\\t\\t( instance.options.disabled === true ||\\n\\t\\t\\t\\t\\t\\t$( this ).hasClass( \\\"ui-state-disabled\\\" ) ) ) {\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Copy the guid so direct unbinding works\\n\\t\\t\\tif ( typeof handler !== \\\"string\\\" ) {\\n\\t\\t\\t\\thandlerProxy.guid = handler.guid =\\n\\t\\t\\t\\t\\thandler.guid || handlerProxy.guid || $.guid++;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvar match = event.match( /^([\\\\w:-]*)\\\\s*(.*)$/ );\\n\\t\\t\\tvar eventName = match[ 1 ] + instance.eventNamespace;\\n\\t\\t\\tvar selector = match[ 2 ];\\n\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\tdelegateElement.on( eventName, selector, handlerProxy );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\telement.on( eventName, handlerProxy );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_off: function( element, eventName ) {\\n\\t\\teventName = ( eventName || \\\"\\\" ).split( \\\" \\\" ).join( this.eventNamespace + \\\" \\\" ) +\\n\\t\\t\\tthis.eventNamespace;\\n\\t\\telement.off( eventName ).off( eventName );\\n\\n\\t\\t// Clear the stack to avoid memory leaks (#10056)\\n\\t\\tthis.bindings = $( this.bindings.not( element ).get() );\\n\\t\\tthis.focusable = $( this.focusable.not( element ).get() );\\n\\t\\tthis.hoverable = $( this.hoverable.not( element ).get() );\\n\\t},\\n\\n\\t_delay: function( handler, delay ) {\\n\\t\\tfunction handlerProxy() {\\n\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t}\\n\\t\\tvar instance = this;\\n\\t\\treturn setTimeout( handlerProxy, delay || 0 );\\n\\t},\\n\\n\\t_hoverable: function( element ) {\\n\\t\\tthis.hoverable = this.hoverable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tmouseenter: function( event ) {\\n\\t\\t\\t\\tthis._addClass( $( event.currentTarget ), null, \\\"ui-state-hover\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tmouseleave: function( event ) {\\n\\t\\t\\t\\tthis._removeClass( $( event.currentTarget ), null, \\\"ui-state-hover\\\" );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_focusable: function( element ) {\\n\\t\\tthis.focusable = this.focusable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tfocusin: function( event ) {\\n\\t\\t\\t\\tthis._addClass( $( event.currentTarget ), null, \\\"ui-state-focus\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tfocusout: function( event ) {\\n\\t\\t\\t\\tthis._removeClass( $( event.currentTarget ), null, \\\"ui-state-focus\\\" );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_trigger: function( type, event, data ) {\\n\\t\\tvar prop, orig;\\n\\t\\tvar callback = this.options[ type ];\\n\\n\\t\\tdata = data || {};\\n\\t\\tevent = $.Event( event );\\n\\t\\tevent.type = ( type === this.widgetEventPrefix ?\\n\\t\\t\\ttype :\\n\\t\\t\\tthis.widgetEventPrefix + type ).toLowerCase();\\n\\n\\t\\t// The original event may come from any element\\n\\t\\t// so we need to reset the target on the new event\\n\\t\\tevent.target = this.element[ 0 ];\\n\\n\\t\\t// Copy original event properties over to the new event\\n\\t\\torig = event.originalEvent;\\n\\t\\tif ( orig ) {\\n\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\tif ( !( prop in event ) ) {\\n\\t\\t\\t\\t\\tevent[ prop ] = orig[ prop ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis.element.trigger( event, data );\\n\\t\\treturn !( $.isFunction( callback ) &&\\n\\t\\t\\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\\n\\t\\t\\tevent.isDefaultPrevented() );\\n\\t}\\n};\\n\\n$.each( { show: \\\"fadeIn\\\", hide: \\\"fadeOut\\\" }, function( method, defaultEffect ) {\\n\\t$.Widget.prototype[ \\\"_\\\" + method ] = function( element, options, callback ) {\\n\\t\\tif ( typeof options === \\\"string\\\" ) {\\n\\t\\t\\toptions = { effect: options };\\n\\t\\t}\\n\\n\\t\\tvar hasOptions;\\n\\t\\tvar effectName = !options ?\\n\\t\\t\\tmethod :\\n\\t\\t\\toptions === true || typeof options === \\\"number\\\" ?\\n\\t\\t\\t\\tdefaultEffect :\\n\\t\\t\\t\\toptions.effect || defaultEffect;\\n\\n\\t\\toptions = options || {};\\n\\t\\tif ( typeof options === \\\"number\\\" ) {\\n\\t\\t\\toptions = { duration: options };\\n\\t\\t}\\n\\n\\t\\thasOptions = !$.isEmptyObject( options );\\n\\t\\toptions.complete = callback;\\n\\n\\t\\tif ( options.delay ) {\\n\\t\\t\\telement.delay( options.delay );\\n\\t\\t}\\n\\n\\t\\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\\n\\t\\t\\telement[ method ]( options );\\n\\t\\t} else if ( effectName !== method && element[ effectName ] ) {\\n\\t\\t\\telement[ effectName ]( options.duration, options.easing, callback );\\n\\t\\t} else {\\n\\t\\t\\telement.queue( function( next ) {\\n\\t\\t\\t\\t$( this )[ method ]();\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback.call( element[ 0 ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnext();\\n\\t\\t\\t} );\\n\\t\\t}\\n\\t};\\n} );\\n\\nreturn $.widget;\\n\\n} ) );\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS93aWRnZXQuanM/NDliZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMi4xXG4gKiBodHRwOi8vanF1ZXJ5dWkuY29tXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqL1xuXG4vLz4+bGFiZWw6IFdpZGdldFxuLy8+Pmdyb3VwOiBDb3JlXG4vLz4+ZGVzY3JpcHRpb246IFByb3ZpZGVzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgc3RhdGVmdWwgd2lkZ2V0cyB3aXRoIGEgY29tbW9uIEFQSS5cbi8vPj5kb2NzOiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9qUXVlcnkud2lkZ2V0L1xuLy8+PmRlbW9zOiBodHRwOi8vanF1ZXJ5dWkuY29tL3dpZGdldC9cblxuKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiwgXCIuL3ZlcnNpb25cIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSggZnVuY3Rpb24oICQgKSB7XG5cbnZhciB3aWRnZXRVdWlkID0gMDtcbnZhciB3aWRnZXRTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuJC5jbGVhbkRhdGEgPSAoIGZ1bmN0aW9uKCBvcmlnICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBldmVudHMsIGVsZW0sIGk7XG5cdFx0Zm9yICggaSA9IDA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdC8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lXG5cdFx0XHRcdGV2ZW50cyA9ICQuX2RhdGEoIGVsZW0sIFwiZXZlbnRzXCIgKTtcblx0XHRcdFx0aWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHtcblx0XHRcdFx0XHQkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoIFwicmVtb3ZlXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIdHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0fVxuXHRcdG9yaWcoIGVsZW1zICk7XG5cdH07XG59ICkoICQuY2xlYW5EYXRhICk7XG5cbiQud2lkZ2V0ID0gZnVuY3Rpb24oIG5hbWUsIGJhc2UsIHByb3RvdHlwZSApIHtcblx0dmFyIGV4aXN0aW5nQ29uc3RydWN0b3IsIGNvbnN0cnVjdG9yLCBiYXNlUHJvdG90eXBlO1xuXG5cdC8vIFByb3hpZWRQcm90b3R5cGUgYWxsb3dzIHRoZSBwcm92aWRlZCBwcm90b3R5cGUgdG8gcmVtYWluIHVubW9kaWZpZWRcblx0Ly8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3Nilcblx0dmFyIHByb3hpZWRQcm90b3R5cGUgPSB7fTtcblxuXHR2YXIgbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMCBdO1xuXHRuYW1lID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMSBdO1xuXHR2YXIgZnVsbE5hbWUgPSBuYW1lc3BhY2UgKyBcIi1cIiArIG5hbWU7XG5cblx0aWYgKCAhcHJvdG90eXBlICkge1xuXHRcdHByb3RvdHlwZSA9IGJhc2U7XG5cdFx0YmFzZSA9ICQuV2lkZ2V0O1xuXHR9XG5cblx0aWYgKCAkLmlzQXJyYXkoIHByb3RvdHlwZSApICkge1xuXHRcdHByb3RvdHlwZSA9ICQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIHt9IF0uY29uY2F0KCBwcm90b3R5cGUgKSApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW5cblx0JC5leHByWyBcIjpcIiBdWyBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpIF0gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gISEkLmRhdGEoIGVsZW0sIGZ1bGxOYW1lICk7XG5cdH07XG5cblx0JFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTtcblx0ZXhpc3RpbmdDb25zdHJ1Y3RvciA9ICRbIG5hbWVzcGFjZSBdWyBuYW1lIF07XG5cdGNvbnN0cnVjdG9yID0gJFsgbmFtZXNwYWNlIF1bIG5hbWUgXSA9IGZ1bmN0aW9uKCBvcHRpb25zLCBlbGVtZW50ICkge1xuXG5cdFx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IFwibmV3XCIga2V5d29yZFxuXHRcdGlmICggIXRoaXMuX2NyZWF0ZVdpZGdldCApIHtcblx0XHRcdHJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGZvciBzaW1wbGUgaW5oZXJpdGFuY2Vcblx0XHQvLyBtdXN0IHVzZSBcIm5ld1wiIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncylcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLl9jcmVhdGVXaWRnZXQoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cdH07XG5cblx0Ly8gRXh0ZW5kIHdpdGggdGhlIGV4aXN0aW5nIGNvbnN0cnVjdG9yIHRvIGNhcnJ5IG92ZXIgYW55IHN0YXRpYyBwcm9wZXJ0aWVzXG5cdCQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3Rvciwge1xuXHRcdHZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLFxuXG5cdFx0Ly8gQ29weSB0aGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBwcm90b3R5cGUgaW4gY2FzZSB3ZSBuZWVkIHRvXG5cdFx0Ly8gcmVkZWZpbmUgdGhlIHdpZGdldCBsYXRlclxuXHRcdF9wcm90bzogJC5leHRlbmQoIHt9LCBwcm90b3R5cGUgKSxcblxuXHRcdC8vIFRyYWNrIHdpZGdldHMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyB3aWRnZXQgaW4gY2FzZSB0aGlzIHdpZGdldCBpc1xuXHRcdC8vIHJlZGVmaW5lZCBhZnRlciBhIHdpZGdldCBpbmhlcml0cyBmcm9tIGl0XG5cdFx0X2NoaWxkQ29uc3RydWN0b3JzOiBbXVxuXHR9ICk7XG5cblx0YmFzZVByb3RvdHlwZSA9IG5ldyBiYXNlKCk7XG5cblx0Ly8gV2UgbmVlZCB0byBtYWtlIHRoZSBvcHRpb25zIGhhc2ggYSBwcm9wZXJ0eSBkaXJlY3RseSBvbiB0aGUgbmV3IGluc3RhbmNlXG5cdC8vIG90aGVyd2lzZSB3ZSdsbCBtb2RpZnkgdGhlIG9wdGlvbnMgaGFzaCBvbiB0aGUgcHJvdG90eXBlIHRoYXQgd2UncmVcblx0Ly8gaW5oZXJpdGluZyBmcm9tXG5cdGJhc2VQcm90b3R5cGUub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sIGJhc2VQcm90b3R5cGUub3B0aW9ucyApO1xuXHQkLmVhY2goIHByb3RvdHlwZSwgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdGlmICggISQuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHByb3hpZWRQcm90b3R5cGVbIHByb3AgXSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZnVuY3Rpb24gX3N1cGVyKCkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIF9zdXBlckFwcGx5KCBhcmdzICkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBfX3N1cGVyID0gdGhpcy5fc3VwZXI7XG5cdFx0XHRcdHZhciBfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5O1xuXHRcdFx0XHR2YXIgcmV0dXJuVmFsdWU7XG5cblx0XHRcdFx0dGhpcy5fc3VwZXIgPSBfc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfc3VwZXJBcHBseTtcblxuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHZhbHVlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHR0aGlzLl9zdXBlciA9IF9fc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7XG5cblx0XHRcdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHRcdFx0fTtcblx0XHR9ICkoKTtcblx0fSApO1xuXHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSAkLndpZGdldC5leHRlbmQoIGJhc2VQcm90b3R5cGUsIHtcblxuXHRcdC8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeFxuXHRcdC8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydFxuXHRcdC8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWRcblx0XHR3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/ICggYmFzZVByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeCB8fCBuYW1lICkgOiBuYW1lXG5cdH0sIHByb3hpZWRQcm90b3R5cGUsIHtcblx0XHRjb25zdHJ1Y3RvcjogY29uc3RydWN0b3IsXG5cdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2UsXG5cdFx0d2lkZ2V0TmFtZTogbmFtZSxcblx0XHR3aWRnZXRGdWxsTmFtZTogZnVsbE5hbWVcblx0fSApO1xuXG5cdC8vIElmIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lkZ2V0cyB0aGF0XG5cdC8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb21cblx0Ly8gdGhlIG5ldyB2ZXJzaW9uIG9mIHRoaXMgd2lkZ2V0LiBXZSdyZSBlc3NlbnRpYWxseSB0cnlpbmcgdG8gcmVwbGFjZSBvbmVcblx0Ly8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi5cblx0aWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkge1xuXHRcdCQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHtcblx0XHRcdHZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3RvdHlwZTtcblxuXHRcdFx0Ly8gUmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXNcblx0XHRcdC8vIG9yaWdpbmFsbHkgdXNlZCwgYnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2Vcblx0XHRcdCQud2lkZ2V0KCBjaGlsZFByb3RvdHlwZS5uYW1lc3BhY2UgKyBcIi5cIiArIGNoaWxkUHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLFxuXHRcdFx0XHRjaGlsZC5fcHJvdG8gKTtcblx0XHR9ICk7XG5cblx0XHQvLyBSZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQgY29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvclxuXHRcdC8vIHNvIHRoZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZFxuXHRcdGRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9ycztcblx0fSBlbHNlIHtcblx0XHRiYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApO1xuXHR9XG5cblx0JC53aWRnZXQuYnJpZGdlKCBuYW1lLCBjb25zdHJ1Y3RvciApO1xuXG5cdHJldHVybiBjb25zdHJ1Y3Rvcjtcbn07XG5cbiQud2lkZ2V0LmV4dGVuZCA9IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdHZhciBpbnB1dCA9IHdpZGdldFNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApO1xuXHR2YXIgaW5wdXRJbmRleCA9IDA7XG5cdHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0dmFyIGtleTtcblx0dmFyIHZhbHVlO1xuXG5cdGZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7XG5cdFx0Zm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7XG5cdFx0XHR2YWx1ZSA9IGlucHV0WyBpbnB1dEluZGV4IF1bIGtleSBdO1xuXHRcdFx0aWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIENsb25lIG9iamVjdHNcblx0XHRcdFx0aWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID9cblx0XHRcdFx0XHRcdCQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0c1xuXHRcdFx0XHRcdFx0JC53aWRnZXQuZXh0ZW5kKCB7fSwgdmFsdWUgKTtcblxuXHRcdFx0XHQvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0YXJnZXRbIGtleSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7XG5cdHZhciBmdWxsTmFtZSA9IG9iamVjdC5wcm90b3R5cGUud2lkZ2V0RnVsbE5hbWUgfHwgbmFtZTtcblx0JC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiO1xuXHRcdHZhciBhcmdzID0gd2lkZ2V0U2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICk7XG5cdFx0dmFyIHJldHVyblZhbHVlID0gdGhpcztcblxuXHRcdGlmICggaXNNZXRob2RDYWxsICkge1xuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGFuIGVtcHR5IGNvbGxlY3Rpb24sIHdlIG5lZWQgdG8gaGF2ZSB0aGUgaW5zdGFuY2UgbWV0aG9kXG5cdFx0XHQvLyByZXR1cm4gdW5kZWZpbmVkIGluc3RlYWQgb2YgdGhlIGpRdWVyeSBpbnN0YW5jZVxuXHRcdFx0aWYgKCAhdGhpcy5sZW5ndGggJiYgb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdHZhciBpbnN0YW5jZSA9ICQuZGF0YSggdGhpcywgZnVsbE5hbWUgKTtcblxuXHRcdFx0XHRcdGlmICggb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBpbnN0YW5jZTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICFpbnN0YW5jZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiAkLmVycm9yKCBcImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gXCIgKyBuYW1lICtcblx0XHRcdFx0XHRcdFx0XCIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IFwiICtcblx0XHRcdFx0XHRcdFx0XCJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJ1wiICsgb3B0aW9ucyArIFwiJ1wiICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhJC5pc0Z1bmN0aW9uKCBpbnN0YW5jZVsgb3B0aW9ucyBdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gXCJfXCIgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5lcnJvciggXCJubyBzdWNoIG1ldGhvZCAnXCIgKyBvcHRpb25zICsgXCInIGZvciBcIiArIG5hbWUgK1xuXHRcdFx0XHRcdFx0XHRcIiB3aWRnZXQgaW5zdGFuY2VcIiApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1ldGhvZFZhbHVlID0gaW5zdGFuY2VbIG9wdGlvbnMgXS5hcHBseSggaW5zdGFuY2UsIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggbWV0aG9kVmFsdWUgIT09IGluc3RhbmNlICYmIG1ldGhvZFZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IG1ldGhvZFZhbHVlICYmIG1ldGhvZFZhbHVlLmpxdWVyeSA/XG5cdFx0XHRcdFx0XHRcdHJldHVyblZhbHVlLnB1c2hTdGFjayggbWV0aG9kVmFsdWUuZ2V0KCkgKSA6XG5cdFx0XHRcdFx0XHRcdG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEFsbG93IG11bHRpcGxlIGhhc2hlcyB0byBiZSBwYXNzZWQgb24gaW5pdFxuXHRcdFx0aWYgKCBhcmdzLmxlbmd0aCApIHtcblx0XHRcdFx0b3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZC5hcHBseSggbnVsbCwgWyBvcHRpb25zIF0uY29uY2F0KCBhcmdzICkgKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApO1xuXHRcdFx0XHRpZiAoIGluc3RhbmNlICkge1xuXHRcdFx0XHRcdGluc3RhbmNlLm9wdGlvbiggb3B0aW9ucyB8fCB7fSApO1xuXHRcdFx0XHRcdGlmICggaW5zdGFuY2UuX2luaXQgKSB7XG5cdFx0XHRcdFx0XHRpbnN0YW5jZS5faW5pdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lLCBuZXcgb2JqZWN0KCBvcHRpb25zLCB0aGlzICkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0fTtcbn07XG5cbiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTtcbiQuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycyA9IFtdO1xuXG4kLldpZGdldC5wcm90b3R5cGUgPSB7XG5cdHdpZGdldE5hbWU6IFwid2lkZ2V0XCIsXG5cdHdpZGdldEV2ZW50UHJlZml4OiBcIlwiLFxuXHRkZWZhdWx0RWxlbWVudDogXCI8ZGl2PlwiLFxuXG5cdG9wdGlvbnM6IHtcblx0XHRjbGFzc2VzOiB7fSxcblx0XHRkaXNhYmxlZDogZmFsc2UsXG5cblx0XHQvLyBDYWxsYmFja3Ncblx0XHRjcmVhdGU6IG51bGxcblx0fSxcblxuXHRfY3JlYXRlV2lkZ2V0OiBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHtcblx0XHRlbGVtZW50ID0gJCggZWxlbWVudCB8fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdO1xuXHRcdHRoaXMuZWxlbWVudCA9ICQoIGVsZW1lbnQgKTtcblx0XHR0aGlzLnV1aWQgPSB3aWRnZXRVdWlkKys7XG5cdFx0dGhpcy5ldmVudE5hbWVzcGFjZSA9IFwiLlwiICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkO1xuXG5cdFx0dGhpcy5iaW5kaW5ncyA9ICQoKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoKTtcblx0XHR0aGlzLmZvY3VzYWJsZSA9ICQoKTtcblx0XHR0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwID0ge307XG5cblx0XHRpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7XG5cdFx0XHQkLmRhdGEoIGVsZW1lbnQsIHRoaXMud2lkZ2V0RnVsbE5hbWUsIHRoaXMgKTtcblx0XHRcdHRoaXMuX29uKCB0cnVlLCB0aGlzLmVsZW1lbnQsIHtcblx0XHRcdFx0cmVtb3ZlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdFx0aWYgKCBldmVudC50YXJnZXQgPT09IGVsZW1lbnQgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHRcdHRoaXMuZG9jdW1lbnQgPSAkKCBlbGVtZW50LnN0eWxlID9cblxuXHRcdFx0XHQvLyBFbGVtZW50IHdpdGhpbiB0aGUgZG9jdW1lbnRcblx0XHRcdFx0ZWxlbWVudC5vd25lckRvY3VtZW50IDpcblxuXHRcdFx0XHQvLyBFbGVtZW50IGlzIHdpbmRvdyBvciBkb2N1bWVudFxuXHRcdFx0XHRlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQgKTtcblx0XHRcdHRoaXMud2luZG93ID0gJCggdGhpcy5kb2N1bWVudFsgMCBdLmRlZmF1bHRWaWV3IHx8IHRoaXMuZG9jdW1lbnRbIDAgXS5wYXJlbnRXaW5kb3cgKTtcblx0XHR9XG5cblx0XHR0aGlzLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LFxuXHRcdFx0dGhpcy5vcHRpb25zLFxuXHRcdFx0dGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLFxuXHRcdFx0b3B0aW9ucyApO1xuXG5cdFx0dGhpcy5fY3JlYXRlKCk7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHtcblx0XHRcdHRoaXMuX3NldE9wdGlvbkRpc2FibGVkKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKTtcblx0XHR9XG5cblx0XHR0aGlzLl90cmlnZ2VyKCBcImNyZWF0ZVwiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApO1xuXHRcdHRoaXMuX2luaXQoKTtcblx0fSxcblxuXHRfZ2V0Q3JlYXRlT3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9LFxuXG5cdF9nZXRDcmVhdGVFdmVudERhdGE6ICQubm9vcCxcblxuXHRfY3JlYXRlOiAkLm5vb3AsXG5cblx0X2luaXQ6ICQubm9vcCxcblxuXHRkZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cblx0XHR0aGlzLl9kZXN0cm95KCk7XG5cdFx0JC5lYWNoKCB0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdHRoYXQuX3JlbW92ZUNsYXNzKCB2YWx1ZSwga2V5ICk7XG5cdFx0fSApO1xuXG5cdFx0Ly8gV2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMFxuXHRcdC8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpXG5cdFx0dGhpcy5lbGVtZW50XG5cdFx0XHQub2ZmKCB0aGlzLmV2ZW50TmFtZXNwYWNlIClcblx0XHRcdC5yZW1vdmVEYXRhKCB0aGlzLndpZGdldEZ1bGxOYW1lICk7XG5cdFx0dGhpcy53aWRnZXQoKVxuXHRcdFx0Lm9mZiggdGhpcy5ldmVudE5hbWVzcGFjZSApXG5cdFx0XHQucmVtb3ZlQXR0ciggXCJhcmlhLWRpc2FibGVkXCIgKTtcblxuXHRcdC8vIENsZWFuIHVwIGV2ZW50cyBhbmQgc3RhdGVzXG5cdFx0dGhpcy5iaW5kaW5ncy5vZmYoIHRoaXMuZXZlbnROYW1lc3BhY2UgKTtcblx0fSxcblxuXHRfZGVzdHJveTogJC5ub29wLFxuXG5cdHdpZGdldDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudDtcblx0fSxcblxuXHRvcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBvcHRpb25zID0ga2V5O1xuXHRcdHZhciBwYXJ0cztcblx0XHR2YXIgY3VyT3B0aW9uO1xuXHRcdHZhciBpO1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHQvLyBEb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2hcblx0XHRcdHJldHVybiAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vIEhhbmRsZSBuZXN0ZWQga2V5cywgZS5nLiwgXCJmb28uYmFyXCIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9XG5cdFx0XHRvcHRpb25zID0ge307XG5cdFx0XHRwYXJ0cyA9IGtleS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdGtleSA9IHBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRpZiAoIHBhcnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y3VyT3B0aW9uID0gb3B0aW9uc1sga2V5IF0gPSAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnNbIGtleSBdICk7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrICkge1xuXHRcdFx0XHRcdGN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307XG5cdFx0XHRcdFx0Y3VyT3B0aW9uID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07XG5cdFx0XHRcdH1cblx0XHRcdFx0a2V5ID0gcGFydHMucG9wKCk7XG5cdFx0XHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdFx0XHRyZXR1cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9wdGlvblsga2V5IF07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3VyT3B0aW9uWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnNbIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5vcHRpb25zWyBrZXkgXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvcHRpb25zWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuX3NldE9wdGlvbnMoIG9wdGlvbnMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdF9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIga2V5O1xuXG5cdFx0Zm9yICgga2V5IGluIG9wdGlvbnMgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb24oIGtleSwgb3B0aW9uc1sga2V5IF0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRpZiAoIGtleSA9PT0gXCJjbGFzc2VzXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25DbGFzc2VzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdHRoaXMub3B0aW9uc1sga2V5IF0gPSB2YWx1ZTtcblxuXHRcdGlmICgga2V5ID09PSBcImRpc2FibGVkXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25EaXNhYmxlZCggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uQ2xhc3NlczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc0tleSwgZWxlbWVudHMsIGN1cnJlbnRFbGVtZW50cztcblxuXHRcdGZvciAoIGNsYXNzS2V5IGluIHZhbHVlICkge1xuXHRcdFx0Y3VycmVudEVsZW1lbnRzID0gdGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cFsgY2xhc3NLZXkgXTtcblx0XHRcdGlmICggdmFsdWVbIGNsYXNzS2V5IF0gPT09IHRoaXMub3B0aW9ucy5jbGFzc2VzWyBjbGFzc0tleSBdIHx8XG5cdFx0XHRcdFx0IWN1cnJlbnRFbGVtZW50cyB8fFxuXHRcdFx0XHRcdCFjdXJyZW50RWxlbWVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UgYXJlIGRvaW5nIHRoaXMgdG8gY3JlYXRlIGEgbmV3IGpRdWVyeSBvYmplY3QgYmVjYXVzZSB0aGUgX3JlbW92ZUNsYXNzKCkgY2FsbFxuXHRcdFx0Ly8gb24gdGhlIG5leHQgbGluZSBpcyBnb2luZyB0byBkZXN0cm95IHRoZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZWxlbWVudHMgYmVpbmdcblx0XHRcdC8vIHRyYWNrZWQuIFdlIG5lZWQgdG8gc2F2ZSBhIGNvcHkgb2YgdGhpcyBjb2xsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGFkZCB0aGUgbmV3IGNsYXNzZXNcblx0XHRcdC8vIGJlbG93LlxuXHRcdFx0ZWxlbWVudHMgPSAkKCBjdXJyZW50RWxlbWVudHMuZ2V0KCkgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCBjdXJyZW50RWxlbWVudHMsIGNsYXNzS2V5ICk7XG5cblx0XHRcdC8vIFdlIGRvbid0IHVzZSBfYWRkQ2xhc3MoKSBoZXJlLCBiZWNhdXNlIHRoYXQgdXNlcyB0aGlzLm9wdGlvbnMuY2xhc3Nlc1xuXHRcdFx0Ly8gZm9yIGdlbmVyYXRpbmcgdGhlIHN0cmluZyBvZiBjbGFzc2VzLiBXZSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgcGFzc2VkIGluIGZyb21cblx0XHRcdC8vIF9zZXRPcHRpb24oKSwgdGhpcyBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjbGFzc2VzIG9wdGlvbiB3aGljaCB3YXMgcGFzc2VkIHRvXG5cdFx0XHQvLyBfc2V0T3B0aW9uKCkuIFdlIHBhc3MgdGhpcyB2YWx1ZSBkaXJlY3RseSB0byBfY2xhc3NlcygpLlxuXHRcdFx0ZWxlbWVudHMuYWRkQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIHtcblx0XHRcdFx0ZWxlbWVudDogZWxlbWVudHMsXG5cdFx0XHRcdGtleXM6IGNsYXNzS2V5LFxuXHRcdFx0XHRjbGFzc2VzOiB2YWx1ZSxcblx0XHRcdFx0YWRkOiB0cnVlXG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cdH0sXG5cblx0X3NldE9wdGlvbkRpc2FibGVkOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dGhpcy5fdG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0KCksIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyBcIi1kaXNhYmxlZFwiLCBudWxsLCAhIXZhbHVlICk7XG5cblx0XHQvLyBJZiB0aGUgd2lkZ2V0IGlzIGJlY29taW5nIGRpc2FibGVkLCB0aGVuIG5vdGhpbmcgaXMgaW50ZXJhY3RpdmVcblx0XHRpZiAoIHZhbHVlICkge1xuXHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoIHRoaXMuaG92ZXJhYmxlLCBudWxsLCBcInVpLXN0YXRlLWhvdmVyXCIgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCB0aGlzLmZvY3VzYWJsZSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoIHsgZGlzYWJsZWQ6IGZhbHNlIH0gKTtcblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyggeyBkaXNhYmxlZDogdHJ1ZSB9ICk7XG5cdH0sXG5cblx0X2NsYXNzZXM6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBmdWxsID0gW107XG5cdFx0dmFyIHRoYXQgPSB0aGlzO1xuXG5cdFx0b3B0aW9ucyA9ICQuZXh0ZW5kKCB7XG5cdFx0XHRlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG5cdFx0XHRjbGFzc2VzOiB0aGlzLm9wdGlvbnMuY2xhc3NlcyB8fCB7fVxuXHRcdH0sIG9wdGlvbnMgKTtcblxuXHRcdGZ1bmN0aW9uIHByb2Nlc3NDbGFzc1N0cmluZyggY2xhc3NlcywgY2hlY2tPcHRpb24gKSB7XG5cdFx0XHR2YXIgY3VycmVudCwgaTtcblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0Y3VycmVudCA9IHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdIHx8ICQoKTtcblx0XHRcdFx0aWYgKCBvcHRpb25zLmFkZCApIHtcblx0XHRcdFx0XHRjdXJyZW50ID0gJCggJC51bmlxdWUoIGN1cnJlbnQuZ2V0KCkuY29uY2F0KCBvcHRpb25zLmVsZW1lbnQuZ2V0KCkgKSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudCA9ICQoIGN1cnJlbnQubm90KCBvcHRpb25zLmVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdID0gY3VycmVudDtcblx0XHRcdFx0ZnVsbC5wdXNoKCBjbGFzc2VzWyBpIF0gKTtcblx0XHRcdFx0aWYgKCBjaGVja09wdGlvbiAmJiBvcHRpb25zLmNsYXNzZXNbIGNsYXNzZXNbIGkgXSBdICkge1xuXHRcdFx0XHRcdGZ1bGwucHVzaCggb3B0aW9ucy5jbGFzc2VzWyBjbGFzc2VzWyBpIF0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fb24oIG9wdGlvbnMuZWxlbWVudCwge1xuXHRcdFx0XCJyZW1vdmVcIjogXCJfdW50cmFja0NsYXNzZXNFbGVtZW50XCJcblx0XHR9ICk7XG5cblx0XHRpZiAoIG9wdGlvbnMua2V5cyApIHtcblx0XHRcdHByb2Nlc3NDbGFzc1N0cmluZyggb3B0aW9ucy5rZXlzLm1hdGNoKCAvXFxTKy9nICkgfHwgW10sIHRydWUgKTtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmV4dHJhICkge1xuXHRcdFx0cHJvY2Vzc0NsYXNzU3RyaW5nKCBvcHRpb25zLmV4dHJhLm1hdGNoKCAvXFxTKy9nICkgfHwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZnVsbC5qb2luKCBcIiBcIiApO1xuXHR9LFxuXG5cdF91bnRyYWNrQ2xhc3Nlc0VsZW1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cdFx0JC5lYWNoKCB0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdGlmICggJC5pbkFycmF5KCBldmVudC50YXJnZXQsIHZhbHVlICkgIT09IC0xICkge1xuXHRcdFx0XHR0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwWyBrZXkgXSA9ICQoIHZhbHVlLm5vdCggZXZlbnQudGFyZ2V0ICkuZ2V0KCkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X3JlbW92ZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3RvZ2dsZUNsYXNzKCBlbGVtZW50LCBrZXlzLCBleHRyYSwgZmFsc2UgKTtcblx0fSxcblxuXHRfYWRkQ2xhc3M6IGZ1bmN0aW9uKCBlbGVtZW50LCBrZXlzLCBleHRyYSApIHtcblx0XHRyZXR1cm4gdGhpcy5fdG9nZ2xlQ2xhc3MoIGVsZW1lbnQsIGtleXMsIGV4dHJhLCB0cnVlICk7XG5cdH0sXG5cblx0X3RvZ2dsZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEsIGFkZCApIHtcblx0XHRhZGQgPSAoIHR5cGVvZiBhZGQgPT09IFwiYm9vbGVhblwiICkgPyBhZGQgOiBleHRyYTtcblx0XHR2YXIgc2hpZnQgPSAoIHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiIHx8IGVsZW1lbnQgPT09IG51bGwgKSxcblx0XHRcdG9wdGlvbnMgPSB7XG5cdFx0XHRcdGV4dHJhOiBzaGlmdCA/IGtleXMgOiBleHRyYSxcblx0XHRcdFx0a2V5czogc2hpZnQgPyBlbGVtZW50IDoga2V5cyxcblx0XHRcdFx0ZWxlbWVudDogc2hpZnQgPyB0aGlzLmVsZW1lbnQgOiBlbGVtZW50LFxuXHRcdFx0XHRhZGQ6IGFkZFxuXHRcdFx0fTtcblx0XHRvcHRpb25zLmVsZW1lbnQudG9nZ2xlQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIG9wdGlvbnMgKSwgYWRkICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0X29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgZGVsZWdhdGVFbGVtZW50O1xuXHRcdHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cblx0XHQvLyBObyBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgZmxhZywgc2h1ZmZsZSBhcmd1bWVudHNcblx0XHRpZiAoIHR5cGVvZiBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgIT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0aGFuZGxlcnMgPSBlbGVtZW50O1xuXHRcdFx0ZWxlbWVudCA9IHN1cHByZXNzRGlzYWJsZWRDaGVjaztcblx0XHRcdHN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIE5vIGVsZW1lbnQgYXJndW1lbnQsIHNodWZmbGUgYW5kIHVzZSB0aGlzLmVsZW1lbnRcblx0XHRpZiAoICFoYW5kbGVycyApIHtcblx0XHRcdGhhbmRsZXJzID0gZWxlbWVudDtcblx0XHRcdGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XG5cdFx0XHRkZWxlZ2F0ZUVsZW1lbnQgPSB0aGlzLndpZGdldCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50ID0gZGVsZWdhdGVFbGVtZW50ID0gJCggZWxlbWVudCApO1xuXHRcdFx0dGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7XG5cdFx0fVxuXG5cdFx0JC5lYWNoKCBoYW5kbGVycywgZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVyICkge1xuXHRcdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXG5cdFx0XHRcdC8vIEFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZ1xuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGFzIGFuIGFycmF5IGluc3RlYWQgb2YgYm9vbGVhblxuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGNsYXNzIGFzIG1ldGhvZCBmb3IgZGlzYWJsaW5nIGluZGl2aWR1YWwgcGFydHNcblx0XHRcdFx0aWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmXG5cdFx0XHRcdFx0XHQoIGluc3RhbmNlLm9wdGlvbnMuZGlzYWJsZWQgPT09IHRydWUgfHxcblx0XHRcdFx0XHRcdCQoIHRoaXMgKS5oYXNDbGFzcyggXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiICkgKSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdFx0LmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3Jrc1xuXHRcdFx0aWYgKCB0eXBlb2YgaGFuZGxlciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0aGFuZGxlclByb3h5Lmd1aWQgPSBoYW5kbGVyLmd1aWQgPVxuXHRcdFx0XHRcdGhhbmRsZXIuZ3VpZCB8fCBoYW5kbGVyUHJveHkuZ3VpZCB8fCAkLmd1aWQrKztcblx0XHRcdH1cblxuXHRcdFx0dmFyIG1hdGNoID0gZXZlbnQubWF0Y2goIC9eKFtcXHc6LV0qKVxccyooLiopJC8gKTtcblx0XHRcdHZhciBldmVudE5hbWUgPSBtYXRjaFsgMSBdICsgaW5zdGFuY2UuZXZlbnROYW1lc3BhY2U7XG5cdFx0XHR2YXIgc2VsZWN0b3IgPSBtYXRjaFsgMiBdO1xuXG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRkZWxlZ2F0ZUVsZW1lbnQub24oIGV2ZW50TmFtZSwgc2VsZWN0b3IsIGhhbmRsZXJQcm94eSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudC5vbiggZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X29mZjogZnVuY3Rpb24oIGVsZW1lbnQsIGV2ZW50TmFtZSApIHtcblx0XHRldmVudE5hbWUgPSAoIGV2ZW50TmFtZSB8fCBcIlwiICkuc3BsaXQoIFwiIFwiICkuam9pbiggdGhpcy5ldmVudE5hbWVzcGFjZSArIFwiIFwiICkgK1xuXHRcdFx0dGhpcy5ldmVudE5hbWVzcGFjZTtcblx0XHRlbGVtZW50Lm9mZiggZXZlbnROYW1lICkub2ZmKCBldmVudE5hbWUgKTtcblxuXHRcdC8vIENsZWFyIHRoZSBzdGFjayB0byBhdm9pZCBtZW1vcnkgbGVha3MgKCMxMDA1Nilcblx0XHR0aGlzLmJpbmRpbmdzID0gJCggdGhpcy5iaW5kaW5ncy5ub3QoIGVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gJCggdGhpcy5mb2N1c2FibGUubm90KCBlbGVtZW50ICkuZ2V0KCkgKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoIHRoaXMuaG92ZXJhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7XG5cdH0sXG5cblx0X2RlbGF5OiBmdW5jdGlvbiggaGFuZGxlciwgZGVsYXkgKSB7XG5cdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdC5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0XHR2YXIgaW5zdGFuY2UgPSB0aGlzO1xuXHRcdHJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTtcblx0fSxcblxuXHRfaG92ZXJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHtcblx0XHR0aGlzLmhvdmVyYWJsZSA9IHRoaXMuaG92ZXJhYmxlLmFkZCggZWxlbWVudCApO1xuXHRcdHRoaXMuX29uKCBlbGVtZW50LCB7XG5cdFx0XHRtb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHRoaXMuX2FkZENsYXNzKCAkKCBldmVudC5jdXJyZW50VGFyZ2V0ICksIG51bGwsIFwidWktc3RhdGUtaG92ZXJcIiApO1xuXHRcdFx0fSxcblx0XHRcdG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1ob3ZlclwiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF9mb2N1c2FibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGUuYWRkKCBlbGVtZW50ICk7XG5cdFx0dGhpcy5fb24oIGVsZW1lbnQsIHtcblx0XHRcdGZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9LFxuXHRcdFx0Zm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7XG5cdFx0dmFyIHByb3AsIG9yaWc7XG5cdFx0dmFyIGNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07XG5cblx0XHRkYXRhID0gZGF0YSB8fCB7fTtcblx0XHRldmVudCA9ICQuRXZlbnQoIGV2ZW50ICk7XG5cdFx0ZXZlbnQudHlwZSA9ICggdHlwZSA9PT0gdGhpcy53aWRnZXRFdmVudFByZWZpeCA/XG5cdFx0XHR0eXBlIDpcblx0XHRcdHRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTtcblxuXHRcdC8vIFRoZSBvcmlnaW5hbCBldmVudCBtYXkgY29tZSBmcm9tIGFueSBlbGVtZW50XG5cdFx0Ly8gc28gd2UgbmVlZCB0byByZXNldCB0aGUgdGFyZ2V0IG9uIHRoZSBuZXcgZXZlbnRcblx0XHRldmVudC50YXJnZXQgPSB0aGlzLmVsZW1lbnRbIDAgXTtcblxuXHRcdC8vIENvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnRcblx0XHRvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDtcblx0XHRpZiAoIG9yaWcgKSB7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGlmICggISggcHJvcCBpbiBldmVudCApICkge1xuXHRcdFx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmVsZW1lbnQudHJpZ2dlciggZXZlbnQsIGRhdGEgKTtcblx0XHRyZXR1cm4gISggJC5pc0Z1bmN0aW9uKCBjYWxsYmFjayApICYmXG5cdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcy5lbGVtZW50WyAwIF0sIFsgZXZlbnQgXS5jb25jYXQoIGRhdGEgKSApID09PSBmYWxzZSB8fFxuXHRcdFx0ZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKTtcblx0fVxufTtcblxuJC5lYWNoKCB7IHNob3c6IFwiZmFkZUluXCIsIGhpZGU6IFwiZmFkZU91dFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIGRlZmF1bHRFZmZlY3QgKSB7XG5cdCQuV2lkZ2V0LnByb3RvdHlwZVsgXCJfXCIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0dmFyIGhhc09wdGlvbnM7XG5cdFx0dmFyIGVmZmVjdE5hbWUgPSAhb3B0aW9ucyA/XG5cdFx0XHRtZXRob2QgOlxuXHRcdFx0b3B0aW9ucyA9PT0gdHJ1ZSB8fCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiA/XG5cdFx0XHRcdGRlZmF1bHRFZmZlY3QgOlxuXHRcdFx0XHRvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0O1xuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0aWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB7IGR1cmF0aW9uOiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0aGFzT3B0aW9ucyA9ICEkLmlzRW1wdHlPYmplY3QoIG9wdGlvbnMgKTtcblx0XHRvcHRpb25zLmNvbXBsZXRlID0gY2FsbGJhY2s7XG5cblx0XHRpZiAoIG9wdGlvbnMuZGVsYXkgKSB7XG5cdFx0XHRlbGVtZW50LmRlbGF5KCBvcHRpb25zLmRlbGF5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBtZXRob2QgXSggb3B0aW9ucyApO1xuXHRcdH0gZWxzZSBpZiAoIGVmZmVjdE5hbWUgIT09IG1ldGhvZCAmJiBlbGVtZW50WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBlZmZlY3ROYW1lIF0oIG9wdGlvbnMuZHVyYXRpb24sIG9wdGlvbnMuZWFzaW5nLCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50LnF1ZXVlKCBmdW5jdGlvbiggbmV4dCApIHtcblx0XHRcdFx0JCggdGhpcyApWyBtZXRob2QgXSgpO1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGVsZW1lbnRbIDAgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbnJldHVybiAkLndpZGdldDtcblxufSApICk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vanF1ZXJ5LXVpL3VpL3dpZGdldC5qc1xuLy8gbW9kdWxlIGlkID0gMjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 28 */\n/***/ function(module, exports) {\n\neval(\"module.exports = function(module) {\\r\\n\\tif(!module.webpackPolyfill) {\\r\\n\\t\\tmodule.deprecate = function() {};\\r\\n\\t\\tmodule.paths = [];\\r\\n\\t\\t// module.parent = undefined by default\\r\\n\\t\\tif(!module.children) module.children = [];\\r\\n\\t\\tObject.defineProperty(module, \\\"loaded\\\", {\\r\\n\\t\\t\\tenumerable: true,\\r\\n\\t\\t\\tconfigurable: false,\\r\\n\\t\\t\\tget: function() { return module.l; }\\r\\n\\t\\t});\\r\\n\\t\\tObject.defineProperty(module, \\\"id\\\", {\\r\\n\\t\\t\\tenumerable: true,\\r\\n\\t\\t\\tconfigurable: false,\\r\\n\\t\\t\\tget: function() { return module.i; }\\r\\n\\t\\t});\\r\\n\\t\\tmodule.webpackPolyfill = 1;\\r\\n\\t}\\r\\n\\treturn module;\\r\\n}\\r\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0aWYoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGUubDsgfVxyXG5cdFx0fSk7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZS5pOyB9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\\n * @license\\n * Lodash \\n * Copyright JS Foundation and other contributors \\n * Released under MIT license \\n * Based on Underscore.js 1.8.3 \\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\\n */\\n;(function() {\\n\\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\\n var undefined;\\n\\n /** Used as the semantic version number. */\\n var VERSION = '4.17.4';\\n\\n /** Used as the size to enable large array optimizations. */\\n var LARGE_ARRAY_SIZE = 200;\\n\\n /** Error message constants. */\\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\\n FUNC_ERROR_TEXT = 'Expected a function';\\n\\n /** Used to stand-in for `undefined` hash values. */\\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\\n\\n /** Used as the maximum memoize cache size. */\\n var MAX_MEMOIZE_SIZE = 500;\\n\\n /** Used as the internal argument placeholder. */\\n var PLACEHOLDER = '__lodash_placeholder__';\\n\\n /** Used to compose bitmasks for cloning. */\\n var CLONE_DEEP_FLAG = 1,\\n CLONE_FLAT_FLAG = 2,\\n CLONE_SYMBOLS_FLAG = 4;\\n\\n /** Used to compose bitmasks for value comparisons. */\\n var COMPARE_PARTIAL_FLAG = 1,\\n COMPARE_UNORDERED_FLAG = 2;\\n\\n /** Used to compose bitmasks for function metadata. */\\n var WRAP_BIND_FLAG = 1,\\n WRAP_BIND_KEY_FLAG = 2,\\n WRAP_CURRY_BOUND_FLAG = 4,\\n WRAP_CURRY_FLAG = 8,\\n WRAP_CURRY_RIGHT_FLAG = 16,\\n WRAP_PARTIAL_FLAG = 32,\\n WRAP_PARTIAL_RIGHT_FLAG = 64,\\n WRAP_ARY_FLAG = 128,\\n WRAP_REARG_FLAG = 256,\\n WRAP_FLIP_FLAG = 512;\\n\\n /** Used as default options for `_.truncate`. */\\n var DEFAULT_TRUNC_LENGTH = 30,\\n DEFAULT_TRUNC_OMISSION = '...';\\n\\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\\n var HOT_COUNT = 800,\\n HOT_SPAN = 16;\\n\\n /** Used to indicate the type of lazy iteratees. */\\n var LAZY_FILTER_FLAG = 1,\\n LAZY_MAP_FLAG = 2,\\n LAZY_WHILE_FLAG = 3;\\n\\n /** Used as references for various `Number` constants. */\\n var INFINITY = 1 / 0,\\n MAX_SAFE_INTEGER = 9007199254740991,\\n MAX_INTEGER = 1.7976931348623157e+308,\\n NAN = 0 / 0;\\n\\n /** Used as references for the maximum length and index of an array. */\\n var MAX_ARRAY_LENGTH = 4294967295,\\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\\n\\n /** Used to associate wrap methods with their bit flags. */\\n var wrapFlags = [\\n ['ary', WRAP_ARY_FLAG],\\n ['bind', WRAP_BIND_FLAG],\\n ['bindKey', WRAP_BIND_KEY_FLAG],\\n ['curry', WRAP_CURRY_FLAG],\\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\\n ['flip', WRAP_FLIP_FLAG],\\n ['partial', WRAP_PARTIAL_FLAG],\\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\\n ['rearg', WRAP_REARG_FLAG]\\n ];\\n\\n /** `Object#toString` result references. */\\n var argsTag = '[object Arguments]',\\n arrayTag = '[object Array]',\\n asyncTag = '[object AsyncFunction]',\\n boolTag = '[object Boolean]',\\n dateTag = '[object Date]',\\n domExcTag = '[object DOMException]',\\n errorTag = '[object Error]',\\n funcTag = '[object Function]',\\n genTag = '[object GeneratorFunction]',\\n mapTag = '[object Map]',\\n numberTag = '[object Number]',\\n nullTag = '[object Null]',\\n objectTag = '[object Object]',\\n promiseTag = '[object Promise]',\\n proxyTag = '[object Proxy]',\\n regexpTag = '[object RegExp]',\\n setTag = '[object Set]',\\n stringTag = '[object String]',\\n symbolTag = '[object Symbol]',\\n undefinedTag = '[object Undefined]',\\n weakMapTag = '[object WeakMap]',\\n weakSetTag = '[object WeakSet]';\\n\\n var arrayBufferTag = '[object ArrayBuffer]',\\n dataViewTag = '[object DataView]',\\n float32Tag = '[object Float32Array]',\\n float64Tag = '[object Float64Array]',\\n int8Tag = '[object Int8Array]',\\n int16Tag = '[object Int16Array]',\\n int32Tag = '[object Int32Array]',\\n uint8Tag = '[object Uint8Array]',\\n uint8ClampedTag = '[object Uint8ClampedArray]',\\n uint16Tag = '[object Uint16Array]',\\n uint32Tag = '[object Uint32Array]';\\n\\n /** Used to match empty string literals in compiled template source. */\\n var reEmptyStringLeading = /\\\\b__p \\\\+= '';/g,\\n reEmptyStringMiddle = /\\\\b(__p \\\\+=) '' \\\\+/g,\\n reEmptyStringTrailing = /(__e\\\\(.*?\\\\)|\\\\b__t\\\\)) \\\\+\\\\n'';/g;\\n\\n /** Used to match HTML entities and HTML characters. */\\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\\n reUnescapedHtml = /[&<>\\\"']/g,\\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\\n\\n /** Used to match template delimiters. */\\n var reEscape = /<%-([\\\\s\\\\S]+?)%>/g,\\n reEvaluate = /<%([\\\\s\\\\S]+?)%>/g,\\n reInterpolate = /<%=([\\\\s\\\\S]+?)%>/g;\\n\\n /** Used to match property names within property paths. */\\n var reIsDeepProp = /\\\\.|\\\\[(?:[^[\\\\]]*|([\\\"'])(?:(?!\\\\1)[^\\\\\\\\]|\\\\\\\\.)*?\\\\1)\\\\]/,\\n reIsPlainProp = /^\\\\w*$/,\\n reLeadingDot = /^\\\\./,\\n rePropName = /[^.[\\\\]]+|\\\\[(?:(-?\\\\d+(?:\\\\.\\\\d+)?)|([\\\"'])((?:(?!\\\\2)[^\\\\\\\\]|\\\\\\\\.)*?)\\\\2)\\\\]|(?=(?:\\\\.|\\\\[\\\\])(?:\\\\.|\\\\[\\\\]|$))/g;\\n\\n /**\\n * Used to match `RegExp`\\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\\n */\\n var reRegExpChar = /[\\\\\\\\^$.*+?()[\\\\]{}|]/g,\\n reHasRegExpChar = RegExp(reRegExpChar.source);\\n\\n /** Used to match leading and trailing whitespace. */\\n var reTrim = /^\\\\s+|\\\\s+$/g,\\n reTrimStart = /^\\\\s+/,\\n reTrimEnd = /\\\\s+$/;\\n\\n /** Used to match wrap detail comments. */\\n var reWrapComment = /\\\\{(?:\\\\n\\\\/\\\\* \\\\[wrapped with .+\\\\] \\\\*\\\\/)?\\\\n?/,\\n reWrapDetails = /\\\\{\\\\n\\\\/\\\\* \\\\[wrapped with (.+)\\\\] \\\\*/,\\n reSplitDetails = /,? & /;\\n\\n /** Used to match words composed of alphanumeric characters. */\\n var reAsciiWord = /[^\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\x7f]+/g;\\n\\n /** Used to match backslashes in property paths. */\\n var reEscapeChar = /\\\\\\\\(\\\\\\\\)?/g;\\n\\n /**\\n * Used to match\\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\\n */\\n var reEsTemplate = /\\\\$\\\\{([^\\\\\\\\}]*(?:\\\\\\\\.[^\\\\\\\\}]*)*)\\\\}/g;\\n\\n /** Used to match `RegExp` flags from their coerced string values. */\\n var reFlags = /\\\\w*$/;\\n\\n /** Used to detect bad signed hexadecimal string values. */\\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\\n\\n /** Used to detect binary string values. */\\n var reIsBinary = /^0b[01]+$/i;\\n\\n /** Used to detect host constructors (Safari). */\\n var reIsHostCtor = /^\\\\[object .+?Constructor\\\\]$/;\\n\\n /** Used to detect octal string values. */\\n var reIsOctal = /^0o[0-7]+$/i;\\n\\n /** Used to detect unsigned integer values. */\\n var reIsUint = /^(?:0|[1-9]\\\\d*)$/;\\n\\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\\n var reLatin = /[\\\\xc0-\\\\xd6\\\\xd8-\\\\xf6\\\\xf8-\\\\xff\\\\u0100-\\\\u017f]/g;\\n\\n /** Used to ensure capturing order of template delimiters. */\\n var reNoMatch = /($^)/;\\n\\n /** Used to match unescaped characters in compiled string literals. */\\n var reUnescapedString = /['\\\\n\\\\r\\\\u2028\\\\u2029\\\\\\\\]/g;\\n\\n /** Used to compose unicode character classes. */\\n var rsAstralRange = '\\\\\\\\ud800-\\\\\\\\udfff',\\n rsComboMarksRange = '\\\\\\\\u0300-\\\\\\\\u036f',\\n reComboHalfMarksRange = '\\\\\\\\ufe20-\\\\\\\\ufe2f',\\n rsComboSymbolsRange = '\\\\\\\\u20d0-\\\\\\\\u20ff',\\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\\n rsDingbatRange = '\\\\\\\\u2700-\\\\\\\\u27bf',\\n rsLowerRange = 'a-z\\\\\\\\xdf-\\\\\\\\xf6\\\\\\\\xf8-\\\\\\\\xff',\\n rsMathOpRange = '\\\\\\\\xac\\\\\\\\xb1\\\\\\\\xd7\\\\\\\\xf7',\\n rsNonCharRange = '\\\\\\\\x00-\\\\\\\\x2f\\\\\\\\x3a-\\\\\\\\x40\\\\\\\\x5b-\\\\\\\\x60\\\\\\\\x7b-\\\\\\\\xbf',\\n rsPunctuationRange = '\\\\\\\\u2000-\\\\\\\\u206f',\\n rsSpaceRange = ' \\\\\\\\t\\\\\\\\x0b\\\\\\\\f\\\\\\\\xa0\\\\\\\\ufeff\\\\\\\\n\\\\\\\\r\\\\\\\\u2028\\\\\\\\u2029\\\\\\\\u1680\\\\\\\\u180e\\\\\\\\u2000\\\\\\\\u2001\\\\\\\\u2002\\\\\\\\u2003\\\\\\\\u2004\\\\\\\\u2005\\\\\\\\u2006\\\\\\\\u2007\\\\\\\\u2008\\\\\\\\u2009\\\\\\\\u200a\\\\\\\\u202f\\\\\\\\u205f\\\\\\\\u3000',\\n rsUpperRange = 'A-Z\\\\\\\\xc0-\\\\\\\\xd6\\\\\\\\xd8-\\\\\\\\xde',\\n rsVarRange = '\\\\\\\\ufe0e\\\\\\\\ufe0f',\\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\\n\\n /** Used to compose unicode capture groups. */\\n var rsApos = \\\"['\\\\u2019]\\\",\\n rsAstral = '[' + rsAstralRange + ']',\\n rsBreak = '[' + rsBreakRange + ']',\\n rsCombo = '[' + rsComboRange + ']',\\n rsDigits = '\\\\\\\\d+',\\n rsDingbat = '[' + rsDingbatRange + ']',\\n rsLower = '[' + rsLowerRange + ']',\\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\\n rsFitz = '\\\\\\\\ud83c[\\\\\\\\udffb-\\\\\\\\udfff]',\\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\\n rsNonAstral = '[^' + rsAstralRange + ']',\\n rsRegional = '(?:\\\\\\\\ud83c[\\\\\\\\udde6-\\\\\\\\uddff]){2}',\\n rsSurrPair = '[\\\\\\\\ud800-\\\\\\\\udbff][\\\\\\\\udc00-\\\\\\\\udfff]',\\n rsUpper = '[' + rsUpperRange + ']',\\n rsZWJ = '\\\\\\\\u200d';\\n\\n /** Used to compose unicode regexes. */\\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\\n reOptMod = rsModifier + '?',\\n rsOptVar = '[' + rsVarRange + ']?',\\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\\n rsOrdLower = '\\\\\\\\d*(?:(?:1st|2nd|3rd|(?![123])\\\\\\\\dth)\\\\\\\\b)',\\n rsOrdUpper = '\\\\\\\\d*(?:(?:1ST|2ND|3RD|(?![123])\\\\\\\\dTH)\\\\\\\\b)',\\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\\n\\n /** Used to match apostrophes. */\\n var reApos = RegExp(rsApos, 'g');\\n\\n /**\\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\\n */\\n var reComboMark = RegExp(rsCombo, 'g');\\n\\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\\n\\n /** Used to match complex or compound words. */\\n var reUnicodeWord = RegExp([\\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\\n rsUpper + '+' + rsOptContrUpper,\\n rsOrdUpper,\\n rsOrdLower,\\n rsDigits,\\n rsEmoji\\n ].join('|'), 'g');\\n\\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\\n\\n /** Used to detect strings that need a more robust regexp to match words. */\\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\\n\\n /** Used to assign default `context` object properties. */\\n var contextProps = [\\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\\n ];\\n\\n /** Used to make template sourceURLs easier to identify. */\\n var templateCounter = -1;\\n\\n /** Used to identify `toStringTag` values of typed arrays. */\\n var typedArrayTags = {};\\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\\n typedArrayTags[uint32Tag] = true;\\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\\n typedArrayTags[weakMapTag] = false;\\n\\n /** Used to identify `toStringTag` values supported by `_.clone`. */\\n var cloneableTags = {};\\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\\n cloneableTags[boolTag] = cloneableTags[dateTag] =\\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\\n cloneableTags[numberTag] = cloneableTags[objectTag] =\\n cloneableTags[regexpTag] = cloneableTags[setTag] =\\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\\n cloneableTags[errorTag] = cloneableTags[funcTag] =\\n cloneableTags[weakMapTag] = false;\\n\\n /** Used to map Latin Unicode letters to basic Latin letters. */\\n var deburredLetters = {\\n // Latin-1 Supplement block.\\n '\\\\xc0': 'A', '\\\\xc1': 'A', '\\\\xc2': 'A', '\\\\xc3': 'A', '\\\\xc4': 'A', '\\\\xc5': 'A',\\n '\\\\xe0': 'a', '\\\\xe1': 'a', '\\\\xe2': 'a', '\\\\xe3': 'a', '\\\\xe4': 'a', '\\\\xe5': 'a',\\n '\\\\xc7': 'C', '\\\\xe7': 'c',\\n '\\\\xd0': 'D', '\\\\xf0': 'd',\\n '\\\\xc8': 'E', '\\\\xc9': 'E', '\\\\xca': 'E', '\\\\xcb': 'E',\\n '\\\\xe8': 'e', '\\\\xe9': 'e', '\\\\xea': 'e', '\\\\xeb': 'e',\\n '\\\\xcc': 'I', '\\\\xcd': 'I', '\\\\xce': 'I', '\\\\xcf': 'I',\\n '\\\\xec': 'i', '\\\\xed': 'i', '\\\\xee': 'i', '\\\\xef': 'i',\\n '\\\\xd1': 'N', '\\\\xf1': 'n',\\n '\\\\xd2': 'O', '\\\\xd3': 'O', '\\\\xd4': 'O', '\\\\xd5': 'O', '\\\\xd6': 'O', '\\\\xd8': 'O',\\n '\\\\xf2': 'o', '\\\\xf3': 'o', '\\\\xf4': 'o', '\\\\xf5': 'o', '\\\\xf6': 'o', '\\\\xf8': 'o',\\n '\\\\xd9': 'U', '\\\\xda': 'U', '\\\\xdb': 'U', '\\\\xdc': 'U',\\n '\\\\xf9': 'u', '\\\\xfa': 'u', '\\\\xfb': 'u', '\\\\xfc': 'u',\\n '\\\\xdd': 'Y', '\\\\xfd': 'y', '\\\\xff': 'y',\\n '\\\\xc6': 'Ae', '\\\\xe6': 'ae',\\n '\\\\xde': 'Th', '\\\\xfe': 'th',\\n '\\\\xdf': 'ss',\\n // Latin Extended-A block.\\n '\\\\u0100': 'A', '\\\\u0102': 'A', '\\\\u0104': 'A',\\n '\\\\u0101': 'a', '\\\\u0103': 'a', '\\\\u0105': 'a',\\n '\\\\u0106': 'C', '\\\\u0108': 'C', '\\\\u010a': 'C', '\\\\u010c': 'C',\\n '\\\\u0107': 'c', '\\\\u0109': 'c', '\\\\u010b': 'c', '\\\\u010d': 'c',\\n '\\\\u010e': 'D', '\\\\u0110': 'D', '\\\\u010f': 'd', '\\\\u0111': 'd',\\n '\\\\u0112': 'E', '\\\\u0114': 'E', '\\\\u0116': 'E', '\\\\u0118': 'E', '\\\\u011a': 'E',\\n '\\\\u0113': 'e', '\\\\u0115': 'e', '\\\\u0117': 'e', '\\\\u0119': 'e', '\\\\u011b': 'e',\\n '\\\\u011c': 'G', '\\\\u011e': 'G', '\\\\u0120': 'G', '\\\\u0122': 'G',\\n '\\\\u011d': 'g', '\\\\u011f': 'g', '\\\\u0121': 'g', '\\\\u0123': 'g',\\n '\\\\u0124': 'H', '\\\\u0126': 'H', '\\\\u0125': 'h', '\\\\u0127': 'h',\\n '\\\\u0128': 'I', '\\\\u012a': 'I', '\\\\u012c': 'I', '\\\\u012e': 'I', '\\\\u0130': 'I',\\n '\\\\u0129': 'i', '\\\\u012b': 'i', '\\\\u012d': 'i', '\\\\u012f': 'i', '\\\\u0131': 'i',\\n '\\\\u0134': 'J', '\\\\u0135': 'j',\\n '\\\\u0136': 'K', '\\\\u0137': 'k', '\\\\u0138': 'k',\\n '\\\\u0139': 'L', '\\\\u013b': 'L', '\\\\u013d': 'L', '\\\\u013f': 'L', '\\\\u0141': 'L',\\n '\\\\u013a': 'l', '\\\\u013c': 'l', '\\\\u013e': 'l', '\\\\u0140': 'l', '\\\\u0142': 'l',\\n '\\\\u0143': 'N', '\\\\u0145': 'N', '\\\\u0147': 'N', '\\\\u014a': 'N',\\n '\\\\u0144': 'n', '\\\\u0146': 'n', '\\\\u0148': 'n', '\\\\u014b': 'n',\\n '\\\\u014c': 'O', '\\\\u014e': 'O', '\\\\u0150': 'O',\\n '\\\\u014d': 'o', '\\\\u014f': 'o', '\\\\u0151': 'o',\\n '\\\\u0154': 'R', '\\\\u0156': 'R', '\\\\u0158': 'R',\\n '\\\\u0155': 'r', '\\\\u0157': 'r', '\\\\u0159': 'r',\\n '\\\\u015a': 'S', '\\\\u015c': 'S', '\\\\u015e': 'S', '\\\\u0160': 'S',\\n '\\\\u015b': 's', '\\\\u015d': 's', '\\\\u015f': 's', '\\\\u0161': 's',\\n '\\\\u0162': 'T', '\\\\u0164': 'T', '\\\\u0166': 'T',\\n '\\\\u0163': 't', '\\\\u0165': 't', '\\\\u0167': 't',\\n '\\\\u0168': 'U', '\\\\u016a': 'U', '\\\\u016c': 'U', '\\\\u016e': 'U', '\\\\u0170': 'U', '\\\\u0172': 'U',\\n '\\\\u0169': 'u', '\\\\u016b': 'u', '\\\\u016d': 'u', '\\\\u016f': 'u', '\\\\u0171': 'u', '\\\\u0173': 'u',\\n '\\\\u0174': 'W', '\\\\u0175': 'w',\\n '\\\\u0176': 'Y', '\\\\u0177': 'y', '\\\\u0178': 'Y',\\n '\\\\u0179': 'Z', '\\\\u017b': 'Z', '\\\\u017d': 'Z',\\n '\\\\u017a': 'z', '\\\\u017c': 'z', '\\\\u017e': 'z',\\n '\\\\u0132': 'IJ', '\\\\u0133': 'ij',\\n '\\\\u0152': 'Oe', '\\\\u0153': 'oe',\\n '\\\\u0149': \\\"'n\\\", '\\\\u017f': 's'\\n };\\n\\n /** Used to map characters to HTML entities. */\\n var htmlEscapes = {\\n '&': '&',\\n '<': '<',\\n '>': '>',\\n '\\\"': '"',\\n \\\"'\\\": '''\\n };\\n\\n /** Used to map HTML entities to characters. */\\n var htmlUnescapes = {\\n '&': '&',\\n '<': '<',\\n '>': '>',\\n '"': '\\\"',\\n ''': \\\"'\\\"\\n };\\n\\n /** Used to escape characters for inclusion in compiled string literals. */\\n var stringEscapes = {\\n '\\\\\\\\': '\\\\\\\\',\\n \\\"'\\\": \\\"'\\\",\\n '\\\\n': 'n',\\n '\\\\r': 'r',\\n '\\\\u2028': 'u2028',\\n '\\\\u2029': 'u2029'\\n };\\n\\n /** Built-in method references without a dependency on `root`. */\\n var freeParseFloat = parseFloat,\\n freeParseInt = parseInt;\\n\\n /** Detect free variable `global` from Node.js. */\\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\\n\\n /** Detect free variable `self`. */\\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\\n\\n /** Used as a reference to the global object. */\\n var root = freeGlobal || freeSelf || Function('return this')();\\n\\n /** Detect free variable `exports`. */\\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\\n\\n /** Detect free variable `module`. */\\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\\n\\n /** Detect the popular CommonJS extension `module.exports`. */\\n var moduleExports = freeModule && freeModule.exports === freeExports;\\n\\n /** Detect free variable `process` from Node.js. */\\n var freeProcess = moduleExports && freeGlobal.process;\\n\\n /** Used to access faster Node.js helpers. */\\n var nodeUtil = (function() {\\n try {\\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\\n } catch (e) {}\\n }());\\n\\n /* Node.js helper references. */\\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\\n nodeIsDate = nodeUtil && nodeUtil.isDate,\\n nodeIsMap = nodeUtil && nodeUtil.isMap,\\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\\n nodeIsSet = nodeUtil && nodeUtil.isSet,\\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\\n\\n /*--------------------------------------------------------------------------*/\\n\\n /**\\n * Adds the key-value `pair` to `map`.\\n *\\n * @private\\n * @param {Object} map The map to modify.\\n * @param {Array} pair The key-value pair to add.\\n * @returns {Object} Returns `map`.\\n */\\n function addMapEntry(map, pair) {\\n // Don't return `map.set` because it's not chainable in IE 11.\\n map.set(pair[0], pair[1]);\\n return map;\\n }\\n\\n /**\\n * Adds `value` to `set`.\\n *\\n * @private\\n * @param {Object} set The set to modify.\\n * @param {*} value The value to add.\\n * @returns {Object} Returns `set`.\\n */\\n function addSetEntry(set, value) {\\n // Don't return `set.add` because it's not chainable in IE 11.\\n set.add(value);\\n return set;\\n }\\n\\n /**\\n * A faster alternative to `Function#apply`, this function invokes `func`\\n * with the `this` binding of `thisArg` and the arguments of `args`.\\n *\\n * @private\\n * @param {Function} func The function to invoke.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {Array} args The arguments to invoke `func` with.\\n * @returns {*} Returns the result of `func`.\\n */\\n function apply(func, thisArg, args) {\\n switch (args.length) {\\n case 0: return func.call(thisArg);\\n case 1: return func.call(thisArg, args[0]);\\n case 2: return func.call(thisArg, args[0], args[1]);\\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\\n }\\n return func.apply(thisArg, args);\\n }\\n\\n /**\\n * A specialized version of `baseAggregator` for arrays.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform keys.\\n * @param {Object} accumulator The initial aggregated object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function arrayAggregator(array, setter, iteratee, accumulator) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n var value = array[index];\\n setter(accumulator, value, iteratee(value), array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.forEach` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayEach(array, iteratee) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (iteratee(array[index], index, array) === false) {\\n break;\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.forEachRight` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayEachRight(array, iteratee) {\\n var length = array == null ? 0 : array.length;\\n\\n while (length--) {\\n if (iteratee(array[length], length, array) === false) {\\n break;\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.every` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`.\\n */\\n function arrayEvery(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (!predicate(array[index], index, array)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * A specialized version of `_.filter` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n */\\n function arrayFilter(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (predicate(value, index, array)) {\\n result[resIndex++] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.includes` for arrays without support for\\n * specifying an index to search from.\\n *\\n * @private\\n * @param {Array} [array] The array to inspect.\\n * @param {*} target The value to search for.\\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\\n */\\n function arrayIncludes(array, value) {\\n var length = array == null ? 0 : array.length;\\n return !!length && baseIndexOf(array, value, 0) > -1;\\n }\\n\\n /**\\n * This function is like `arrayIncludes` except that it accepts a comparator.\\n *\\n * @private\\n * @param {Array} [array] The array to inspect.\\n * @param {*} target The value to search for.\\n * @param {Function} comparator The comparator invoked per element.\\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\\n */\\n function arrayIncludesWith(array, value, comparator) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (comparator(value, array[index])) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * A specialized version of `_.map` for arrays without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n */\\n function arrayMap(array, iteratee) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n result = Array(length);\\n\\n while (++index < length) {\\n result[index] = iteratee(array[index], index, array);\\n }\\n return result;\\n }\\n\\n /**\\n * Appends the elements of `values` to `array`.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to append.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayPush(array, values) {\\n var index = -1,\\n length = values.length,\\n offset = array.length;\\n\\n while (++index < length) {\\n array[offset + index] = values[index];\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.reduce` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @param {boolean} [initAccum] Specify using the first element of `array` as\\n * the initial value.\\n * @returns {*} Returns the accumulated value.\\n */\\n function arrayReduce(array, iteratee, accumulator, initAccum) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n if (initAccum && length) {\\n accumulator = array[++index];\\n }\\n while (++index < length) {\\n accumulator = iteratee(accumulator, array[index], index, array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.reduceRight` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @param {boolean} [initAccum] Specify using the last element of `array` as\\n * the initial value.\\n * @returns {*} Returns the accumulated value.\\n */\\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\\n var length = array == null ? 0 : array.length;\\n if (initAccum && length) {\\n accumulator = array[--length];\\n }\\n while (length--) {\\n accumulator = iteratee(accumulator, array[length], length, array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.some` for arrays without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n */\\n function arraySome(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (predicate(array[index], index, array)) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * Gets the size of an ASCII `string`.\\n *\\n * @private\\n * @param {string} string The string inspect.\\n * @returns {number} Returns the string size.\\n */\\n var asciiSize = baseProperty('length');\\n\\n /**\\n * Converts an ASCII `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function asciiToArray(string) {\\n return string.split('');\\n }\\n\\n /**\\n * Splits an ASCII `string` into an array of its words.\\n *\\n * @private\\n * @param {string} The string to inspect.\\n * @returns {Array} Returns the words of `string`.\\n */\\n function asciiWords(string) {\\n return string.match(reAsciiWord) || [];\\n }\\n\\n /**\\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\\n * without support for iteratee shorthands, which iterates over `collection`\\n * using `eachFunc`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {Function} eachFunc The function to iterate over `collection`.\\n * @returns {*} Returns the found element or its key, else `undefined`.\\n */\\n function baseFindKey(collection, predicate, eachFunc) {\\n var result;\\n eachFunc(collection, function(value, key, collection) {\\n if (predicate(value, key, collection)) {\\n result = key;\\n return false;\\n }\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\\n * support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {number} fromIndex The index to search from.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\\n var length = array.length,\\n index = fromIndex + (fromRight ? 1 : -1);\\n\\n while ((fromRight ? index-- : ++index < length)) {\\n if (predicate(array[index], index, array)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseIndexOf(array, value, fromIndex) {\\n return value === value\\n ? strictIndexOf(array, value, fromIndex)\\n : baseFindIndex(array, baseIsNaN, fromIndex);\\n }\\n\\n /**\\n * This function is like `baseIndexOf` except that it accepts a comparator.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @param {Function} comparator The comparator invoked per element.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseIndexOfWith(array, value, fromIndex, comparator) {\\n var index = fromIndex - 1,\\n length = array.length;\\n\\n while (++index < length) {\\n if (comparator(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * The base implementation of `_.isNaN` without support for number objects.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\\n */\\n function baseIsNaN(value) {\\n return value !== value;\\n }\\n\\n /**\\n * The base implementation of `_.mean` and `_.meanBy` without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {number} Returns the mean.\\n */\\n function baseMean(array, iteratee) {\\n var length = array == null ? 0 : array.length;\\n return length ? (baseSum(array, iteratee) / length) : NAN;\\n }\\n\\n /**\\n * The base implementation of `_.property` without support for deep paths.\\n *\\n * @private\\n * @param {string} key The key of the property to get.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function baseProperty(key) {\\n return function(object) {\\n return object == null ? undefined : object[key];\\n };\\n }\\n\\n /**\\n * The base implementation of `_.propertyOf` without support for deep paths.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function basePropertyOf(object) {\\n return function(key) {\\n return object == null ? undefined : object[key];\\n };\\n }\\n\\n /**\\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} accumulator The initial value.\\n * @param {boolean} initAccum Specify using the first or last element of\\n * `collection` as the initial value.\\n * @param {Function} eachFunc The function to iterate over `collection`.\\n * @returns {*} Returns the accumulated value.\\n */\\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\\n eachFunc(collection, function(value, index, collection) {\\n accumulator = initAccum\\n ? (initAccum = false, value)\\n : iteratee(accumulator, value, index, collection);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.sortBy` which uses `comparer` to define the\\n * sort order of `array` and replaces criteria objects with their corresponding\\n * values.\\n *\\n * @private\\n * @param {Array} array The array to sort.\\n * @param {Function} comparer The function to define sort order.\\n * @returns {Array} Returns `array`.\\n */\\n function baseSortBy(array, comparer) {\\n var length = array.length;\\n\\n array.sort(comparer);\\n while (length--) {\\n array[length] = array[length].value;\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.sum` and `_.sumBy` without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {number} Returns the sum.\\n */\\n function baseSum(array, iteratee) {\\n var result,\\n index = -1,\\n length = array.length;\\n\\n while (++index < length) {\\n var current = iteratee(array[index]);\\n if (current !== undefined) {\\n result = result === undefined ? current : (result + current);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.times` without support for iteratee shorthands\\n * or max array length checks.\\n *\\n * @private\\n * @param {number} n The number of times to invoke `iteratee`.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the array of results.\\n */\\n function baseTimes(n, iteratee) {\\n var index = -1,\\n result = Array(n);\\n\\n while (++index < n) {\\n result[index] = iteratee(index);\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\\n * of key-value pairs for `object` corresponding to the property names of `props`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} props The property names to get values for.\\n * @returns {Object} Returns the key-value pairs.\\n */\\n function baseToPairs(object, props) {\\n return arrayMap(props, function(key) {\\n return [key, object[key]];\\n });\\n }\\n\\n /**\\n * The base implementation of `_.unary` without support for storing metadata.\\n *\\n * @private\\n * @param {Function} func The function to cap arguments for.\\n * @returns {Function} Returns the new capped function.\\n */\\n function baseUnary(func) {\\n return function(value) {\\n return func(value);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.values` and `_.valuesIn` which creates an\\n * array of `object` property values corresponding to the property names\\n * of `props`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} props The property names to get values for.\\n * @returns {Object} Returns the array of property values.\\n */\\n function baseValues(object, props) {\\n return arrayMap(props, function(key) {\\n return object[key];\\n });\\n }\\n\\n /**\\n * Checks if a `cache` value for `key` exists.\\n *\\n * @private\\n * @param {Object} cache The cache to query.\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function cacheHas(cache, key) {\\n return cache.has(key);\\n }\\n\\n /**\\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\\n * that is not found in the character symbols.\\n *\\n * @private\\n * @param {Array} strSymbols The string symbols to inspect.\\n * @param {Array} chrSymbols The character symbols to find.\\n * @returns {number} Returns the index of the first unmatched string symbol.\\n */\\n function charsStartIndex(strSymbols, chrSymbols) {\\n var index = -1,\\n length = strSymbols.length;\\n\\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\\n return index;\\n }\\n\\n /**\\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\\n * that is not found in the character symbols.\\n *\\n * @private\\n * @param {Array} strSymbols The string symbols to inspect.\\n * @param {Array} chrSymbols The character symbols to find.\\n * @returns {number} Returns the index of the last unmatched string symbol.\\n */\\n function charsEndIndex(strSymbols, chrSymbols) {\\n var index = strSymbols.length;\\n\\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\\n return index;\\n }\\n\\n /**\\n * Gets the number of `placeholder` occurrences in `array`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} placeholder The placeholder to search for.\\n * @returns {number} Returns the placeholder count.\\n */\\n function countHolders(array, placeholder) {\\n var length = array.length,\\n result = 0;\\n\\n while (length--) {\\n if (array[length] === placeholder) {\\n ++result;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\\n * letters to basic Latin letters.\\n *\\n * @private\\n * @param {string} letter The matched letter to deburr.\\n * @returns {string} Returns the deburred letter.\\n */\\n var deburrLetter = basePropertyOf(deburredLetters);\\n\\n /**\\n * Used by `_.escape` to convert characters to HTML entities.\\n *\\n * @private\\n * @param {string} chr The matched character to escape.\\n * @returns {string} Returns the escaped character.\\n */\\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\\n\\n /**\\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\\n *\\n * @private\\n * @param {string} chr The matched character to escape.\\n * @returns {string} Returns the escaped character.\\n */\\n function escapeStringChar(chr) {\\n return '\\\\\\\\' + stringEscapes[chr];\\n }\\n\\n /**\\n * Gets the value at `key` of `object`.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {string} key The key of the property to get.\\n * @returns {*} Returns the property value.\\n */\\n function getValue(object, key) {\\n return object == null ? undefined : object[key];\\n }\\n\\n /**\\n * Checks if `string` contains Unicode symbols.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\\n */\\n function hasUnicode(string) {\\n return reHasUnicode.test(string);\\n }\\n\\n /**\\n * Checks if `string` contains a word composed of Unicode symbols.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {boolean} Returns `true` if a word is found, else `false`.\\n */\\n function hasUnicodeWord(string) {\\n return reHasUnicodeWord.test(string);\\n }\\n\\n /**\\n * Converts `iterator` to an array.\\n *\\n * @private\\n * @param {Object} iterator The iterator to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function iteratorToArray(iterator) {\\n var data,\\n result = [];\\n\\n while (!(data = iterator.next()).done) {\\n result.push(data.value);\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `map` to its key-value pairs.\\n *\\n * @private\\n * @param {Object} map The map to convert.\\n * @returns {Array} Returns the key-value pairs.\\n */\\n function mapToArray(map) {\\n var index = -1,\\n result = Array(map.size);\\n\\n map.forEach(function(value, key) {\\n result[++index] = [key, value];\\n });\\n return result;\\n }\\n\\n /**\\n * Creates a unary function that invokes `func` with its argument transformed.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {Function} transform The argument transform.\\n * @returns {Function} Returns the new function.\\n */\\n function overArg(func, transform) {\\n return function(arg) {\\n return func(transform(arg));\\n };\\n }\\n\\n /**\\n * Replaces all `placeholder` elements in `array` with an internal placeholder\\n * and returns an array of their indexes.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {*} placeholder The placeholder to replace.\\n * @returns {Array} Returns the new array of placeholder indexes.\\n */\\n function replaceHolders(array, placeholder) {\\n var index = -1,\\n length = array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (value === placeholder || value === PLACEHOLDER) {\\n array[index] = PLACEHOLDER;\\n result[resIndex++] = index;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `set` to an array of its values.\\n *\\n * @private\\n * @param {Object} set The set to convert.\\n * @returns {Array} Returns the values.\\n */\\n function setToArray(set) {\\n var index = -1,\\n result = Array(set.size);\\n\\n set.forEach(function(value) {\\n result[++index] = value;\\n });\\n return result;\\n }\\n\\n /**\\n * Converts `set` to its value-value pairs.\\n *\\n * @private\\n * @param {Object} set The set to convert.\\n * @returns {Array} Returns the value-value pairs.\\n */\\n function setToPairs(set) {\\n var index = -1,\\n result = Array(set.size);\\n\\n set.forEach(function(value) {\\n result[++index] = [value, value];\\n });\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.indexOf` which performs strict equality\\n * comparisons of values, i.e. `===`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function strictIndexOf(array, value, fromIndex) {\\n var index = fromIndex - 1,\\n length = array.length;\\n\\n while (++index < length) {\\n if (array[index] === value) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * A specialized version of `_.lastIndexOf` which performs strict equality\\n * comparisons of values, i.e. `===`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function strictLastIndexOf(array, value, fromIndex) {\\n var index = fromIndex + 1;\\n while (index--) {\\n if (array[index] === value) {\\n return index;\\n }\\n }\\n return index;\\n }\\n\\n /**\\n * Gets the number of symbols in `string`.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {number} Returns the string size.\\n */\\n function stringSize(string) {\\n return hasUnicode(string)\\n ? unicodeSize(string)\\n : asciiSize(string);\\n }\\n\\n /**\\n * Converts `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function stringToArray(string) {\\n return hasUnicode(string)\\n ? unicodeToArray(string)\\n : asciiToArray(string);\\n }\\n\\n /**\\n * Used by `_.unescape` to convert HTML entities to characters.\\n *\\n * @private\\n * @param {string} chr The matched character to unescape.\\n * @returns {string} Returns the unescaped character.\\n */\\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\\n\\n /**\\n * Gets the size of a Unicode `string`.\\n *\\n * @private\\n * @param {string} string The string inspect.\\n * @returns {number} Returns the string size.\\n */\\n function unicodeSize(string) {\\n var result = reUnicode.lastIndex = 0;\\n while (reUnicode.test(string)) {\\n ++result;\\n }\\n return result;\\n }\\n\\n /**\\n * Converts a Unicode `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function unicodeToArray(string) {\\n return string.match(reUnicode) || [];\\n }\\n\\n /**\\n * Splits a Unicode `string` into an array of its words.\\n *\\n * @private\\n * @param {string} The string to inspect.\\n * @returns {Array} Returns the words of `string`.\\n */\\n function unicodeWords(string) {\\n return string.match(reUnicodeWord) || [];\\n }\\n\\n /*--------------------------------------------------------------------------*/\\n\\n /**\\n * Create a new pristine `lodash` function using the `context` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Util\\n * @param {Object} [context=root] The context object.\\n * @returns {Function} Returns a new `lodash` function.\\n * @example\\n *\\n * _.mixin({ 'foo': _.constant('foo') });\\n *\\n * var lodash = _.runInContext();\\n * lodash.mixin({ 'bar': lodash.constant('bar') });\\n *\\n * _.isFunction(_.foo);\\n * // => true\\n * _.isFunction(_.bar);\\n * // => false\\n *\\n * lodash.isFunction(lodash.foo);\\n * // => false\\n * lodash.isFunction(lodash.bar);\\n * // => true\\n *\\n * // Create a suped-up `defer` in Node.js.\\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\\n */\\n var runInContext = (function runInContext(context) {\\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\\n\\n /** Built-in constructor references. */\\n var Array = context.Array,\\n Date = context.Date,\\n Error = context.Error,\\n Function = context.Function,\\n Math = context.Math,\\n Object = context.Object,\\n RegExp = context.RegExp,\\n String = context.String,\\n TypeError = context.TypeError;\\n\\n /** Used for built-in method references. */\\n var arrayProto = Array.prototype,\\n funcProto = Function.prototype,\\n objectProto = Object.prototype;\\n\\n /** Used to detect overreaching core-js shims. */\\n var coreJsData = context['__core-js_shared__'];\\n\\n /** Used to resolve the decompiled source of functions. */\\n var funcToString = funcProto.toString;\\n\\n /** Used to check objects for own properties. */\\n var hasOwnProperty = objectProto.hasOwnProperty;\\n\\n /** Used to generate unique IDs. */\\n var idCounter = 0;\\n\\n /** Used to detect methods masquerading as native. */\\n var maskSrcKey = (function() {\\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\\n return uid ? ('Symbol(src)_1.' + uid) : '';\\n }());\\n\\n /**\\n * Used to resolve the\\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\\n * of values.\\n */\\n var nativeObjectToString = objectProto.toString;\\n\\n /** Used to infer the `Object` constructor. */\\n var objectCtorString = funcToString.call(Object);\\n\\n /** Used to restore the original `_` reference in `_.noConflict`. */\\n var oldDash = root._;\\n\\n /** Used to detect if a method is native. */\\n var reIsNative = RegExp('^' +\\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\\\\\$&')\\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\\\\\\\()| for .+?(?=\\\\\\\\\\\\])/g, '$1.*?') + '$'\\n );\\n\\n /** Built-in value references. */\\n var Buffer = moduleExports ? context.Buffer : undefined,\\n Symbol = context.Symbol,\\n Uint8Array = context.Uint8Array,\\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\\n getPrototype = overArg(Object.getPrototypeOf, Object),\\n objectCreate = Object.create,\\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\\n splice = arrayProto.splice,\\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\\n symIterator = Symbol ? Symbol.iterator : undefined,\\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\\n\\n var defineProperty = (function() {\\n try {\\n var func = getNative(Object, 'defineProperty');\\n func({}, '', {});\\n return func;\\n } catch (e) {}\\n }());\\n\\n /** Mocked built-ins. */\\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\\n\\n /* Built-in method references for those with the same name as other `lodash` methods. */\\n var nativeCeil = Math.ceil,\\n nativeFloor = Math.floor,\\n nativeGetSymbols = Object.getOwnPropertySymbols,\\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\\n nativeIsFinite = context.isFinite,\\n nativeJoin = arrayProto.join,\\n nativeKeys = overArg(Object.keys, Object),\\n nativeMax = Math.max,\\n nativeMin = Math.min,\\n nativeNow = Date.now,\\n nativeParseInt = context.parseInt,\\n nativeRandom = Math.random,\\n nativeReverse = arrayProto.reverse;\\n\\n /* Built-in method references that are verified to be native. */\\n var DataView = getNative(context, 'DataView'),\\n Map = getNative(context, 'Map'),\\n Promise = getNative(context, 'Promise'),\\n Set = getNative(context, 'Set'),\\n WeakMap = getNative(context, 'WeakMap'),\\n nativeCreate = getNative(Object, 'create');\\n\\n /** Used to store function metadata. */\\n var metaMap = WeakMap && new WeakMap;\\n\\n /** Used to lookup unminified function names. */\\n var realNames = {};\\n\\n /** Used to detect maps, sets, and weakmaps. */\\n var dataViewCtorString = toSource(DataView),\\n mapCtorString = toSource(Map),\\n promiseCtorString = toSource(Promise),\\n setCtorString = toSource(Set),\\n weakMapCtorString = toSource(WeakMap);\\n\\n /** Used to convert symbols to primitives and strings. */\\n var symbolProto = Symbol ? Symbol.prototype : undefined,\\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\\n symbolToString = symbolProto ? symbolProto.toString : undefined;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a `lodash` object which wraps `value` to enable implicit method\\n * chain sequences. Methods that operate on and return arrays, collections,\\n * and functions can be chained together. Methods that retrieve a single value\\n * or may return a primitive value will automatically end the chain sequence\\n * and return the unwrapped value. Otherwise, the value must be unwrapped\\n * with `_#value`.\\n *\\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\\n * enabled using `_.chain`.\\n *\\n * The execution of chained methods is lazy, that is, it's deferred until\\n * `_#value` is implicitly or explicitly called.\\n *\\n * Lazy evaluation allows several methods to support shortcut fusion.\\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\\n * the creation of intermediate arrays and can greatly reduce the number of\\n * iteratee executions. Sections of a chain sequence qualify for shortcut\\n * fusion if the section is applied to an array and iteratees accept only\\n * one argument. The heuristic for whether a section qualifies for shortcut\\n * fusion is subject to change.\\n *\\n * Chaining is supported in custom builds as long as the `_#value` method is\\n * directly or indirectly included in the build.\\n *\\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\\n *\\n * The wrapper `Array` methods are:\\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\\n *\\n * The wrapper `String` methods are:\\n * `replace` and `split`\\n *\\n * The wrapper methods that support shortcut fusion are:\\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\\n *\\n * The chainable wrapper methods are:\\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\\n * `zipObject`, `zipObjectDeep`, and `zipWith`\\n *\\n * The wrapper methods that are **not** chainable by default are:\\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\\n * `upperFirst`, `value`, and `words`\\n *\\n * @name _\\n * @constructor\\n * @category Seq\\n * @param {*} value The value to wrap in a `lodash` instance.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var wrapped = _([1, 2, 3]);\\n *\\n * // Returns an unwrapped value.\\n * wrapped.reduce(_.add);\\n * // => 6\\n *\\n * // Returns a wrapped value.\\n * var squares = wrapped.map(square);\\n *\\n * _.isArray(squares);\\n * // => false\\n *\\n * _.isArray(squares.value());\\n * // => true\\n */\\n function lodash(value) {\\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\\n if (value instanceof LodashWrapper) {\\n return value;\\n }\\n if (hasOwnProperty.call(value, '__wrapped__')) {\\n return wrapperClone(value);\\n }\\n }\\n return new LodashWrapper(value);\\n }\\n\\n /**\\n * The base implementation of `_.create` without support for assigning\\n * properties to the created object.\\n *\\n * @private\\n * @param {Object} proto The object to inherit from.\\n * @returns {Object} Returns the new object.\\n */\\n var baseCreate = (function() {\\n function object() {}\\n return function(proto) {\\n if (!isObject(proto)) {\\n return {};\\n }\\n if (objectCreate) {\\n return objectCreate(proto);\\n }\\n object.prototype = proto;\\n var result = new object;\\n object.prototype = undefined;\\n return result;\\n };\\n }());\\n\\n /**\\n * The function whose prototype chain sequence wrappers inherit from.\\n *\\n * @private\\n */\\n function baseLodash() {\\n // No operation performed.\\n }\\n\\n /**\\n * The base constructor for creating `lodash` wrapper objects.\\n *\\n * @private\\n * @param {*} value The value to wrap.\\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\\n */\\n function LodashWrapper(value, chainAll) {\\n this.__wrapped__ = value;\\n this.__actions__ = [];\\n this.__chain__ = !!chainAll;\\n this.__index__ = 0;\\n this.__values__ = undefined;\\n }\\n\\n /**\\n * By default, the template delimiters used by lodash are like those in\\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\\n * following template settings to use alternative delimiters.\\n *\\n * @static\\n * @memberOf _\\n * @type {Object}\\n */\\n lodash.templateSettings = {\\n\\n /**\\n * Used to detect `data` property values to be HTML-escaped.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'escape': reEscape,\\n\\n /**\\n * Used to detect code to be evaluated.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'evaluate': reEvaluate,\\n\\n /**\\n * Used to detect `data` property values to inject.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'interpolate': reInterpolate,\\n\\n /**\\n * Used to reference the data object in the template text.\\n *\\n * @memberOf _.templateSettings\\n * @type {string}\\n */\\n 'variable': '',\\n\\n /**\\n * Used to import variables into the compiled template.\\n *\\n * @memberOf _.templateSettings\\n * @type {Object}\\n */\\n 'imports': {\\n\\n /**\\n * A reference to the `lodash` function.\\n *\\n * @memberOf _.templateSettings.imports\\n * @type {Function}\\n */\\n '_': lodash\\n }\\n };\\n\\n // Ensure wrappers are instances of `baseLodash`.\\n lodash.prototype = baseLodash.prototype;\\n lodash.prototype.constructor = lodash;\\n\\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\\n LodashWrapper.prototype.constructor = LodashWrapper;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\\n *\\n * @private\\n * @constructor\\n * @param {*} value The value to wrap.\\n */\\n function LazyWrapper(value) {\\n this.__wrapped__ = value;\\n this.__actions__ = [];\\n this.__dir__ = 1;\\n this.__filtered__ = false;\\n this.__iteratees__ = [];\\n this.__takeCount__ = MAX_ARRAY_LENGTH;\\n this.__views__ = [];\\n }\\n\\n /**\\n * Creates a clone of the lazy wrapper object.\\n *\\n * @private\\n * @name clone\\n * @memberOf LazyWrapper\\n * @returns {Object} Returns the cloned `LazyWrapper` object.\\n */\\n function lazyClone() {\\n var result = new LazyWrapper(this.__wrapped__);\\n result.__actions__ = copyArray(this.__actions__);\\n result.__dir__ = this.__dir__;\\n result.__filtered__ = this.__filtered__;\\n result.__iteratees__ = copyArray(this.__iteratees__);\\n result.__takeCount__ = this.__takeCount__;\\n result.__views__ = copyArray(this.__views__);\\n return result;\\n }\\n\\n /**\\n * Reverses the direction of lazy iteration.\\n *\\n * @private\\n * @name reverse\\n * @memberOf LazyWrapper\\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\\n */\\n function lazyReverse() {\\n if (this.__filtered__) {\\n var result = new LazyWrapper(this);\\n result.__dir__ = -1;\\n result.__filtered__ = true;\\n } else {\\n result = this.clone();\\n result.__dir__ *= -1;\\n }\\n return result;\\n }\\n\\n /**\\n * Extracts the unwrapped value from its lazy wrapper.\\n *\\n * @private\\n * @name value\\n * @memberOf LazyWrapper\\n * @returns {*} Returns the unwrapped value.\\n */\\n function lazyValue() {\\n var array = this.__wrapped__.value(),\\n dir = this.__dir__,\\n isArr = isArray(array),\\n isRight = dir < 0,\\n arrLength = isArr ? array.length : 0,\\n view = getView(0, arrLength, this.__views__),\\n start = view.start,\\n end = view.end,\\n length = end - start,\\n index = isRight ? end : (start - 1),\\n iteratees = this.__iteratees__,\\n iterLength = iteratees.length,\\n resIndex = 0,\\n takeCount = nativeMin(length, this.__takeCount__);\\n\\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\\n return baseWrapperValue(array, this.__actions__);\\n }\\n var result = [];\\n\\n outer:\\n while (length-- && resIndex < takeCount) {\\n index += dir;\\n\\n var iterIndex = -1,\\n value = array[index];\\n\\n while (++iterIndex < iterLength) {\\n var data = iteratees[iterIndex],\\n iteratee = data.iteratee,\\n type = data.type,\\n computed = iteratee(value);\\n\\n if (type == LAZY_MAP_FLAG) {\\n value = computed;\\n } else if (!computed) {\\n if (type == LAZY_FILTER_FLAG) {\\n continue outer;\\n } else {\\n break outer;\\n }\\n }\\n }\\n result[resIndex++] = value;\\n }\\n return result;\\n }\\n\\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\\n LazyWrapper.prototype.constructor = LazyWrapper;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a hash object.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function Hash(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the hash.\\n *\\n * @private\\n * @name clear\\n * @memberOf Hash\\n */\\n function hashClear() {\\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the hash.\\n *\\n * @private\\n * @name delete\\n * @memberOf Hash\\n * @param {Object} hash The hash to modify.\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function hashDelete(key) {\\n var result = this.has(key) && delete this.__data__[key];\\n this.size -= result ? 1 : 0;\\n return result;\\n }\\n\\n /**\\n * Gets the hash value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf Hash\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function hashGet(key) {\\n var data = this.__data__;\\n if (nativeCreate) {\\n var result = data[key];\\n return result === HASH_UNDEFINED ? undefined : result;\\n }\\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\\n }\\n\\n /**\\n * Checks if a hash value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf Hash\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function hashHas(key) {\\n var data = this.__data__;\\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\\n }\\n\\n /**\\n * Sets the hash `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf Hash\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the hash instance.\\n */\\n function hashSet(key, value) {\\n var data = this.__data__;\\n this.size += this.has(key) ? 0 : 1;\\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\\n return this;\\n }\\n\\n // Add methods to `Hash`.\\n Hash.prototype.clear = hashClear;\\n Hash.prototype['delete'] = hashDelete;\\n Hash.prototype.get = hashGet;\\n Hash.prototype.has = hashHas;\\n Hash.prototype.set = hashSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an list cache object.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function ListCache(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the list cache.\\n *\\n * @private\\n * @name clear\\n * @memberOf ListCache\\n */\\n function listCacheClear() {\\n this.__data__ = [];\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the list cache.\\n *\\n * @private\\n * @name delete\\n * @memberOf ListCache\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function listCacheDelete(key) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n if (index < 0) {\\n return false;\\n }\\n var lastIndex = data.length - 1;\\n if (index == lastIndex) {\\n data.pop();\\n } else {\\n splice.call(data, index, 1);\\n }\\n --this.size;\\n return true;\\n }\\n\\n /**\\n * Gets the list cache value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf ListCache\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function listCacheGet(key) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n return index < 0 ? undefined : data[index][1];\\n }\\n\\n /**\\n * Checks if a list cache value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf ListCache\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function listCacheHas(key) {\\n return assocIndexOf(this.__data__, key) > -1;\\n }\\n\\n /**\\n * Sets the list cache `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf ListCache\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the list cache instance.\\n */\\n function listCacheSet(key, value) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n if (index < 0) {\\n ++this.size;\\n data.push([key, value]);\\n } else {\\n data[index][1] = value;\\n }\\n return this;\\n }\\n\\n // Add methods to `ListCache`.\\n ListCache.prototype.clear = listCacheClear;\\n ListCache.prototype['delete'] = listCacheDelete;\\n ListCache.prototype.get = listCacheGet;\\n ListCache.prototype.has = listCacheHas;\\n ListCache.prototype.set = listCacheSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a map cache object to store key-value pairs.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function MapCache(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the map.\\n *\\n * @private\\n * @name clear\\n * @memberOf MapCache\\n */\\n function mapCacheClear() {\\n this.size = 0;\\n this.__data__ = {\\n 'hash': new Hash,\\n 'map': new (Map || ListCache),\\n 'string': new Hash\\n };\\n }\\n\\n /**\\n * Removes `key` and its value from the map.\\n *\\n * @private\\n * @name delete\\n * @memberOf MapCache\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function mapCacheDelete(key) {\\n var result = getMapData(this, key)['delete'](key);\\n this.size -= result ? 1 : 0;\\n return result;\\n }\\n\\n /**\\n * Gets the map value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf MapCache\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function mapCacheGet(key) {\\n return getMapData(this, key).get(key);\\n }\\n\\n /**\\n * Checks if a map value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf MapCache\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function mapCacheHas(key) {\\n return getMapData(this, key).has(key);\\n }\\n\\n /**\\n * Sets the map `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf MapCache\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the map cache instance.\\n */\\n function mapCacheSet(key, value) {\\n var data = getMapData(this, key),\\n size = data.size;\\n\\n data.set(key, value);\\n this.size += data.size == size ? 0 : 1;\\n return this;\\n }\\n\\n // Add methods to `MapCache`.\\n MapCache.prototype.clear = mapCacheClear;\\n MapCache.prototype['delete'] = mapCacheDelete;\\n MapCache.prototype.get = mapCacheGet;\\n MapCache.prototype.has = mapCacheHas;\\n MapCache.prototype.set = mapCacheSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n *\\n * Creates an array cache object to store unique values.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [values] The values to cache.\\n */\\n function SetCache(values) {\\n var index = -1,\\n length = values == null ? 0 : values.length;\\n\\n this.__data__ = new MapCache;\\n while (++index < length) {\\n this.add(values[index]);\\n }\\n }\\n\\n /**\\n * Adds `value` to the array cache.\\n *\\n * @private\\n * @name add\\n * @memberOf SetCache\\n * @alias push\\n * @param {*} value The value to cache.\\n * @returns {Object} Returns the cache instance.\\n */\\n function setCacheAdd(value) {\\n this.__data__.set(value, HASH_UNDEFINED);\\n return this;\\n }\\n\\n /**\\n * Checks if `value` is in the array cache.\\n *\\n * @private\\n * @name has\\n * @memberOf SetCache\\n * @param {*} value The value to search for.\\n * @returns {number} Returns `true` if `value` is found, else `false`.\\n */\\n function setCacheHas(value) {\\n return this.__data__.has(value);\\n }\\n\\n // Add methods to `SetCache`.\\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\\n SetCache.prototype.has = setCacheHas;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a stack cache object to store key-value pairs.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function Stack(entries) {\\n var data = this.__data__ = new ListCache(entries);\\n this.size = data.size;\\n }\\n\\n /**\\n * Removes all key-value entries from the stack.\\n *\\n * @private\\n * @name clear\\n * @memberOf Stack\\n */\\n function stackClear() {\\n this.__data__ = new ListCache;\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the stack.\\n *\\n * @private\\n * @name delete\\n * @memberOf Stack\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function stackDelete(key) {\\n var data = this.__data__,\\n result = data['delete'](key);\\n\\n this.size = data.size;\\n return result;\\n }\\n\\n /**\\n * Gets the stack value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf Stack\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function stackGet(key) {\\n return this.__data__.get(key);\\n }\\n\\n /**\\n * Checks if a stack value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf Stack\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function stackHas(key) {\\n return this.__data__.has(key);\\n }\\n\\n /**\\n * Sets the stack `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf Stack\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the stack cache instance.\\n */\\n function stackSet(key, value) {\\n var data = this.__data__;\\n if (data instanceof ListCache) {\\n var pairs = data.__data__;\\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\\n pairs.push([key, value]);\\n this.size = ++data.size;\\n return this;\\n }\\n data = this.__data__ = new MapCache(pairs);\\n }\\n data.set(key, value);\\n this.size = data.size;\\n return this;\\n }\\n\\n // Add methods to `Stack`.\\n Stack.prototype.clear = stackClear;\\n Stack.prototype['delete'] = stackDelete;\\n Stack.prototype.get = stackGet;\\n Stack.prototype.has = stackHas;\\n Stack.prototype.set = stackSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an array of the enumerable property names of the array-like `value`.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @param {boolean} inherited Specify returning inherited property names.\\n * @returns {Array} Returns the array of property names.\\n */\\n function arrayLikeKeys(value, inherited) {\\n var isArr = isArray(value),\\n isArg = !isArr && isArguments(value),\\n isBuff = !isArr && !isArg && isBuffer(value),\\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\\n skipIndexes = isArr || isArg || isBuff || isType,\\n result = skipIndexes ? baseTimes(value.length, String) : [],\\n length = result.length;\\n\\n for (var key in value) {\\n if ((inherited || hasOwnProperty.call(value, key)) &&\\n !(skipIndexes && (\\n // Safari 9 has enumerable `arguments.length` in strict mode.\\n key == 'length' ||\\n // Node.js 0.10 has enumerable non-index properties on buffers.\\n (isBuff && (key == 'offset' || key == 'parent')) ||\\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\\n // Skip index properties.\\n isIndex(key, length)\\n ))) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.sample` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to sample.\\n * @returns {*} Returns the random element.\\n */\\n function arraySample(array) {\\n var length = array.length;\\n return length ? array[baseRandom(0, length - 1)] : undefined;\\n }\\n\\n /**\\n * A specialized version of `_.sampleSize` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to sample.\\n * @param {number} n The number of elements to sample.\\n * @returns {Array} Returns the random elements.\\n */\\n function arraySampleSize(array, n) {\\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\\n }\\n\\n /**\\n * A specialized version of `_.shuffle` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n */\\n function arrayShuffle(array) {\\n return shuffleSelf(copyArray(array));\\n }\\n\\n /**\\n * This function is like `assignValue` except that it doesn't assign\\n * `undefined` values.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function assignMergeValue(object, key, value) {\\n if ((value !== undefined && !eq(object[key], value)) ||\\n (value === undefined && !(key in object))) {\\n baseAssignValue(object, key, value);\\n }\\n }\\n\\n /**\\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function assignValue(object, key, value) {\\n var objValue = object[key];\\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\\n (value === undefined && !(key in object))) {\\n baseAssignValue(object, key, value);\\n }\\n }\\n\\n /**\\n * Gets the index at which the `key` is found in `array` of key-value pairs.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} key The key to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function assocIndexOf(array, key) {\\n var length = array.length;\\n while (length--) {\\n if (eq(array[length][0], key)) {\\n return length;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * Aggregates elements of `collection` on `accumulator` with keys transformed\\n * by `iteratee` and values set by `setter`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform keys.\\n * @param {Object} accumulator The initial aggregated object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function baseAggregator(collection, setter, iteratee, accumulator) {\\n baseEach(collection, function(value, key, collection) {\\n setter(accumulator, value, iteratee(value), collection);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.assign` without support for multiple sources\\n * or `customizer` functions.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @returns {Object} Returns `object`.\\n */\\n function baseAssign(object, source) {\\n return object && copyObject(source, keys(source), object);\\n }\\n\\n /**\\n * The base implementation of `_.assignIn` without support for multiple sources\\n * or `customizer` functions.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @returns {Object} Returns `object`.\\n */\\n function baseAssignIn(object, source) {\\n return object && copyObject(source, keysIn(source), object);\\n }\\n\\n /**\\n * The base implementation of `assignValue` and `assignMergeValue` without\\n * value checks.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function baseAssignValue(object, key, value) {\\n if (key == '__proto__' && defineProperty) {\\n defineProperty(object, key, {\\n 'configurable': true,\\n 'enumerable': true,\\n 'value': value,\\n 'writable': true\\n });\\n } else {\\n object[key] = value;\\n }\\n }\\n\\n /**\\n * The base implementation of `_.at` without support for individual paths.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {string[]} paths The property paths to pick.\\n * @returns {Array} Returns the picked elements.\\n */\\n function baseAt(object, paths) {\\n var index = -1,\\n length = paths.length,\\n result = Array(length),\\n skip = object == null;\\n\\n while (++index < length) {\\n result[index] = skip ? undefined : get(object, paths[index]);\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.clamp` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {number} number The number to clamp.\\n * @param {number} [lower] The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the clamped number.\\n */\\n function baseClamp(number, lower, upper) {\\n if (number === number) {\\n if (upper !== undefined) {\\n number = number <= upper ? number : upper;\\n }\\n if (lower !== undefined) {\\n number = number >= lower ? number : lower;\\n }\\n }\\n return number;\\n }\\n\\n /**\\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\\n * traversed objects.\\n *\\n * @private\\n * @param {*} value The value to clone.\\n * @param {boolean} bitmask The bitmask flags.\\n * 1 - Deep clone\\n * 2 - Flatten inherited properties\\n * 4 - Clone symbols\\n * @param {Function} [customizer] The function to customize cloning.\\n * @param {string} [key] The key of `value`.\\n * @param {Object} [object] The parent object of `value`.\\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\\n * @returns {*} Returns the cloned value.\\n */\\n function baseClone(value, bitmask, customizer, key, object, stack) {\\n var result,\\n isDeep = bitmask & CLONE_DEEP_FLAG,\\n isFlat = bitmask & CLONE_FLAT_FLAG,\\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\\n\\n if (customizer) {\\n result = object ? customizer(value, key, object, stack) : customizer(value);\\n }\\n if (result !== undefined) {\\n return result;\\n }\\n if (!isObject(value)) {\\n return value;\\n }\\n var isArr = isArray(value);\\n if (isArr) {\\n result = initCloneArray(value);\\n if (!isDeep) {\\n return copyArray(value, result);\\n }\\n } else {\\n var tag = getTag(value),\\n isFunc = tag == funcTag || tag == genTag;\\n\\n if (isBuffer(value)) {\\n return cloneBuffer(value, isDeep);\\n }\\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\\n if (!isDeep) {\\n return isFlat\\n ? copySymbolsIn(value, baseAssignIn(result, value))\\n : copySymbols(value, baseAssign(result, value));\\n }\\n } else {\\n if (!cloneableTags[tag]) {\\n return object ? value : {};\\n }\\n result = initCloneByTag(value, tag, baseClone, isDeep);\\n }\\n }\\n // Check for circular references and return its corresponding clone.\\n stack || (stack = new Stack);\\n var stacked = stack.get(value);\\n if (stacked) {\\n return stacked;\\n }\\n stack.set(value, result);\\n\\n var keysFunc = isFull\\n ? (isFlat ? getAllKeysIn : getAllKeys)\\n : (isFlat ? keysIn : keys);\\n\\n var props = isArr ? undefined : keysFunc(value);\\n arrayEach(props || value, function(subValue, key) {\\n if (props) {\\n key = subValue;\\n subValue = value[key];\\n }\\n // Recursively populate clone (susceptible to call stack limits).\\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.conforms` which doesn't clone `source`.\\n *\\n * @private\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseConforms(source) {\\n var props = keys(source);\\n return function(object) {\\n return baseConformsTo(object, source, props);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.conformsTo` which accepts `props` to check.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\\n */\\n function baseConformsTo(object, source, props) {\\n var length = props.length;\\n if (object == null) {\\n return !length;\\n }\\n object = Object(object);\\n while (length--) {\\n var key = props[length],\\n predicate = source[key],\\n value = object[key];\\n\\n if ((value === undefined && !(key in object)) || !predicate(value)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\\n * to provide to `func`.\\n *\\n * @private\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @param {Array} args The arguments to provide to `func`.\\n * @returns {number|Object} Returns the timer id or timeout object.\\n */\\n function baseDelay(func, wait, args) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n return setTimeout(function() { func.apply(undefined, args); }, wait);\\n }\\n\\n /**\\n * The base implementation of methods like `_.difference` without support\\n * for excluding multiple arrays or iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Array} values The values to exclude.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n */\\n function baseDifference(array, values, iteratee, comparator) {\\n var index = -1,\\n includes = arrayIncludes,\\n isCommon = true,\\n length = array.length,\\n result = [],\\n valuesLength = values.length;\\n\\n if (!length) {\\n return result;\\n }\\n if (iteratee) {\\n values = arrayMap(values, baseUnary(iteratee));\\n }\\n if (comparator) {\\n includes = arrayIncludesWith;\\n isCommon = false;\\n }\\n else if (values.length >= LARGE_ARRAY_SIZE) {\\n includes = cacheHas;\\n isCommon = false;\\n values = new SetCache(values);\\n }\\n outer:\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee == null ? value : iteratee(value);\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (isCommon && computed === computed) {\\n var valuesIndex = valuesLength;\\n while (valuesIndex--) {\\n if (values[valuesIndex] === computed) {\\n continue outer;\\n }\\n }\\n result.push(value);\\n }\\n else if (!includes(values, computed, comparator)) {\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.forEach` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n */\\n var baseEach = createBaseEach(baseForOwn);\\n\\n /**\\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n */\\n var baseEachRight = createBaseEach(baseForOwnRight, true);\\n\\n /**\\n * The base implementation of `_.every` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`\\n */\\n function baseEvery(collection, predicate) {\\n var result = true;\\n baseEach(collection, function(value, index, collection) {\\n result = !!predicate(value, index, collection);\\n return result;\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of methods like `_.max` and `_.min` which accepts a\\n * `comparator` to determine the extremum value.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The iteratee invoked per iteration.\\n * @param {Function} comparator The comparator used to compare values.\\n * @returns {*} Returns the extremum value.\\n */\\n function baseExtremum(array, iteratee, comparator) {\\n var index = -1,\\n length = array.length;\\n\\n while (++index < length) {\\n var value = array[index],\\n current = iteratee(value);\\n\\n if (current != null && (computed === undefined\\n ? (current === current && !isSymbol(current))\\n : comparator(current, computed)\\n )) {\\n var computed = current,\\n result = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.fill` without an iteratee call guard.\\n *\\n * @private\\n * @param {Array} array The array to fill.\\n * @param {*} value The value to fill `array` with.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns `array`.\\n */\\n function baseFill(array, value, start, end) {\\n var length = array.length;\\n\\n start = toInteger(start);\\n if (start < 0) {\\n start = -start > length ? 0 : (length + start);\\n }\\n end = (end === undefined || end > length) ? length : toInteger(end);\\n if (end < 0) {\\n end += length;\\n }\\n end = start > end ? 0 : toLength(end);\\n while (start < end) {\\n array[start++] = value;\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.filter` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n */\\n function baseFilter(collection, predicate) {\\n var result = [];\\n baseEach(collection, function(value, index, collection) {\\n if (predicate(value, index, collection)) {\\n result.push(value);\\n }\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.flatten` with support for restricting flattening.\\n *\\n * @private\\n * @param {Array} array The array to flatten.\\n * @param {number} depth The maximum recursion depth.\\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\\n * @param {Array} [result=[]] The initial result value.\\n * @returns {Array} Returns the new flattened array.\\n */\\n function baseFlatten(array, depth, predicate, isStrict, result) {\\n var index = -1,\\n length = array.length;\\n\\n predicate || (predicate = isFlattenable);\\n result || (result = []);\\n\\n while (++index < length) {\\n var value = array[index];\\n if (depth > 0 && predicate(value)) {\\n if (depth > 1) {\\n // Recursively flatten arrays (susceptible to call stack limits).\\n baseFlatten(value, depth - 1, predicate, isStrict, result);\\n } else {\\n arrayPush(result, value);\\n }\\n } else if (!isStrict) {\\n result[result.length] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `baseForOwn` which iterates over `object`\\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @returns {Object} Returns `object`.\\n */\\n var baseFor = createBaseFor();\\n\\n /**\\n * This function is like `baseFor` except that it iterates over properties\\n * in the opposite order.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @returns {Object} Returns `object`.\\n */\\n var baseForRight = createBaseFor(true);\\n\\n /**\\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n */\\n function baseForOwn(object, iteratee) {\\n return object && baseFor(object, iteratee, keys);\\n }\\n\\n /**\\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n */\\n function baseForOwnRight(object, iteratee) {\\n return object && baseForRight(object, iteratee, keys);\\n }\\n\\n /**\\n * The base implementation of `_.functions` which creates an array of\\n * `object` function property names filtered from `props`.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Array} props The property names to filter.\\n * @returns {Array} Returns the function names.\\n */\\n function baseFunctions(object, props) {\\n return arrayFilter(props, function(key) {\\n return isFunction(object[key]);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.get` without support for default values.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to get.\\n * @returns {*} Returns the resolved value.\\n */\\n function baseGet(object, path) {\\n path = castPath(path, object);\\n\\n var index = 0,\\n length = path.length;\\n\\n while (object != null && index < length) {\\n object = object[toKey(path[index++])];\\n }\\n return (index && index == length) ? object : undefined;\\n }\\n\\n /**\\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\\n * symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\\n var result = keysFunc(object);\\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\\n }\\n\\n /**\\n * The base implementation of `getTag` without fallbacks for buggy environments.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the `toStringTag`.\\n */\\n function baseGetTag(value) {\\n if (value == null) {\\n return value === undefined ? undefinedTag : nullTag;\\n }\\n return (symToStringTag && symToStringTag in Object(value))\\n ? getRawTag(value)\\n : objectToString(value);\\n }\\n\\n /**\\n * The base implementation of `_.gt` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\\n * else `false`.\\n */\\n function baseGt(value, other) {\\n return value > other;\\n }\\n\\n /**\\n * The base implementation of `_.has` without support for deep paths.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {Array|string} key The key to check.\\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\\n */\\n function baseHas(object, key) {\\n return object != null && hasOwnProperty.call(object, key);\\n }\\n\\n /**\\n * The base implementation of `_.hasIn` without support for deep paths.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {Array|string} key The key to check.\\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\\n */\\n function baseHasIn(object, key) {\\n return object != null && key in Object(object);\\n }\\n\\n /**\\n * The base implementation of `_.inRange` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {number} number The number to check.\\n * @param {number} start The start of the range.\\n * @param {number} end The end of the range.\\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\\n */\\n function baseInRange(number, start, end) {\\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\\n }\\n\\n /**\\n * The base implementation of methods like `_.intersection`, without support\\n * for iteratee shorthands, that accepts an array of arrays to inspect.\\n *\\n * @private\\n * @param {Array} arrays The arrays to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of shared values.\\n */\\n function baseIntersection(arrays, iteratee, comparator) {\\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\\n length = arrays[0].length,\\n othLength = arrays.length,\\n othIndex = othLength,\\n caches = Array(othLength),\\n maxLength = Infinity,\\n result = [];\\n\\n while (othIndex--) {\\n var array = arrays[othIndex];\\n if (othIndex && iteratee) {\\n array = arrayMap(array, baseUnary(iteratee));\\n }\\n maxLength = nativeMin(array.length, maxLength);\\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\\n ? new SetCache(othIndex && array)\\n : undefined;\\n }\\n array = arrays[0];\\n\\n var index = -1,\\n seen = caches[0];\\n\\n outer:\\n while (++index < length && result.length < maxLength) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (!(seen\\n ? cacheHas(seen, computed)\\n : includes(result, computed, comparator)\\n )) {\\n othIndex = othLength;\\n while (--othIndex) {\\n var cache = caches[othIndex];\\n if (!(cache\\n ? cacheHas(cache, computed)\\n : includes(arrays[othIndex], computed, comparator))\\n ) {\\n continue outer;\\n }\\n }\\n if (seen) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.invert` and `_.invertBy` which inverts\\n * `object` with values transformed by `iteratee` and set by `setter`.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform values.\\n * @param {Object} accumulator The initial inverted object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function baseInverter(object, setter, iteratee, accumulator) {\\n baseForOwn(object, function(value, key, object) {\\n setter(accumulator, iteratee(value), key, object);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.invoke` without support for individual\\n * method arguments.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the method to invoke.\\n * @param {Array} args The arguments to invoke the method with.\\n * @returns {*} Returns the result of the invoked method.\\n */\\n function baseInvoke(object, path, args) {\\n path = castPath(path, object);\\n object = parent(object, path);\\n var func = object == null ? object : object[toKey(last(path))];\\n return func == null ? undefined : apply(func, object, args);\\n }\\n\\n /**\\n * The base implementation of `_.isArguments`.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\\n */\\n function baseIsArguments(value) {\\n return isObjectLike(value) && baseGetTag(value) == argsTag;\\n }\\n\\n /**\\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\\n */\\n function baseIsArrayBuffer(value) {\\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\\n }\\n\\n /**\\n * The base implementation of `_.isDate` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\\n */\\n function baseIsDate(value) {\\n return isObjectLike(value) && baseGetTag(value) == dateTag;\\n }\\n\\n /**\\n * The base implementation of `_.isEqual` which supports partial comparisons\\n * and tracks traversed objects.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @param {boolean} bitmask The bitmask flags.\\n * 1 - Unordered comparison\\n * 2 - Partial comparison\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n */\\n function baseIsEqual(value, other, bitmask, customizer, stack) {\\n if (value === other) {\\n return true;\\n }\\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\\n return value !== value && other !== other;\\n }\\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\\n }\\n\\n /**\\n * A specialized version of `baseIsEqual` for arrays and objects which performs\\n * deep comparisons and tracks traversed objects enabling objects with circular\\n * references to be compared.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\\n var objIsArr = isArray(object),\\n othIsArr = isArray(other),\\n objTag = objIsArr ? arrayTag : getTag(object),\\n othTag = othIsArr ? arrayTag : getTag(other);\\n\\n objTag = objTag == argsTag ? objectTag : objTag;\\n othTag = othTag == argsTag ? objectTag : othTag;\\n\\n var objIsObj = objTag == objectTag,\\n othIsObj = othTag == objectTag,\\n isSameTag = objTag == othTag;\\n\\n if (isSameTag && isBuffer(object)) {\\n if (!isBuffer(other)) {\\n return false;\\n }\\n objIsArr = true;\\n objIsObj = false;\\n }\\n if (isSameTag && !objIsObj) {\\n stack || (stack = new Stack);\\n return (objIsArr || isTypedArray(object))\\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\\n }\\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\\n\\n if (objIsWrapped || othIsWrapped) {\\n var objUnwrapped = objIsWrapped ? object.value() : object,\\n othUnwrapped = othIsWrapped ? other.value() : other;\\n\\n stack || (stack = new Stack);\\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\\n }\\n }\\n if (!isSameTag) {\\n return false;\\n }\\n stack || (stack = new Stack);\\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\\n }\\n\\n /**\\n * The base implementation of `_.isMap` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\\n */\\n function baseIsMap(value) {\\n return isObjectLike(value) && getTag(value) == mapTag;\\n }\\n\\n /**\\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @param {Array} matchData The property names, values, and compare flags to match.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n */\\n function baseIsMatch(object, source, matchData, customizer) {\\n var index = matchData.length,\\n length = index,\\n noCustomizer = !customizer;\\n\\n if (object == null) {\\n return !length;\\n }\\n object = Object(object);\\n while (index--) {\\n var data = matchData[index];\\n if ((noCustomizer && data[2])\\n ? data[1] !== object[data[0]]\\n : !(data[0] in object)\\n ) {\\n return false;\\n }\\n }\\n while (++index < length) {\\n data = matchData[index];\\n var key = data[0],\\n objValue = object[key],\\n srcValue = data[1];\\n\\n if (noCustomizer && data[2]) {\\n if (objValue === undefined && !(key in object)) {\\n return false;\\n }\\n } else {\\n var stack = new Stack;\\n if (customizer) {\\n var result = customizer(objValue, srcValue, key, object, source, stack);\\n }\\n if (!(result === undefined\\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\\n : result\\n )) {\\n return false;\\n }\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * The base implementation of `_.isNative` without bad shim checks.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a native function,\\n * else `false`.\\n */\\n function baseIsNative(value) {\\n if (!isObject(value) || isMasked(value)) {\\n return false;\\n }\\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\\n return pattern.test(toSource(value));\\n }\\n\\n /**\\n * The base implementation of `_.isRegExp` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\\n */\\n function baseIsRegExp(value) {\\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\\n }\\n\\n /**\\n * The base implementation of `_.isSet` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\\n */\\n function baseIsSet(value) {\\n return isObjectLike(value) && getTag(value) == setTag;\\n }\\n\\n /**\\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\\n */\\n function baseIsTypedArray(value) {\\n return isObjectLike(value) &&\\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\\n }\\n\\n /**\\n * The base implementation of `_.iteratee`.\\n *\\n * @private\\n * @param {*} [value=_.identity] The value to convert to an iteratee.\\n * @returns {Function} Returns the iteratee.\\n */\\n function baseIteratee(value) {\\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\\n if (typeof value == 'function') {\\n return value;\\n }\\n if (value == null) {\\n return identity;\\n }\\n if (typeof value == 'object') {\\n return isArray(value)\\n ? baseMatchesProperty(value[0], value[1])\\n : baseMatches(value);\\n }\\n return property(value);\\n }\\n\\n /**\\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function baseKeys(object) {\\n if (!isPrototype(object)) {\\n return nativeKeys(object);\\n }\\n var result = [];\\n for (var key in Object(object)) {\\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function baseKeysIn(object) {\\n if (!isObject(object)) {\\n return nativeKeysIn(object);\\n }\\n var isProto = isPrototype(object),\\n result = [];\\n\\n for (var key in object) {\\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.lt` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than `other`,\\n * else `false`.\\n */\\n function baseLt(value, other) {\\n return value < other;\\n }\\n\\n /**\\n * The base implementation of `_.map` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n */\\n function baseMap(collection, iteratee) {\\n var index = -1,\\n result = isArrayLike(collection) ? Array(collection.length) : [];\\n\\n baseEach(collection, function(value, key, collection) {\\n result[++index] = iteratee(value, key, collection);\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.matches` which doesn't clone `source`.\\n *\\n * @private\\n * @param {Object} source The object of property values to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseMatches(source) {\\n var matchData = getMatchData(source);\\n if (matchData.length == 1 && matchData[0][2]) {\\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\\n }\\n return function(object) {\\n return object === source || baseIsMatch(object, source, matchData);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\\n *\\n * @private\\n * @param {string} path The path of the property to get.\\n * @param {*} srcValue The value to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseMatchesProperty(path, srcValue) {\\n if (isKey(path) && isStrictComparable(srcValue)) {\\n return matchesStrictComparable(toKey(path), srcValue);\\n }\\n return function(object) {\\n var objValue = get(object, path);\\n return (objValue === undefined && objValue === srcValue)\\n ? hasIn(object, path)\\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.merge` without support for multiple sources.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @param {number} srcIndex The index of `source`.\\n * @param {Function} [customizer] The function to customize merged values.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n */\\n function baseMerge(object, source, srcIndex, customizer, stack) {\\n if (object === source) {\\n return;\\n }\\n baseFor(source, function(srcValue, key) {\\n if (isObject(srcValue)) {\\n stack || (stack = new Stack);\\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\\n }\\n else {\\n var newValue = customizer\\n ? customizer(object[key], srcValue, (key + ''), object, source, stack)\\n : undefined;\\n\\n if (newValue === undefined) {\\n newValue = srcValue;\\n }\\n assignMergeValue(object, key, newValue);\\n }\\n }, keysIn);\\n }\\n\\n /**\\n * A specialized version of `baseMerge` for arrays and objects which performs\\n * deep merges and tracks traversed objects enabling objects with circular\\n * references to be merged.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @param {string} key The key of the value to merge.\\n * @param {number} srcIndex The index of `source`.\\n * @param {Function} mergeFunc The function to merge values.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n */\\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\\n var objValue = object[key],\\n srcValue = source[key],\\n stacked = stack.get(srcValue);\\n\\n if (stacked) {\\n assignMergeValue(object, key, stacked);\\n return;\\n }\\n var newValue = customizer\\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\\n : undefined;\\n\\n var isCommon = newValue === undefined;\\n\\n if (isCommon) {\\n var isArr = isArray(srcValue),\\n isBuff = !isArr && isBuffer(srcValue),\\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\\n\\n newValue = srcValue;\\n if (isArr || isBuff || isTyped) {\\n if (isArray(objValue)) {\\n newValue = objValue;\\n }\\n else if (isArrayLikeObject(objValue)) {\\n newValue = copyArray(objValue);\\n }\\n else if (isBuff) {\\n isCommon = false;\\n newValue = cloneBuffer(srcValue, true);\\n }\\n else if (isTyped) {\\n isCommon = false;\\n newValue = cloneTypedArray(srcValue, true);\\n }\\n else {\\n newValue = [];\\n }\\n }\\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\\n newValue = objValue;\\n if (isArguments(objValue)) {\\n newValue = toPlainObject(objValue);\\n }\\n else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\\n newValue = initCloneObject(srcValue);\\n }\\n }\\n else {\\n isCommon = false;\\n }\\n }\\n if (isCommon) {\\n // Recursively merge objects and arrays (susceptible to call stack limits).\\n stack.set(srcValue, newValue);\\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\\n stack['delete'](srcValue);\\n }\\n assignMergeValue(object, key, newValue);\\n }\\n\\n /**\\n * The base implementation of `_.nth` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {Array} array The array to query.\\n * @param {number} n The index of the element to return.\\n * @returns {*} Returns the nth element of `array`.\\n */\\n function baseNth(array, n) {\\n var length = array.length;\\n if (!length) {\\n return;\\n }\\n n += n < 0 ? length : 0;\\n return isIndex(n, length) ? array[n] : undefined;\\n }\\n\\n /**\\n * The base implementation of `_.orderBy` without param guards.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\\n * @param {string[]} orders The sort orders of `iteratees`.\\n * @returns {Array} Returns the new sorted array.\\n */\\n function baseOrderBy(collection, iteratees, orders) {\\n var index = -1;\\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\\n\\n var result = baseMap(collection, function(value, key, collection) {\\n var criteria = arrayMap(iteratees, function(iteratee) {\\n return iteratee(value);\\n });\\n return { 'criteria': criteria, 'index': ++index, 'value': value };\\n });\\n\\n return baseSortBy(result, function(object, other) {\\n return compareMultiple(object, other, orders);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.pick` without support for individual\\n * property identifiers.\\n *\\n * @private\\n * @param {Object} object The source object.\\n * @param {string[]} paths The property paths to pick.\\n * @returns {Object} Returns the new object.\\n */\\n function basePick(object, paths) {\\n return basePickBy(object, paths, function(value, path) {\\n return hasIn(object, path);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The source object.\\n * @param {string[]} paths The property paths to pick.\\n * @param {Function} predicate The function invoked per property.\\n * @returns {Object} Returns the new object.\\n */\\n function basePickBy(object, paths, predicate) {\\n var index = -1,\\n length = paths.length,\\n result = {};\\n\\n while (++index < length) {\\n var path = paths[index],\\n value = baseGet(object, path);\\n\\n if (predicate(value, path)) {\\n baseSet(result, castPath(path, object), value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseProperty` which supports deep paths.\\n *\\n * @private\\n * @param {Array|string} path The path of the property to get.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function basePropertyDeep(path) {\\n return function(object) {\\n return baseGet(object, path);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.pullAllBy` without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns `array`.\\n */\\n function basePullAll(array, values, iteratee, comparator) {\\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\\n index = -1,\\n length = values.length,\\n seen = array;\\n\\n if (array === values) {\\n values = copyArray(values);\\n }\\n if (iteratee) {\\n seen = arrayMap(array, baseUnary(iteratee));\\n }\\n while (++index < length) {\\n var fromIndex = 0,\\n value = values[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\\n if (seen !== array) {\\n splice.call(seen, fromIndex, 1);\\n }\\n splice.call(array, fromIndex, 1);\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.pullAt` without support for individual\\n * indexes or capturing the removed elements.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {number[]} indexes The indexes of elements to remove.\\n * @returns {Array} Returns `array`.\\n */\\n function basePullAt(array, indexes) {\\n var length = array ? indexes.length : 0,\\n lastIndex = length - 1;\\n\\n while (length--) {\\n var index = indexes[length];\\n if (length == lastIndex || index !== previous) {\\n var previous = index;\\n if (isIndex(index)) {\\n splice.call(array, index, 1);\\n } else {\\n baseUnset(array, index);\\n }\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.random` without support for returning\\n * floating-point numbers.\\n *\\n * @private\\n * @param {number} lower The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the random number.\\n */\\n function baseRandom(lower, upper) {\\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\\n }\\n\\n /**\\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\\n * coerce arguments.\\n *\\n * @private\\n * @param {number} start The start of the range.\\n * @param {number} end The end of the range.\\n * @param {number} step The value to increment or decrement by.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Array} Returns the range of numbers.\\n */\\n function baseRange(start, end, step, fromRight) {\\n var index = -1,\\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\\n result = Array(length);\\n\\n while (length--) {\\n result[fromRight ? length : ++index] = start;\\n start += step;\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.repeat` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {string} string The string to repeat.\\n * @param {number} n The number of times to repeat the string.\\n * @returns {string} Returns the repeated string.\\n */\\n function baseRepeat(string, n) {\\n var result = '';\\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\\n return result;\\n }\\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\\n do {\\n if (n % 2) {\\n result += string;\\n }\\n n = nativeFloor(n / 2);\\n if (n) {\\n string += string;\\n }\\n } while (n);\\n\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @returns {Function} Returns the new function.\\n */\\n function baseRest(func, start) {\\n return setToString(overRest(func, start, identity), func + '');\\n }\\n\\n /**\\n * The base implementation of `_.sample`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to sample.\\n * @returns {*} Returns the random element.\\n */\\n function baseSample(collection) {\\n return arraySample(values(collection));\\n }\\n\\n /**\\n * The base implementation of `_.sampleSize` without param guards.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to sample.\\n * @param {number} n The number of elements to sample.\\n * @returns {Array} Returns the random elements.\\n */\\n function baseSampleSize(collection, n) {\\n var array = values(collection);\\n return shuffleSelf(array, baseClamp(n, 0, array.length));\\n }\\n\\n /**\\n * The base implementation of `_.set`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @param {Function} [customizer] The function to customize path creation.\\n * @returns {Object} Returns `object`.\\n */\\n function baseSet(object, path, value, customizer) {\\n if (!isObject(object)) {\\n return object;\\n }\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length,\\n lastIndex = length - 1,\\n nested = object;\\n\\n while (nested != null && ++index < length) {\\n var key = toKey(path[index]),\\n newValue = value;\\n\\n if (index != lastIndex) {\\n var objValue = nested[key];\\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\\n if (newValue === undefined) {\\n newValue = isObject(objValue)\\n ? objValue\\n : (isIndex(path[index + 1]) ? [] : {});\\n }\\n }\\n assignValue(nested, key, newValue);\\n nested = nested[key];\\n }\\n return object;\\n }\\n\\n /**\\n * The base implementation of `setData` without support for hot loop shorting.\\n *\\n * @private\\n * @param {Function} func The function to associate metadata with.\\n * @param {*} data The metadata.\\n * @returns {Function} Returns `func`.\\n */\\n var baseSetData = !metaMap ? identity : function(func, data) {\\n metaMap.set(func, data);\\n return func;\\n };\\n\\n /**\\n * The base implementation of `setToString` without support for hot loop shorting.\\n *\\n * @private\\n * @param {Function} func The function to modify.\\n * @param {Function} string The `toString` result.\\n * @returns {Function} Returns `func`.\\n */\\n var baseSetToString = !defineProperty ? identity : function(func, string) {\\n return defineProperty(func, 'toString', {\\n 'configurable': true,\\n 'enumerable': false,\\n 'value': constant(string),\\n 'writable': true\\n });\\n };\\n\\n /**\\n * The base implementation of `_.shuffle`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n */\\n function baseShuffle(collection) {\\n return shuffleSelf(values(collection));\\n }\\n\\n /**\\n * The base implementation of `_.slice` without an iteratee call guard.\\n *\\n * @private\\n * @param {Array} array The array to slice.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function baseSlice(array, start, end) {\\n var index = -1,\\n length = array.length;\\n\\n if (start < 0) {\\n start = -start > length ? 0 : (length + start);\\n }\\n end = end > length ? length : end;\\n if (end < 0) {\\n end += length;\\n }\\n length = start > end ? 0 : ((end - start) >>> 0);\\n start >>>= 0;\\n\\n var result = Array(length);\\n while (++index < length) {\\n result[index] = array[index + start];\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.some` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n */\\n function baseSome(collection, predicate) {\\n var result;\\n\\n baseEach(collection, function(value, index, collection) {\\n result = predicate(value, index, collection);\\n return !result;\\n });\\n return !!result;\\n }\\n\\n /**\\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\\n * performs a binary search of `array` to determine the index at which `value`\\n * should be inserted into `array` in order to maintain its sort order.\\n *\\n * @private\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n */\\n function baseSortedIndex(array, value, retHighest) {\\n var low = 0,\\n high = array == null ? low : array.length;\\n\\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\\n while (low < high) {\\n var mid = (low + high) >>> 1,\\n computed = array[mid];\\n\\n if (computed !== null && !isSymbol(computed) &&\\n (retHighest ? (computed <= value) : (computed < value))) {\\n low = mid + 1;\\n } else {\\n high = mid;\\n }\\n }\\n return high;\\n }\\n return baseSortedIndexBy(array, value, identity, retHighest);\\n }\\n\\n /**\\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\\n * which invokes `iteratee` for `value` and each element of `array` to compute\\n * their sort ranking. The iteratee is invoked with one argument; (value).\\n *\\n * @private\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} iteratee The iteratee invoked per element.\\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n */\\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\\n value = iteratee(value);\\n\\n var low = 0,\\n high = array == null ? 0 : array.length,\\n valIsNaN = value !== value,\\n valIsNull = value === null,\\n valIsSymbol = isSymbol(value),\\n valIsUndefined = value === undefined;\\n\\n while (low < high) {\\n var mid = nativeFloor((low + high) / 2),\\n computed = iteratee(array[mid]),\\n othIsDefined = computed !== undefined,\\n othIsNull = computed === null,\\n othIsReflexive = computed === computed,\\n othIsSymbol = isSymbol(computed);\\n\\n if (valIsNaN) {\\n var setLow = retHighest || othIsReflexive;\\n } else if (valIsUndefined) {\\n setLow = othIsReflexive && (retHighest || othIsDefined);\\n } else if (valIsNull) {\\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\\n } else if (valIsSymbol) {\\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\\n } else if (othIsNull || othIsSymbol) {\\n setLow = false;\\n } else {\\n setLow = retHighest ? (computed <= value) : (computed < value);\\n }\\n if (setLow) {\\n low = mid + 1;\\n } else {\\n high = mid;\\n }\\n }\\n return nativeMin(high, MAX_ARRAY_INDEX);\\n }\\n\\n /**\\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\\n * support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n */\\n function baseSortedUniq(array, iteratee) {\\n var index = -1,\\n length = array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n if (!index || !eq(computed, seen)) {\\n var seen = computed;\\n result[resIndex++] = value === 0 ? 0 : value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.toNumber` which doesn't ensure correct\\n * conversions of binary, hexadecimal, or octal string values.\\n *\\n * @private\\n * @param {*} value The value to process.\\n * @returns {number} Returns the number.\\n */\\n function baseToNumber(value) {\\n if (typeof value == 'number') {\\n return value;\\n }\\n if (isSymbol(value)) {\\n return NAN;\\n }\\n return +value;\\n }\\n\\n /**\\n * The base implementation of `_.toString` which doesn't convert nullish\\n * values to empty strings.\\n *\\n * @private\\n * @param {*} value The value to process.\\n * @returns {string} Returns the string.\\n */\\n function baseToString(value) {\\n // Exit early for strings to avoid a performance hit in some environments.\\n if (typeof value == 'string') {\\n return value;\\n }\\n if (isArray(value)) {\\n // Recursively convert values (susceptible to call stack limits).\\n return arrayMap(value, baseToString) + '';\\n }\\n if (isSymbol(value)) {\\n return symbolToString ? symbolToString.call(value) : '';\\n }\\n var result = (value + '');\\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\\n }\\n\\n /**\\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n */\\n function baseUniq(array, iteratee, comparator) {\\n var index = -1,\\n includes = arrayIncludes,\\n length = array.length,\\n isCommon = true,\\n result = [],\\n seen = result;\\n\\n if (comparator) {\\n isCommon = false;\\n includes = arrayIncludesWith;\\n }\\n else if (length >= LARGE_ARRAY_SIZE) {\\n var set = iteratee ? null : createSet(array);\\n if (set) {\\n return setToArray(set);\\n }\\n isCommon = false;\\n includes = cacheHas;\\n seen = new SetCache;\\n }\\n else {\\n seen = iteratee ? [] : result;\\n }\\n outer:\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (isCommon && computed === computed) {\\n var seenIndex = seen.length;\\n while (seenIndex--) {\\n if (seen[seenIndex] === computed) {\\n continue outer;\\n }\\n }\\n if (iteratee) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n else if (!includes(seen, computed, comparator)) {\\n if (seen !== result) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.unset`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The property path to unset.\\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\\n */\\n function baseUnset(object, path) {\\n path = castPath(path, object);\\n object = parent(object, path);\\n return object == null || delete object[toKey(last(path))];\\n }\\n\\n /**\\n * The base implementation of `_.update`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to update.\\n * @param {Function} updater The function to produce the updated value.\\n * @param {Function} [customizer] The function to customize path creation.\\n * @returns {Object} Returns `object`.\\n */\\n function baseUpdate(object, path, updater, customizer) {\\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\\n }\\n\\n /**\\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\\n * without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to query.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function baseWhile(array, predicate, isDrop, fromRight) {\\n var length = array.length,\\n index = fromRight ? length : -1;\\n\\n while ((fromRight ? index-- : ++index < length) &&\\n predicate(array[index], index, array)) {}\\n\\n return isDrop\\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\\n }\\n\\n /**\\n * The base implementation of `wrapperValue` which returns the result of\\n * performing a sequence of actions on the unwrapped `value`, where each\\n * successive action is supplied the return value of the previous.\\n *\\n * @private\\n * @param {*} value The unwrapped value.\\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\\n * @returns {*} Returns the resolved value.\\n */\\n function baseWrapperValue(value, actions) {\\n var result = value;\\n if (result instanceof LazyWrapper) {\\n result = result.value();\\n }\\n return arrayReduce(actions, function(result, action) {\\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\\n }, result);\\n }\\n\\n /**\\n * The base implementation of methods like `_.xor`, without support for\\n * iteratee shorthands, that accepts an array of arrays to inspect.\\n *\\n * @private\\n * @param {Array} arrays The arrays to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of values.\\n */\\n function baseXor(arrays, iteratee, comparator) {\\n var length = arrays.length;\\n if (length < 2) {\\n return length ? baseUniq(arrays[0]) : [];\\n }\\n var index = -1,\\n result = Array(length);\\n\\n while (++index < length) {\\n var array = arrays[index],\\n othIndex = -1;\\n\\n while (++othIndex < length) {\\n if (othIndex != index) {\\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\\n }\\n }\\n }\\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\\n }\\n\\n /**\\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\\n *\\n * @private\\n * @param {Array} props The property identifiers.\\n * @param {Array} values The property values.\\n * @param {Function} assignFunc The function to assign values.\\n * @returns {Object} Returns the new object.\\n */\\n function baseZipObject(props, values, assignFunc) {\\n var index = -1,\\n length = props.length,\\n valsLength = values.length,\\n result = {};\\n\\n while (++index < length) {\\n var value = index < valsLength ? values[index] : undefined;\\n assignFunc(result, props[index], value);\\n }\\n return result;\\n }\\n\\n /**\\n * Casts `value` to an empty array if it's not an array like object.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {Array|Object} Returns the cast array-like object.\\n */\\n function castArrayLikeObject(value) {\\n return isArrayLikeObject(value) ? value : [];\\n }\\n\\n /**\\n * Casts `value` to `identity` if it's not a function.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {Function} Returns cast function.\\n */\\n function castFunction(value) {\\n return typeof value == 'function' ? value : identity;\\n }\\n\\n /**\\n * Casts `value` to a path array if it's not one.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @param {Object} [object] The object to query keys on.\\n * @returns {Array} Returns the cast property path array.\\n */\\n function castPath(value, object) {\\n if (isArray(value)) {\\n return value;\\n }\\n return isKey(value, object) ? [value] : stringToPath(toString(value));\\n }\\n\\n /**\\n * A `baseRest` alias which can be replaced with `identity` by module\\n * replacement plugins.\\n *\\n * @private\\n * @type {Function}\\n * @param {Function} func The function to apply a rest parameter to.\\n * @returns {Function} Returns the new function.\\n */\\n var castRest = baseRest;\\n\\n /**\\n * Casts `array` to a slice if it's needed.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {number} start The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the cast slice.\\n */\\n function castSlice(array, start, end) {\\n var length = array.length;\\n end = end === undefined ? length : end;\\n return (!start && end >= length) ? array : baseSlice(array, start, end);\\n }\\n\\n /**\\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\\n *\\n * @private\\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\\n */\\n var clearTimeout = ctxClearTimeout || function(id) {\\n return root.clearTimeout(id);\\n };\\n\\n /**\\n * Creates a clone of `buffer`.\\n *\\n * @private\\n * @param {Buffer} buffer The buffer to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Buffer} Returns the cloned buffer.\\n */\\n function cloneBuffer(buffer, isDeep) {\\n if (isDeep) {\\n return buffer.slice();\\n }\\n var length = buffer.length,\\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\\n\\n buffer.copy(result);\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `arrayBuffer`.\\n *\\n * @private\\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\\n * @returns {ArrayBuffer} Returns the cloned array buffer.\\n */\\n function cloneArrayBuffer(arrayBuffer) {\\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `dataView`.\\n *\\n * @private\\n * @param {Object} dataView The data view to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned data view.\\n */\\n function cloneDataView(dataView, isDeep) {\\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\\n }\\n\\n /**\\n * Creates a clone of `map`.\\n *\\n * @private\\n * @param {Object} map The map to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned map.\\n */\\n function cloneMap(map, isDeep, cloneFunc) {\\n var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);\\n return arrayReduce(array, addMapEntry, new map.constructor);\\n }\\n\\n /**\\n * Creates a clone of `regexp`.\\n *\\n * @private\\n * @param {Object} regexp The regexp to clone.\\n * @returns {Object} Returns the cloned regexp.\\n */\\n function cloneRegExp(regexp) {\\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\\n result.lastIndex = regexp.lastIndex;\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `set`.\\n *\\n * @private\\n * @param {Object} set The set to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned set.\\n */\\n function cloneSet(set, isDeep, cloneFunc) {\\n var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);\\n return arrayReduce(array, addSetEntry, new set.constructor);\\n }\\n\\n /**\\n * Creates a clone of the `symbol` object.\\n *\\n * @private\\n * @param {Object} symbol The symbol object to clone.\\n * @returns {Object} Returns the cloned symbol object.\\n */\\n function cloneSymbol(symbol) {\\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\\n }\\n\\n /**\\n * Creates a clone of `typedArray`.\\n *\\n * @private\\n * @param {Object} typedArray The typed array to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned typed array.\\n */\\n function cloneTypedArray(typedArray, isDeep) {\\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\\n }\\n\\n /**\\n * Compares values to sort them in ascending order.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {number} Returns the sort order indicator for `value`.\\n */\\n function compareAscending(value, other) {\\n if (value !== other) {\\n var valIsDefined = value !== undefined,\\n valIsNull = value === null,\\n valIsReflexive = value === value,\\n valIsSymbol = isSymbol(value);\\n\\n var othIsDefined = other !== undefined,\\n othIsNull = other === null,\\n othIsReflexive = other === other,\\n othIsSymbol = isSymbol(other);\\n\\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\\n (valIsNull && othIsDefined && othIsReflexive) ||\\n (!valIsDefined && othIsReflexive) ||\\n !valIsReflexive) {\\n return 1;\\n }\\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\\n (othIsNull && valIsDefined && valIsReflexive) ||\\n (!othIsDefined && valIsReflexive) ||\\n !othIsReflexive) {\\n return -1;\\n }\\n }\\n return 0;\\n }\\n\\n /**\\n * Used by `_.orderBy` to compare multiple properties of a value to another\\n * and stable sort them.\\n *\\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\\n * specify an order of \\\"desc\\\" for descending or \\\"asc\\\" for ascending sort order\\n * of corresponding values.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {boolean[]|string[]} orders The order to sort by for each property.\\n * @returns {number} Returns the sort order indicator for `object`.\\n */\\n function compareMultiple(object, other, orders) {\\n var index = -1,\\n objCriteria = object.criteria,\\n othCriteria = other.criteria,\\n length = objCriteria.length,\\n ordersLength = orders.length;\\n\\n while (++index < length) {\\n var result = compareAscending(objCriteria[index], othCriteria[index]);\\n if (result) {\\n if (index >= ordersLength) {\\n return result;\\n }\\n var order = orders[index];\\n return result * (order == 'desc' ? -1 : 1);\\n }\\n }\\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\\n // that causes it, under certain circumstances, to provide the same value for\\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\\n // for more details.\\n //\\n // This also ensures a stable sort in V8 and other engines.\\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\\n return object.index - other.index;\\n }\\n\\n /**\\n * Creates an array that is the composition of partially applied arguments,\\n * placeholders, and provided arguments into a single array of arguments.\\n *\\n * @private\\n * @param {Array} args The provided arguments.\\n * @param {Array} partials The arguments to prepend to those provided.\\n * @param {Array} holders The `partials` placeholder indexes.\\n * @params {boolean} [isCurried] Specify composing for a curried function.\\n * @returns {Array} Returns the new array of composed arguments.\\n */\\n function composeArgs(args, partials, holders, isCurried) {\\n var argsIndex = -1,\\n argsLength = args.length,\\n holdersLength = holders.length,\\n leftIndex = -1,\\n leftLength = partials.length,\\n rangeLength = nativeMax(argsLength - holdersLength, 0),\\n result = Array(leftLength + rangeLength),\\n isUncurried = !isCurried;\\n\\n while (++leftIndex < leftLength) {\\n result[leftIndex] = partials[leftIndex];\\n }\\n while (++argsIndex < holdersLength) {\\n if (isUncurried || argsIndex < argsLength) {\\n result[holders[argsIndex]] = args[argsIndex];\\n }\\n }\\n while (rangeLength--) {\\n result[leftIndex++] = args[argsIndex++];\\n }\\n return result;\\n }\\n\\n /**\\n * This function is like `composeArgs` except that the arguments composition\\n * is tailored for `_.partialRight`.\\n *\\n * @private\\n * @param {Array} args The provided arguments.\\n * @param {Array} partials The arguments to append to those provided.\\n * @param {Array} holders The `partials` placeholder indexes.\\n * @params {boolean} [isCurried] Specify composing for a curried function.\\n * @returns {Array} Returns the new array of composed arguments.\\n */\\n function composeArgsRight(args, partials, holders, isCurried) {\\n var argsIndex = -1,\\n argsLength = args.length,\\n holdersIndex = -1,\\n holdersLength = holders.length,\\n rightIndex = -1,\\n rightLength = partials.length,\\n rangeLength = nativeMax(argsLength - holdersLength, 0),\\n result = Array(rangeLength + rightLength),\\n isUncurried = !isCurried;\\n\\n while (++argsIndex < rangeLength) {\\n result[argsIndex] = args[argsIndex];\\n }\\n var offset = argsIndex;\\n while (++rightIndex < rightLength) {\\n result[offset + rightIndex] = partials[rightIndex];\\n }\\n while (++holdersIndex < holdersLength) {\\n if (isUncurried || argsIndex < argsLength) {\\n result[offset + holders[holdersIndex]] = args[argsIndex++];\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Copies the values of `source` to `array`.\\n *\\n * @private\\n * @param {Array} source The array to copy values from.\\n * @param {Array} [array=[]] The array to copy values to.\\n * @returns {Array} Returns `array`.\\n */\\n function copyArray(source, array) {\\n var index = -1,\\n length = source.length;\\n\\n array || (array = Array(length));\\n while (++index < length) {\\n array[index] = source[index];\\n }\\n return array;\\n }\\n\\n /**\\n * Copies properties of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy properties from.\\n * @param {Array} props The property identifiers to copy.\\n * @param {Object} [object={}] The object to copy properties to.\\n * @param {Function} [customizer] The function to customize copied values.\\n * @returns {Object} Returns `object`.\\n */\\n function copyObject(source, props, object, customizer) {\\n var isNew = !object;\\n object || (object = {});\\n\\n var index = -1,\\n length = props.length;\\n\\n while (++index < length) {\\n var key = props[index];\\n\\n var newValue = customizer\\n ? customizer(object[key], source[key], key, object, source)\\n : undefined;\\n\\n if (newValue === undefined) {\\n newValue = source[key];\\n }\\n if (isNew) {\\n baseAssignValue(object, key, newValue);\\n } else {\\n assignValue(object, key, newValue);\\n }\\n }\\n return object;\\n }\\n\\n /**\\n * Copies own symbols of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy symbols from.\\n * @param {Object} [object={}] The object to copy symbols to.\\n * @returns {Object} Returns `object`.\\n */\\n function copySymbols(source, object) {\\n return copyObject(source, getSymbols(source), object);\\n }\\n\\n /**\\n * Copies own and inherited symbols of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy symbols from.\\n * @param {Object} [object={}] The object to copy symbols to.\\n * @returns {Object} Returns `object`.\\n */\\n function copySymbolsIn(source, object) {\\n return copyObject(source, getSymbolsIn(source), object);\\n }\\n\\n /**\\n * Creates a function like `_.groupBy`.\\n *\\n * @private\\n * @param {Function} setter The function to set accumulator values.\\n * @param {Function} [initializer] The accumulator object initializer.\\n * @returns {Function} Returns the new aggregator function.\\n */\\n function createAggregator(setter, initializer) {\\n return function(collection, iteratee) {\\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\\n accumulator = initializer ? initializer() : {};\\n\\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\\n };\\n }\\n\\n /**\\n * Creates a function like `_.assign`.\\n *\\n * @private\\n * @param {Function} assigner The function to assign values.\\n * @returns {Function} Returns the new assigner function.\\n */\\n function createAssigner(assigner) {\\n return baseRest(function(object, sources) {\\n var index = -1,\\n length = sources.length,\\n customizer = length > 1 ? sources[length - 1] : undefined,\\n guard = length > 2 ? sources[2] : undefined;\\n\\n customizer = (assigner.length > 3 && typeof customizer == 'function')\\n ? (length--, customizer)\\n : undefined;\\n\\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\\n customizer = length < 3 ? undefined : customizer;\\n length = 1;\\n }\\n object = Object(object);\\n while (++index < length) {\\n var source = sources[index];\\n if (source) {\\n assigner(object, source, index, customizer);\\n }\\n }\\n return object;\\n });\\n }\\n\\n /**\\n * Creates a `baseEach` or `baseEachRight` function.\\n *\\n * @private\\n * @param {Function} eachFunc The function to iterate over a collection.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new base function.\\n */\\n function createBaseEach(eachFunc, fromRight) {\\n return function(collection, iteratee) {\\n if (collection == null) {\\n return collection;\\n }\\n if (!isArrayLike(collection)) {\\n return eachFunc(collection, iteratee);\\n }\\n var length = collection.length,\\n index = fromRight ? length : -1,\\n iterable = Object(collection);\\n\\n while ((fromRight ? index-- : ++index < length)) {\\n if (iteratee(iterable[index], index, iterable) === false) {\\n break;\\n }\\n }\\n return collection;\\n };\\n }\\n\\n /**\\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new base function.\\n */\\n function createBaseFor(fromRight) {\\n return function(object, iteratee, keysFunc) {\\n var index = -1,\\n iterable = Object(object),\\n props = keysFunc(object),\\n length = props.length;\\n\\n while (length--) {\\n var key = props[fromRight ? length : ++index];\\n if (iteratee(iterable[key], key, iterable) === false) {\\n break;\\n }\\n }\\n return object;\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with the optional `this`\\n * binding of `thisArg`.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createBind(func, bitmask, thisArg) {\\n var isBind = bitmask & WRAP_BIND_FLAG,\\n Ctor = createCtor(func);\\n\\n function wrapper() {\\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n return fn.apply(isBind ? thisArg : this, arguments);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a function like `_.lowerFirst`.\\n *\\n * @private\\n * @param {string} methodName The name of the `String` case method to use.\\n * @returns {Function} Returns the new case function.\\n */\\n function createCaseFirst(methodName) {\\n return function(string) {\\n string = toString(string);\\n\\n var strSymbols = hasUnicode(string)\\n ? stringToArray(string)\\n : undefined;\\n\\n var chr = strSymbols\\n ? strSymbols[0]\\n : string.charAt(0);\\n\\n var trailing = strSymbols\\n ? castSlice(strSymbols, 1).join('')\\n : string.slice(1);\\n\\n return chr[methodName]() + trailing;\\n };\\n }\\n\\n /**\\n * Creates a function like `_.camelCase`.\\n *\\n * @private\\n * @param {Function} callback The function to combine each word.\\n * @returns {Function} Returns the new compounder function.\\n */\\n function createCompounder(callback) {\\n return function(string) {\\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\\n };\\n }\\n\\n /**\\n * Creates a function that produces an instance of `Ctor` regardless of\\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\\n *\\n * @private\\n * @param {Function} Ctor The constructor to wrap.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createCtor(Ctor) {\\n return function() {\\n // Use a `switch` statement to work with class constructors. See\\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\\n // for more details.\\n var args = arguments;\\n switch (args.length) {\\n case 0: return new Ctor;\\n case 1: return new Ctor(args[0]);\\n case 2: return new Ctor(args[0], args[1]);\\n case 3: return new Ctor(args[0], args[1], args[2]);\\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\\n }\\n var thisBinding = baseCreate(Ctor.prototype),\\n result = Ctor.apply(thisBinding, args);\\n\\n // Mimic the constructor's `return` behavior.\\n // See https://es5.github.io/#x13.2.2 for more details.\\n return isObject(result) ? result : thisBinding;\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to enable currying.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {number} arity The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createCurry(func, bitmask, arity) {\\n var Ctor = createCtor(func);\\n\\n function wrapper() {\\n var length = arguments.length,\\n args = Array(length),\\n index = length,\\n placeholder = getHolder(wrapper);\\n\\n while (index--) {\\n args[index] = arguments[index];\\n }\\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\\n ? []\\n : replaceHolders(args, placeholder);\\n\\n length -= holders.length;\\n if (length < arity) {\\n return createRecurry(\\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\\n args, holders, undefined, undefined, arity - length);\\n }\\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n return apply(fn, this, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a `_.find` or `_.findLast` function.\\n *\\n * @private\\n * @param {Function} findIndexFunc The function to find the collection index.\\n * @returns {Function} Returns the new find function.\\n */\\n function createFind(findIndexFunc) {\\n return function(collection, predicate, fromIndex) {\\n var iterable = Object(collection);\\n if (!isArrayLike(collection)) {\\n var iteratee = getIteratee(predicate, 3);\\n collection = keys(collection);\\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\\n }\\n var index = findIndexFunc(collection, predicate, fromIndex);\\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\\n };\\n }\\n\\n /**\\n * Creates a `_.flow` or `_.flowRight` function.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new flow function.\\n */\\n function createFlow(fromRight) {\\n return flatRest(function(funcs) {\\n var length = funcs.length,\\n index = length,\\n prereq = LodashWrapper.prototype.thru;\\n\\n if (fromRight) {\\n funcs.reverse();\\n }\\n while (index--) {\\n var func = funcs[index];\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\\n var wrapper = new LodashWrapper([], true);\\n }\\n }\\n index = wrapper ? index : length;\\n while (++index < length) {\\n func = funcs[index];\\n\\n var funcName = getFuncName(func),\\n data = funcName == 'wrapper' ? getData(func) : undefined;\\n\\n if (data && isLaziable(data[0]) &&\\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\\n !data[4].length && data[9] == 1\\n ) {\\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\\n } else {\\n wrapper = (func.length == 1 && isLaziable(func))\\n ? wrapper[funcName]()\\n : wrapper.thru(func);\\n }\\n }\\n return function() {\\n var args = arguments,\\n value = args[0];\\n\\n if (wrapper && args.length == 1 && isArray(value)) {\\n return wrapper.plant(value).value();\\n }\\n var index = 0,\\n result = length ? funcs[index].apply(this, args) : value;\\n\\n while (++index < length) {\\n result = funcs[index].call(this, result);\\n }\\n return result;\\n };\\n });\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with optional `this`\\n * binding of `thisArg`, partial application, and currying.\\n *\\n * @private\\n * @param {Function|string} func The function or method name to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to prepend to those provided to\\n * the new function.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [partialsRight] The arguments to append to those provided\\n * to the new function.\\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\\n var isAry = bitmask & WRAP_ARY_FLAG,\\n isBind = bitmask & WRAP_BIND_FLAG,\\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\\n isFlip = bitmask & WRAP_FLIP_FLAG,\\n Ctor = isBindKey ? undefined : createCtor(func);\\n\\n function wrapper() {\\n var length = arguments.length,\\n args = Array(length),\\n index = length;\\n\\n while (index--) {\\n args[index] = arguments[index];\\n }\\n if (isCurried) {\\n var placeholder = getHolder(wrapper),\\n holdersCount = countHolders(args, placeholder);\\n }\\n if (partials) {\\n args = composeArgs(args, partials, holders, isCurried);\\n }\\n if (partialsRight) {\\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\\n }\\n length -= holdersCount;\\n if (isCurried && length < arity) {\\n var newHolders = replaceHolders(args, placeholder);\\n return createRecurry(\\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\\n args, newHolders, argPos, ary, arity - length\\n );\\n }\\n var thisBinding = isBind ? thisArg : this,\\n fn = isBindKey ? thisBinding[func] : func;\\n\\n length = args.length;\\n if (argPos) {\\n args = reorder(args, argPos);\\n } else if (isFlip && length > 1) {\\n args.reverse();\\n }\\n if (isAry && ary < length) {\\n args.length = ary;\\n }\\n if (this && this !== root && this instanceof wrapper) {\\n fn = Ctor || createCtor(fn);\\n }\\n return fn.apply(thisBinding, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a function like `_.invertBy`.\\n *\\n * @private\\n * @param {Function} setter The function to set accumulator values.\\n * @param {Function} toIteratee The function to resolve iteratees.\\n * @returns {Function} Returns the new inverter function.\\n */\\n function createInverter(setter, toIteratee) {\\n return function(object, iteratee) {\\n return baseInverter(object, setter, toIteratee(iteratee), {});\\n };\\n }\\n\\n /**\\n * Creates a function that performs a mathematical operation on two values.\\n *\\n * @private\\n * @param {Function} operator The function to perform the operation.\\n * @param {number} [defaultValue] The value used for `undefined` arguments.\\n * @returns {Function} Returns the new mathematical operation function.\\n */\\n function createMathOperation(operator, defaultValue) {\\n return function(value, other) {\\n var result;\\n if (value === undefined && other === undefined) {\\n return defaultValue;\\n }\\n if (value !== undefined) {\\n result = value;\\n }\\n if (other !== undefined) {\\n if (result === undefined) {\\n return other;\\n }\\n if (typeof value == 'string' || typeof other == 'string') {\\n value = baseToString(value);\\n other = baseToString(other);\\n } else {\\n value = baseToNumber(value);\\n other = baseToNumber(other);\\n }\\n result = operator(value, other);\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Creates a function like `_.over`.\\n *\\n * @private\\n * @param {Function} arrayFunc The function to iterate over iteratees.\\n * @returns {Function} Returns the new over function.\\n */\\n function createOver(arrayFunc) {\\n return flatRest(function(iteratees) {\\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\\n return baseRest(function(args) {\\n var thisArg = this;\\n return arrayFunc(iteratees, function(iteratee) {\\n return apply(iteratee, thisArg, args);\\n });\\n });\\n });\\n }\\n\\n /**\\n * Creates the padding for `string` based on `length`. The `chars` string\\n * is truncated if the number of characters exceeds `length`.\\n *\\n * @private\\n * @param {number} length The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padding for `string`.\\n */\\n function createPadding(length, chars) {\\n chars = chars === undefined ? ' ' : baseToString(chars);\\n\\n var charsLength = chars.length;\\n if (charsLength < 2) {\\n return charsLength ? baseRepeat(chars, length) : chars;\\n }\\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\\n return hasUnicode(chars)\\n ? castSlice(stringToArray(result), 0, length).join('')\\n : result.slice(0, length);\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with the `this` binding\\n * of `thisArg` and `partials` prepended to the arguments it receives.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {Array} partials The arguments to prepend to those provided to\\n * the new function.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createPartial(func, bitmask, thisArg, partials) {\\n var isBind = bitmask & WRAP_BIND_FLAG,\\n Ctor = createCtor(func);\\n\\n function wrapper() {\\n var argsIndex = -1,\\n argsLength = arguments.length,\\n leftIndex = -1,\\n leftLength = partials.length,\\n args = Array(leftLength + argsLength),\\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n\\n while (++leftIndex < leftLength) {\\n args[leftIndex] = partials[leftIndex];\\n }\\n while (argsLength--) {\\n args[leftIndex++] = arguments[++argsIndex];\\n }\\n return apply(fn, isBind ? thisArg : this, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a `_.range` or `_.rangeRight` function.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new range function.\\n */\\n function createRange(fromRight) {\\n return function(start, end, step) {\\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\\n end = step = undefined;\\n }\\n // Ensure the sign of `-0` is preserved.\\n start = toFinite(start);\\n if (end === undefined) {\\n end = start;\\n start = 0;\\n } else {\\n end = toFinite(end);\\n }\\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\\n return baseRange(start, end, step, fromRight);\\n };\\n }\\n\\n /**\\n * Creates a function that performs a relational operation on two values.\\n *\\n * @private\\n * @param {Function} operator The function to perform the operation.\\n * @returns {Function} Returns the new relational operation function.\\n */\\n function createRelationalOperation(operator) {\\n return function(value, other) {\\n if (!(typeof value == 'string' && typeof other == 'string')) {\\n value = toNumber(value);\\n other = toNumber(other);\\n }\\n return operator(value, other);\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to continue currying.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {Function} wrapFunc The function to create the `func` wrapper.\\n * @param {*} placeholder The placeholder value.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to prepend to those provided to\\n * the new function.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\\n var isCurry = bitmask & WRAP_CURRY_FLAG,\\n newHolders = isCurry ? holders : undefined,\\n newHoldersRight = isCurry ? undefined : holders,\\n newPartials = isCurry ? partials : undefined,\\n newPartialsRight = isCurry ? undefined : partials;\\n\\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\\n\\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\\n }\\n var newData = [\\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\\n newHoldersRight, argPos, ary, arity\\n ];\\n\\n var result = wrapFunc.apply(undefined, newData);\\n if (isLaziable(func)) {\\n setData(result, newData);\\n }\\n result.placeholder = placeholder;\\n return setWrapToString(result, func, bitmask);\\n }\\n\\n /**\\n * Creates a function like `_.round`.\\n *\\n * @private\\n * @param {string} methodName The name of the `Math` method to use when rounding.\\n * @returns {Function} Returns the new round function.\\n */\\n function createRound(methodName) {\\n var func = Math[methodName];\\n return function(number, precision) {\\n number = toNumber(number);\\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\\n if (precision) {\\n // Shift with exponential notation to avoid floating-point issues.\\n // See [MDN](https://mdn.io/round#Examples) for more details.\\n var pair = (toString(number) + 'e').split('e'),\\n value = func(pair[0] + 'e' + (+pair[1] + precision));\\n\\n pair = (toString(value) + 'e').split('e');\\n return +(pair[0] + 'e' + (+pair[1] - precision));\\n }\\n return func(number);\\n };\\n }\\n\\n /**\\n * Creates a set object of `values`.\\n *\\n * @private\\n * @param {Array} values The values to add to the set.\\n * @returns {Object} Returns the new set.\\n */\\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\\n return new Set(values);\\n };\\n\\n /**\\n * Creates a `_.toPairs` or `_.toPairsIn` function.\\n *\\n * @private\\n * @param {Function} keysFunc The function to get the keys of a given object.\\n * @returns {Function} Returns the new pairs function.\\n */\\n function createToPairs(keysFunc) {\\n return function(object) {\\n var tag = getTag(object);\\n if (tag == mapTag) {\\n return mapToArray(object);\\n }\\n if (tag == setTag) {\\n return setToPairs(object);\\n }\\n return baseToPairs(object, keysFunc(object));\\n };\\n }\\n\\n /**\\n * Creates a function that either curries or invokes `func` with optional\\n * `this` binding and partially applied arguments.\\n *\\n * @private\\n * @param {Function|string} func The function or method name to wrap.\\n * @param {number} bitmask The bitmask flags.\\n * 1 - `_.bind`\\n * 2 - `_.bindKey`\\n * 4 - `_.curry` or `_.curryRight` of a bound function\\n * 8 - `_.curry`\\n * 16 - `_.curryRight`\\n * 32 - `_.partial`\\n * 64 - `_.partialRight`\\n * 128 - `_.rearg`\\n * 256 - `_.ary`\\n * 512 - `_.flip`\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to be partially applied.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\\n if (!isBindKey && typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n var length = partials ? partials.length : 0;\\n if (!length) {\\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\\n partials = holders = undefined;\\n }\\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\\n arity = arity === undefined ? arity : toInteger(arity);\\n length -= holders ? holders.length : 0;\\n\\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\\n var partialsRight = partials,\\n holdersRight = holders;\\n\\n partials = holders = undefined;\\n }\\n var data = isBindKey ? undefined : getData(func);\\n\\n var newData = [\\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\\n argPos, ary, arity\\n ];\\n\\n if (data) {\\n mergeData(newData, data);\\n }\\n func = newData[0];\\n bitmask = newData[1];\\n thisArg = newData[2];\\n partials = newData[3];\\n holders = newData[4];\\n arity = newData[9] = newData[9] === undefined\\n ? (isBindKey ? 0 : func.length)\\n : nativeMax(newData[9] - length, 0);\\n\\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\\n }\\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\\n var result = createBind(func, bitmask, thisArg);\\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\\n result = createCurry(func, bitmask, arity);\\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\\n result = createPartial(func, bitmask, thisArg, partials);\\n } else {\\n result = createHybrid.apply(undefined, newData);\\n }\\n var setter = data ? baseSetData : setData;\\n return setWrapToString(setter(result, newData), func, bitmask);\\n }\\n\\n /**\\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\\n * of source objects to the destination object for all destination properties\\n * that resolve to `undefined`.\\n *\\n * @private\\n * @param {*} objValue The destination value.\\n * @param {*} srcValue The source value.\\n * @param {string} key The key of the property to assign.\\n * @param {Object} object The parent object of `objValue`.\\n * @returns {*} Returns the value to assign.\\n */\\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\\n if (objValue === undefined ||\\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\\n return srcValue;\\n }\\n return objValue;\\n }\\n\\n /**\\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\\n * objects into destination objects that are passed thru.\\n *\\n * @private\\n * @param {*} objValue The destination value.\\n * @param {*} srcValue The source value.\\n * @param {string} key The key of the property to merge.\\n * @param {Object} object The parent object of `objValue`.\\n * @param {Object} source The parent object of `srcValue`.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n * @returns {*} Returns the value to assign.\\n */\\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\\n if (isObject(objValue) && isObject(srcValue)) {\\n // Recursively merge objects and arrays (susceptible to call stack limits).\\n stack.set(srcValue, objValue);\\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\\n stack['delete'](srcValue);\\n }\\n return objValue;\\n }\\n\\n /**\\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\\n * objects.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @param {string} key The key of the property to inspect.\\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\\n */\\n function customOmitClone(value) {\\n return isPlainObject(value) ? undefined : value;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for arrays with support for\\n * partial deep comparisons.\\n *\\n * @private\\n * @param {Array} array The array to compare.\\n * @param {Array} other The other array to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `array` and `other` objects.\\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\\n */\\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\\n arrLength = array.length,\\n othLength = other.length;\\n\\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\\n return false;\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(array);\\n if (stacked && stack.get(other)) {\\n return stacked == other;\\n }\\n var index = -1,\\n result = true,\\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\\n\\n stack.set(array, other);\\n stack.set(other, array);\\n\\n // Ignore non-index properties.\\n while (++index < arrLength) {\\n var arrValue = array[index],\\n othValue = other[index];\\n\\n if (customizer) {\\n var compared = isPartial\\n ? customizer(othValue, arrValue, index, other, array, stack)\\n : customizer(arrValue, othValue, index, array, other, stack);\\n }\\n if (compared !== undefined) {\\n if (compared) {\\n continue;\\n }\\n result = false;\\n break;\\n }\\n // Recursively compare arrays (susceptible to call stack limits).\\n if (seen) {\\n if (!arraySome(other, function(othValue, othIndex) {\\n if (!cacheHas(seen, othIndex) &&\\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\\n return seen.push(othIndex);\\n }\\n })) {\\n result = false;\\n break;\\n }\\n } else if (!(\\n arrValue === othValue ||\\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\\n )) {\\n result = false;\\n break;\\n }\\n }\\n stack['delete'](array);\\n stack['delete'](other);\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for comparing objects of\\n * the same `toStringTag`.\\n *\\n * **Note:** This function only supports comparing values with tags of\\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {string} tag The `toStringTag` of the objects to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\\n switch (tag) {\\n case dataViewTag:\\n if ((object.byteLength != other.byteLength) ||\\n (object.byteOffset != other.byteOffset)) {\\n return false;\\n }\\n object = object.buffer;\\n other = other.buffer;\\n\\n case arrayBufferTag:\\n if ((object.byteLength != other.byteLength) ||\\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\\n return false;\\n }\\n return true;\\n\\n case boolTag:\\n case dateTag:\\n case numberTag:\\n // Coerce booleans to `1` or `0` and dates to milliseconds.\\n // Invalid dates are coerced to `NaN`.\\n return eq(+object, +other);\\n\\n case errorTag:\\n return object.name == other.name && object.message == other.message;\\n\\n case regexpTag:\\n case stringTag:\\n // Coerce regexes to strings and treat strings, primitives and objects,\\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\\n // for more details.\\n return object == (other + '');\\n\\n case mapTag:\\n var convert = mapToArray;\\n\\n case setTag:\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\\n convert || (convert = setToArray);\\n\\n if (object.size != other.size && !isPartial) {\\n return false;\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(object);\\n if (stacked) {\\n return stacked == other;\\n }\\n bitmask |= COMPARE_UNORDERED_FLAG;\\n\\n // Recursively compare objects (susceptible to call stack limits).\\n stack.set(object, other);\\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\\n stack['delete'](object);\\n return result;\\n\\n case symbolTag:\\n if (symbolValueOf) {\\n return symbolValueOf.call(object) == symbolValueOf.call(other);\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for objects with support for\\n * partial deep comparisons.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\\n objProps = getAllKeys(object),\\n objLength = objProps.length,\\n othProps = getAllKeys(other),\\n othLength = othProps.length;\\n\\n if (objLength != othLength && !isPartial) {\\n return false;\\n }\\n var index = objLength;\\n while (index--) {\\n var key = objProps[index];\\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\\n return false;\\n }\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(object);\\n if (stacked && stack.get(other)) {\\n return stacked == other;\\n }\\n var result = true;\\n stack.set(object, other);\\n stack.set(other, object);\\n\\n var skipCtor = isPartial;\\n while (++index < objLength) {\\n key = objProps[index];\\n var objValue = object[key],\\n othValue = other[key];\\n\\n if (customizer) {\\n var compared = isPartial\\n ? customizer(othValue, objValue, key, other, object, stack)\\n : customizer(objValue, othValue, key, object, other, stack);\\n }\\n // Recursively compare objects (susceptible to call stack limits).\\n if (!(compared === undefined\\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\\n : compared\\n )) {\\n result = false;\\n break;\\n }\\n skipCtor || (skipCtor = key == 'constructor');\\n }\\n if (result && !skipCtor) {\\n var objCtor = object.constructor,\\n othCtor = other.constructor;\\n\\n // Non `Object` object instances with different constructors are not equal.\\n if (objCtor != othCtor &&\\n ('constructor' in object && 'constructor' in other) &&\\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\\n result = false;\\n }\\n }\\n stack['delete'](object);\\n stack['delete'](other);\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseRest` which flattens the rest array.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @returns {Function} Returns the new function.\\n */\\n function flatRest(func) {\\n return setToString(overRest(func, undefined, flatten), func + '');\\n }\\n\\n /**\\n * Creates an array of own enumerable property names and symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function getAllKeys(object) {\\n return baseGetAllKeys(object, keys, getSymbols);\\n }\\n\\n /**\\n * Creates an array of own and inherited enumerable property names and\\n * symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function getAllKeysIn(object) {\\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\\n }\\n\\n /**\\n * Gets metadata for `func`.\\n *\\n * @private\\n * @param {Function} func The function to query.\\n * @returns {*} Returns the metadata for `func`.\\n */\\n var getData = !metaMap ? noop : function(func) {\\n return metaMap.get(func);\\n };\\n\\n /**\\n * Gets the name of `func`.\\n *\\n * @private\\n * @param {Function} func The function to query.\\n * @returns {string} Returns the function name.\\n */\\n function getFuncName(func) {\\n var result = (func.name + ''),\\n array = realNames[result],\\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\\n\\n while (length--) {\\n var data = array[length],\\n otherFunc = data.func;\\n if (otherFunc == null || otherFunc == func) {\\n return data.name;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the argument placeholder value for `func`.\\n *\\n * @private\\n * @param {Function} func The function to inspect.\\n * @returns {*} Returns the placeholder value.\\n */\\n function getHolder(func) {\\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\\n return object.placeholder;\\n }\\n\\n /**\\n * Gets the appropriate \\\"iteratee\\\" function. If `_.iteratee` is customized,\\n * this function returns the custom method, otherwise it returns `baseIteratee`.\\n * If arguments are provided, the chosen function is invoked with them and\\n * its result is returned.\\n *\\n * @private\\n * @param {*} [value] The value to convert to an iteratee.\\n * @param {number} [arity] The arity of the created iteratee.\\n * @returns {Function} Returns the chosen function or its result.\\n */\\n function getIteratee() {\\n var result = lodash.iteratee || iteratee;\\n result = result === iteratee ? baseIteratee : result;\\n return arguments.length ? result(arguments[0], arguments[1]) : result;\\n }\\n\\n /**\\n * Gets the data for `map`.\\n *\\n * @private\\n * @param {Object} map The map to query.\\n * @param {string} key The reference key.\\n * @returns {*} Returns the map data.\\n */\\n function getMapData(map, key) {\\n var data = map.__data__;\\n return isKeyable(key)\\n ? data[typeof key == 'string' ? 'string' : 'hash']\\n : data.map;\\n }\\n\\n /**\\n * Gets the property names, values, and compare flags of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the match data of `object`.\\n */\\n function getMatchData(object) {\\n var result = keys(object),\\n length = result.length;\\n\\n while (length--) {\\n var key = result[length],\\n value = object[key];\\n\\n result[length] = [key, value, isStrictComparable(value)];\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the native function at `key` of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {string} key The key of the method to get.\\n * @returns {*} Returns the function if it's native, else `undefined`.\\n */\\n function getNative(object, key) {\\n var value = getValue(object, key);\\n return baseIsNative(value) ? value : undefined;\\n }\\n\\n /**\\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the raw `toStringTag`.\\n */\\n function getRawTag(value) {\\n var isOwn = hasOwnProperty.call(value, symToStringTag),\\n tag = value[symToStringTag];\\n\\n try {\\n value[symToStringTag] = undefined;\\n var unmasked = true;\\n } catch (e) {}\\n\\n var result = nativeObjectToString.call(value);\\n if (unmasked) {\\n if (isOwn) {\\n value[symToStringTag] = tag;\\n } else {\\n delete value[symToStringTag];\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Creates an array of the own enumerable symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of symbols.\\n */\\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\\n if (object == null) {\\n return [];\\n }\\n object = Object(object);\\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\\n return propertyIsEnumerable.call(object, symbol);\\n });\\n };\\n\\n /**\\n * Creates an array of the own and inherited enumerable symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of symbols.\\n */\\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\\n var result = [];\\n while (object) {\\n arrayPush(result, getSymbols(object));\\n object = getPrototype(object);\\n }\\n return result;\\n };\\n\\n /**\\n * Gets the `toStringTag` of `value`.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the `toStringTag`.\\n */\\n var getTag = baseGetTag;\\n\\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\\n (Map && getTag(new Map) != mapTag) ||\\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\\n (Set && getTag(new Set) != setTag) ||\\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\\n getTag = function(value) {\\n var result = baseGetTag(value),\\n Ctor = result == objectTag ? value.constructor : undefined,\\n ctorString = Ctor ? toSource(Ctor) : '';\\n\\n if (ctorString) {\\n switch (ctorString) {\\n case dataViewCtorString: return dataViewTag;\\n case mapCtorString: return mapTag;\\n case promiseCtorString: return promiseTag;\\n case setCtorString: return setTag;\\n case weakMapCtorString: return weakMapTag;\\n }\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\\n *\\n * @private\\n * @param {number} start The start of the view.\\n * @param {number} end The end of the view.\\n * @param {Array} transforms The transformations to apply to the view.\\n * @returns {Object} Returns an object containing the `start` and `end`\\n * positions of the view.\\n */\\n function getView(start, end, transforms) {\\n var index = -1,\\n length = transforms.length;\\n\\n while (++index < length) {\\n var data = transforms[index],\\n size = data.size;\\n\\n switch (data.type) {\\n case 'drop': start += size; break;\\n case 'dropRight': end -= size; break;\\n case 'take': end = nativeMin(end, start + size); break;\\n case 'takeRight': start = nativeMax(start, end - size); break;\\n }\\n }\\n return { 'start': start, 'end': end };\\n }\\n\\n /**\\n * Extracts wrapper details from the `source` body comment.\\n *\\n * @private\\n * @param {string} source The source to inspect.\\n * @returns {Array} Returns the wrapper details.\\n */\\n function getWrapDetails(source) {\\n var match = source.match(reWrapDetails);\\n return match ? match[1].split(reSplitDetails) : [];\\n }\\n\\n /**\\n * Checks if `path` exists on `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @param {Function} hasFunc The function to check properties.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n */\\n function hasPath(object, path, hasFunc) {\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length,\\n result = false;\\n\\n while (++index < length) {\\n var key = toKey(path[index]);\\n if (!(result = object != null && hasFunc(object, key))) {\\n break;\\n }\\n object = object[key];\\n }\\n if (result || ++index != length) {\\n return result;\\n }\\n length = object == null ? 0 : object.length;\\n return !!length && isLength(length) && isIndex(key, length) &&\\n (isArray(object) || isArguments(object));\\n }\\n\\n /**\\n * Initializes an array clone.\\n *\\n * @private\\n * @param {Array} array The array to clone.\\n * @returns {Array} Returns the initialized clone.\\n */\\n function initCloneArray(array) {\\n var length = array.length,\\n result = array.constructor(length);\\n\\n // Add properties assigned by `RegExp#exec`.\\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\\n result.index = array.index;\\n result.input = array.input;\\n }\\n return result;\\n }\\n\\n /**\\n * Initializes an object clone.\\n *\\n * @private\\n * @param {Object} object The object to clone.\\n * @returns {Object} Returns the initialized clone.\\n */\\n function initCloneObject(object) {\\n return (typeof object.constructor == 'function' && !isPrototype(object))\\n ? baseCreate(getPrototype(object))\\n : {};\\n }\\n\\n /**\\n * Initializes an object clone based on its `toStringTag`.\\n *\\n * **Note:** This function only supports cloning values with tags of\\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\\n *\\n * @private\\n * @param {Object} object The object to clone.\\n * @param {string} tag The `toStringTag` of the object to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the initialized clone.\\n */\\n function initCloneByTag(object, tag, cloneFunc, isDeep) {\\n var Ctor = object.constructor;\\n switch (tag) {\\n case arrayBufferTag:\\n return cloneArrayBuffer(object);\\n\\n case boolTag:\\n case dateTag:\\n return new Ctor(+object);\\n\\n case dataViewTag:\\n return cloneDataView(object, isDeep);\\n\\n case float32Tag: case float64Tag:\\n case int8Tag: case int16Tag: case int32Tag:\\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\\n return cloneTypedArray(object, isDeep);\\n\\n case mapTag:\\n return cloneMap(object, isDeep, cloneFunc);\\n\\n case numberTag:\\n case stringTag:\\n return new Ctor(object);\\n\\n case regexpTag:\\n return cloneRegExp(object);\\n\\n case setTag:\\n return cloneSet(object, isDeep, cloneFunc);\\n\\n case symbolTag:\\n return cloneSymbol(object);\\n }\\n }\\n\\n /**\\n * Inserts wrapper `details` in a comment at the top of the `source` body.\\n *\\n * @private\\n * @param {string} source The source to modify.\\n * @returns {Array} details The details to insert.\\n * @returns {string} Returns the modified source.\\n */\\n function insertWrapDetails(source, details) {\\n var length = details.length;\\n if (!length) {\\n return source;\\n }\\n var lastIndex = length - 1;\\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\\n details = details.join(length > 2 ? ', ' : ' ');\\n return source.replace(reWrapComment, '{\\\\n/* [wrapped with ' + details + '] */\\\\n');\\n }\\n\\n /**\\n * Checks if `value` is a flattenable `arguments` object or array.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\\n */\\n function isFlattenable(value) {\\n return isArray(value) || isArguments(value) ||\\n !!(spreadableSymbol && value && value[spreadableSymbol]);\\n }\\n\\n /**\\n * Checks if `value` is a valid array-like index.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\\n */\\n function isIndex(value, length) {\\n length = length == null ? MAX_SAFE_INTEGER : length;\\n return !!length &&\\n (typeof value == 'number' || reIsUint.test(value)) &&\\n (value > -1 && value % 1 == 0 && value < length);\\n }\\n\\n /**\\n * Checks if the given arguments are from an iteratee call.\\n *\\n * @private\\n * @param {*} value The potential iteratee value argument.\\n * @param {*} index The potential iteratee index or key argument.\\n * @param {*} object The potential iteratee object argument.\\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\\n * else `false`.\\n */\\n function isIterateeCall(value, index, object) {\\n if (!isObject(object)) {\\n return false;\\n }\\n var type = typeof index;\\n if (type == 'number'\\n ? (isArrayLike(object) && isIndex(index, object.length))\\n : (type == 'string' && index in object)\\n ) {\\n return eq(object[index], value);\\n }\\n return false;\\n }\\n\\n /**\\n * Checks if `value` is a property name and not a property path.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @param {Object} [object] The object to query keys on.\\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\\n */\\n function isKey(value, object) {\\n if (isArray(value)) {\\n return false;\\n }\\n var type = typeof value;\\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\\n value == null || isSymbol(value)) {\\n return true;\\n }\\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\\n (object != null && value in Object(object));\\n }\\n\\n /**\\n * Checks if `value` is suitable for use as unique object key.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\\n */\\n function isKeyable(value) {\\n var type = typeof value;\\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\\n ? (value !== '__proto__')\\n : (value === null);\\n }\\n\\n /**\\n * Checks if `func` has a lazy counterpart.\\n *\\n * @private\\n * @param {Function} func The function to check.\\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\\n * else `false`.\\n */\\n function isLaziable(func) {\\n var funcName = getFuncName(func),\\n other = lodash[funcName];\\n\\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\\n return false;\\n }\\n if (func === other) {\\n return true;\\n }\\n var data = getData(other);\\n return !!data && func === data[0];\\n }\\n\\n /**\\n * Checks if `func` has its source masked.\\n *\\n * @private\\n * @param {Function} func The function to check.\\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\\n */\\n function isMasked(func) {\\n return !!maskSrcKey && (maskSrcKey in func);\\n }\\n\\n /**\\n * Checks if `func` is capable of being masked.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\\n */\\n var isMaskable = coreJsData ? isFunction : stubFalse;\\n\\n /**\\n * Checks if `value` is likely a prototype object.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\\n */\\n function isPrototype(value) {\\n var Ctor = value && value.constructor,\\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\\n\\n return value === proto;\\n }\\n\\n /**\\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` if suitable for strict\\n * equality comparisons, else `false`.\\n */\\n function isStrictComparable(value) {\\n return value === value && !isObject(value);\\n }\\n\\n /**\\n * A specialized version of `matchesProperty` for source values suitable\\n * for strict equality comparisons, i.e. `===`.\\n *\\n * @private\\n * @param {string} key The key of the property to get.\\n * @param {*} srcValue The value to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function matchesStrictComparable(key, srcValue) {\\n return function(object) {\\n if (object == null) {\\n return false;\\n }\\n return object[key] === srcValue &&\\n (srcValue !== undefined || (key in Object(object)));\\n };\\n }\\n\\n /**\\n * A specialized version of `_.memoize` which clears the memoized function's\\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\\n *\\n * @private\\n * @param {Function} func The function to have its output memoized.\\n * @returns {Function} Returns the new memoized function.\\n */\\n function memoizeCapped(func) {\\n var result = memoize(func, function(key) {\\n if (cache.size === MAX_MEMOIZE_SIZE) {\\n cache.clear();\\n }\\n return key;\\n });\\n\\n var cache = result.cache;\\n return result;\\n }\\n\\n /**\\n * Merges the function metadata of `source` into `data`.\\n *\\n * Merging metadata reduces the number of wrappers used to invoke a function.\\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\\n * may be applied regardless of execution order. Methods like `_.ary` and\\n * `_.rearg` modify function arguments, making the order in which they are\\n * executed important, preventing the merging of metadata. However, we make\\n * an exception for a safe combined case where curried functions have `_.ary`\\n * and or `_.rearg` applied.\\n *\\n * @private\\n * @param {Array} data The destination metadata.\\n * @param {Array} source The source metadata.\\n * @returns {Array} Returns `data`.\\n */\\n function mergeData(data, source) {\\n var bitmask = data[1],\\n srcBitmask = source[1],\\n newBitmask = bitmask | srcBitmask,\\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\\n\\n var isCombo =\\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\\n\\n // Exit early if metadata can't be merged.\\n if (!(isCommon || isCombo)) {\\n return data;\\n }\\n // Use source `thisArg` if available.\\n if (srcBitmask & WRAP_BIND_FLAG) {\\n data[2] = source[2];\\n // Set when currying a bound function.\\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\\n }\\n // Compose partial arguments.\\n var value = source[3];\\n if (value) {\\n var partials = data[3];\\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\\n }\\n // Compose partial right arguments.\\n value = source[5];\\n if (value) {\\n partials = data[5];\\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\\n }\\n // Use source `argPos` if available.\\n value = source[7];\\n if (value) {\\n data[7] = value;\\n }\\n // Use source `ary` if it's smaller.\\n if (srcBitmask & WRAP_ARY_FLAG) {\\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\\n }\\n // Use source `arity` if one is not provided.\\n if (data[9] == null) {\\n data[9] = source[9];\\n }\\n // Use source `func` and merge bitmasks.\\n data[0] = source[0];\\n data[1] = newBitmask;\\n\\n return data;\\n }\\n\\n /**\\n * This function is like\\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\\n * except that it includes inherited enumerable properties.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function nativeKeysIn(object) {\\n var result = [];\\n if (object != null) {\\n for (var key in Object(object)) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `value` to a string using `Object.prototype.toString`.\\n *\\n * @private\\n * @param {*} value The value to convert.\\n * @returns {string} Returns the converted string.\\n */\\n function objectToString(value) {\\n return nativeObjectToString.call(value);\\n }\\n\\n /**\\n * A specialized version of `baseRest` which transforms the rest array.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @param {Function} transform The rest array transform.\\n * @returns {Function} Returns the new function.\\n */\\n function overRest(func, start, transform) {\\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\\n return function() {\\n var args = arguments,\\n index = -1,\\n length = nativeMax(args.length - start, 0),\\n array = Array(length);\\n\\n while (++index < length) {\\n array[index] = args[start + index];\\n }\\n index = -1;\\n var otherArgs = Array(start + 1);\\n while (++index < start) {\\n otherArgs[index] = args[index];\\n }\\n otherArgs[start] = transform(array);\\n return apply(func, this, otherArgs);\\n };\\n }\\n\\n /**\\n * Gets the parent value at `path` of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} path The path to get the parent value of.\\n * @returns {*} Returns the parent value.\\n */\\n function parent(object, path) {\\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\\n }\\n\\n /**\\n * Reorder `array` according to the specified indexes where the element at\\n * the first index is assigned as the first element, the element at\\n * the second index is assigned as the second element, and so on.\\n *\\n * @private\\n * @param {Array} array The array to reorder.\\n * @param {Array} indexes The arranged array indexes.\\n * @returns {Array} Returns `array`.\\n */\\n function reorder(array, indexes) {\\n var arrLength = array.length,\\n length = nativeMin(indexes.length, arrLength),\\n oldArray = copyArray(array);\\n\\n while (length--) {\\n var index = indexes[length];\\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\\n }\\n return array;\\n }\\n\\n /**\\n * Sets metadata for `func`.\\n *\\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\\n * period of time, it will trip its breaker and transition to an identity\\n * function to avoid garbage collection pauses in V8. See\\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\\n * for more details.\\n *\\n * @private\\n * @param {Function} func The function to associate metadata with.\\n * @param {*} data The metadata.\\n * @returns {Function} Returns `func`.\\n */\\n var setData = shortOut(baseSetData);\\n\\n /**\\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\\n *\\n * @private\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @returns {number|Object} Returns the timer id or timeout object.\\n */\\n var setTimeout = ctxSetTimeout || function(func, wait) {\\n return root.setTimeout(func, wait);\\n };\\n\\n /**\\n * Sets the `toString` method of `func` to return `string`.\\n *\\n * @private\\n * @param {Function} func The function to modify.\\n * @param {Function} string The `toString` result.\\n * @returns {Function} Returns `func`.\\n */\\n var setToString = shortOut(baseSetToString);\\n\\n /**\\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\\n * with wrapper details in a comment at the top of the source body.\\n *\\n * @private\\n * @param {Function} wrapper The function to modify.\\n * @param {Function} reference The reference function.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @returns {Function} Returns `wrapper`.\\n */\\n function setWrapToString(wrapper, reference, bitmask) {\\n var source = (reference + '');\\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\\n }\\n\\n /**\\n * Creates a function that'll short out and invoke `identity` instead\\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\\n * milliseconds.\\n *\\n * @private\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new shortable function.\\n */\\n function shortOut(func) {\\n var count = 0,\\n lastCalled = 0;\\n\\n return function() {\\n var stamp = nativeNow(),\\n remaining = HOT_SPAN - (stamp - lastCalled);\\n\\n lastCalled = stamp;\\n if (remaining > 0) {\\n if (++count >= HOT_COUNT) {\\n return arguments[0];\\n }\\n } else {\\n count = 0;\\n }\\n return func.apply(undefined, arguments);\\n };\\n }\\n\\n /**\\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\\n *\\n * @private\\n * @param {Array} array The array to shuffle.\\n * @param {number} [size=array.length] The size of `array`.\\n * @returns {Array} Returns `array`.\\n */\\n function shuffleSelf(array, size) {\\n var index = -1,\\n length = array.length,\\n lastIndex = length - 1;\\n\\n size = size === undefined ? length : size;\\n while (++index < size) {\\n var rand = baseRandom(index, lastIndex),\\n value = array[rand];\\n\\n array[rand] = array[index];\\n array[index] = value;\\n }\\n array.length = size;\\n return array;\\n }\\n\\n /**\\n * Converts `string` to a property path array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the property path array.\\n */\\n var stringToPath = memoizeCapped(function(string) {\\n var result = [];\\n if (reLeadingDot.test(string)) {\\n result.push('');\\n }\\n string.replace(rePropName, function(match, number, quote, string) {\\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\\n });\\n return result;\\n });\\n\\n /**\\n * Converts `value` to a string key if it's not a string or symbol.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {string|symbol} Returns the key.\\n */\\n function toKey(value) {\\n if (typeof value == 'string' || isSymbol(value)) {\\n return value;\\n }\\n var result = (value + '');\\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\\n }\\n\\n /**\\n * Converts `func` to its source code.\\n *\\n * @private\\n * @param {Function} func The function to convert.\\n * @returns {string} Returns the source code.\\n */\\n function toSource(func) {\\n if (func != null) {\\n try {\\n return funcToString.call(func);\\n } catch (e) {}\\n try {\\n return (func + '');\\n } catch (e) {}\\n }\\n return '';\\n }\\n\\n /**\\n * Updates wrapper `details` based on `bitmask` flags.\\n *\\n * @private\\n * @returns {Array} details The details to modify.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @returns {Array} Returns `details`.\\n */\\n function updateWrapDetails(details, bitmask) {\\n arrayEach(wrapFlags, function(pair) {\\n var value = '_.' + pair[0];\\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\\n details.push(value);\\n }\\n });\\n return details.sort();\\n }\\n\\n /**\\n * Creates a clone of `wrapper`.\\n *\\n * @private\\n * @param {Object} wrapper The wrapper to clone.\\n * @returns {Object} Returns the cloned wrapper.\\n */\\n function wrapperClone(wrapper) {\\n if (wrapper instanceof LazyWrapper) {\\n return wrapper.clone();\\n }\\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\\n result.__actions__ = copyArray(wrapper.__actions__);\\n result.__index__ = wrapper.__index__;\\n result.__values__ = wrapper.__values__;\\n return result;\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an array of elements split into groups the length of `size`.\\n * If `array` can't be split evenly, the final chunk will be the remaining\\n * elements.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to process.\\n * @param {number} [size=1] The length of each chunk\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the new array of chunks.\\n * @example\\n *\\n * _.chunk(['a', 'b', 'c', 'd'], 2);\\n * // => [['a', 'b'], ['c', 'd']]\\n *\\n * _.chunk(['a', 'b', 'c', 'd'], 3);\\n * // => [['a', 'b', 'c'], ['d']]\\n */\\n function chunk(array, size, guard) {\\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\\n size = 1;\\n } else {\\n size = nativeMax(toInteger(size), 0);\\n }\\n var length = array == null ? 0 : array.length;\\n if (!length || size < 1) {\\n return [];\\n }\\n var index = 0,\\n resIndex = 0,\\n result = Array(nativeCeil(length / size));\\n\\n while (index < length) {\\n result[resIndex++] = baseSlice(array, index, (index += size));\\n }\\n return result;\\n }\\n\\n /**\\n * Creates an array with all falsey values removed. The values `false`, `null`,\\n * `0`, `\\\"\\\"`, `undefined`, and `NaN` are falsey.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to compact.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.compact([0, 1, false, 2, '', 3]);\\n * // => [1, 2, 3]\\n */\\n function compact(array) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (value) {\\n result[resIndex++] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Creates a new array concatenating `array` with any additional arrays\\n * and/or values.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to concatenate.\\n * @param {...*} [values] The values to concatenate.\\n * @returns {Array} Returns the new concatenated array.\\n * @example\\n *\\n * var array = [1];\\n * var other = _.concat(array, 2, [3], [[4]]);\\n *\\n * console.log(other);\\n * // => [1, 2, 3, [4]]\\n *\\n * console.log(array);\\n * // => [1]\\n */\\n function concat() {\\n var length = arguments.length;\\n if (!length) {\\n return [];\\n }\\n var args = Array(length - 1),\\n array = arguments[0],\\n index = length;\\n\\n while (index--) {\\n args[index - 1] = arguments[index];\\n }\\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\\n }\\n\\n /**\\n * Creates an array of `array` values not included in the other given arrays\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. The order and references of result values are\\n * determined by the first array.\\n *\\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.without, _.xor\\n * @example\\n *\\n * _.difference([2, 1], [2, 3]);\\n * // => [1]\\n */\\n var difference = baseRest(function(array, values) {\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.difference` except that it accepts `iteratee` which\\n * is invoked for each element of `array` and `values` to generate the criterion\\n * by which they're compared. The order and references of result values are\\n * determined by the first array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\\n * // => [{ 'x': 2 }]\\n */\\n var differenceBy = baseRest(function(array, values) {\\n var iteratee = last(values);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.difference` except that it accepts `comparator`\\n * which is invoked to compare elements of `array` to `values`. The order and\\n * references of result values are determined by the first array. The comparator\\n * is invoked with two arguments: (arrVal, othVal).\\n *\\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n *\\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\\n * // => [{ 'x': 2, 'y': 1 }]\\n */\\n var differenceWith = baseRest(function(array, values) {\\n var comparator = last(values);\\n if (isArrayLikeObject(comparator)) {\\n comparator = undefined;\\n }\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\\n : [];\\n });\\n\\n /**\\n * Creates a slice of `array` with `n` elements dropped from the beginning.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to drop.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.drop([1, 2, 3]);\\n * // => [2, 3]\\n *\\n * _.drop([1, 2, 3], 2);\\n * // => [3]\\n *\\n * _.drop([1, 2, 3], 5);\\n * // => []\\n *\\n * _.drop([1, 2, 3], 0);\\n * // => [1, 2, 3]\\n */\\n function drop(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n return baseSlice(array, n < 0 ? 0 : n, length);\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements dropped from the end.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to drop.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.dropRight([1, 2, 3]);\\n * // => [1, 2]\\n *\\n * _.dropRight([1, 2, 3], 2);\\n * // => [1]\\n *\\n * _.dropRight([1, 2, 3], 5);\\n * // => []\\n *\\n * _.dropRight([1, 2, 3], 0);\\n * // => [1, 2, 3]\\n */\\n function dropRight(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n n = length - n;\\n return baseSlice(array, 0, n < 0 ? 0 : n);\\n }\\n\\n /**\\n * Creates a slice of `array` excluding elements dropped from the end.\\n * Elements are dropped until `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.dropRightWhile(users, function(o) { return !o.active; });\\n * // => objects for ['barney']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.dropRightWhile(users, ['active', false]);\\n * // => objects for ['barney']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.dropRightWhile(users, 'active');\\n * // => objects for ['barney', 'fred', 'pebbles']\\n */\\n function dropRightWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\\n : [];\\n }\\n\\n /**\\n * Creates a slice of `array` excluding elements dropped from the beginning.\\n * Elements are dropped until `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.dropWhile(users, function(o) { return !o.active; });\\n * // => objects for ['pebbles']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.dropWhile(users, ['active', false]);\\n * // => objects for ['pebbles']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.dropWhile(users, 'active');\\n * // => objects for ['barney', 'fred', 'pebbles']\\n */\\n function dropWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), true)\\n : [];\\n }\\n\\n /**\\n * Fills elements of `array` with `value` from `start` up to, but not\\n * including, `end`.\\n *\\n * **Note:** This method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.2.0\\n * @category Array\\n * @param {Array} array The array to fill.\\n * @param {*} value The value to fill `array` with.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _.fill(array, 'a');\\n * console.log(array);\\n * // => ['a', 'a', 'a']\\n *\\n * _.fill(Array(3), 2);\\n * // => [2, 2, 2]\\n *\\n * _.fill([4, 6, 8, 10], '*', 1, 3);\\n * // => [4, '*', '*', 10]\\n */\\n function fill(array, value, start, end) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\\n start = 0;\\n end = length;\\n }\\n return baseFill(array, value, start, end);\\n }\\n\\n /**\\n * This method is like `_.find` except that it returns the index of the first\\n * element `predicate` returns truthy for instead of the element itself.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {number} Returns the index of the found element, else `-1`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\\n * // => 0\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findIndex(users, { 'user': 'fred', 'active': false });\\n * // => 1\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findIndex(users, ['active', false]);\\n * // => 0\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findIndex(users, 'active');\\n * // => 2\\n */\\n function findIndex(array, predicate, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\\n if (index < 0) {\\n index = nativeMax(length + index, 0);\\n }\\n return baseFindIndex(array, getIteratee(predicate, 3), index);\\n }\\n\\n /**\\n * This method is like `_.findIndex` except that it iterates over elements\\n * of `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=array.length-1] The index to search from.\\n * @returns {number} Returns the index of the found element, else `-1`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\\n * // => 2\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\\n * // => 0\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findLastIndex(users, ['active', false]);\\n * // => 2\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findLastIndex(users, 'active');\\n * // => 0\\n */\\n function findLastIndex(array, predicate, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = length - 1;\\n if (fromIndex !== undefined) {\\n index = toInteger(fromIndex);\\n index = fromIndex < 0\\n ? nativeMax(length + index, 0)\\n : nativeMin(index, length - 1);\\n }\\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\\n }\\n\\n /**\\n * Flattens `array` a single level deep.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * _.flatten([1, [2, [3, [4]], 5]]);\\n * // => [1, 2, [3, [4]], 5]\\n */\\n function flatten(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseFlatten(array, 1) : [];\\n }\\n\\n /**\\n * Recursively flattens `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\\n * // => [1, 2, 3, 4, 5]\\n */\\n function flattenDeep(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseFlatten(array, INFINITY) : [];\\n }\\n\\n /**\\n * Recursively flatten `array` up to `depth` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.4.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @param {number} [depth=1] The maximum recursion depth.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * var array = [1, [2, [3, [4]], 5]];\\n *\\n * _.flattenDepth(array, 1);\\n * // => [1, 2, [3, [4]], 5]\\n *\\n * _.flattenDepth(array, 2);\\n * // => [1, 2, 3, [4], 5]\\n */\\n function flattenDepth(array, depth) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n depth = depth === undefined ? 1 : toInteger(depth);\\n return baseFlatten(array, depth);\\n }\\n\\n /**\\n * The inverse of `_.toPairs`; this method returns an object composed\\n * from key-value `pairs`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} pairs The key-value pairs.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.fromPairs([['a', 1], ['b', 2]]);\\n * // => { 'a': 1, 'b': 2 }\\n */\\n function fromPairs(pairs) {\\n var index = -1,\\n length = pairs == null ? 0 : pairs.length,\\n result = {};\\n\\n while (++index < length) {\\n var pair = pairs[index];\\n result[pair[0]] = pair[1];\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the first element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @alias first\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {*} Returns the first element of `array`.\\n * @example\\n *\\n * _.head([1, 2, 3]);\\n * // => 1\\n *\\n * _.head([]);\\n * // => undefined\\n */\\n function head(array) {\\n return (array && array.length) ? array[0] : undefined;\\n }\\n\\n /**\\n * Gets the index at which the first occurrence of `value` is found in `array`\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. If `fromIndex` is negative, it's used as the\\n * offset from the end of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.indexOf([1, 2, 1, 2], 2);\\n * // => 1\\n *\\n * // Search from the `fromIndex`.\\n * _.indexOf([1, 2, 1, 2], 2, 2);\\n * // => 3\\n */\\n function indexOf(array, value, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\\n if (index < 0) {\\n index = nativeMax(length + index, 0);\\n }\\n return baseIndexOf(array, value, index);\\n }\\n\\n /**\\n * Gets all but the last element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.initial([1, 2, 3]);\\n * // => [1, 2]\\n */\\n function initial(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseSlice(array, 0, -1) : [];\\n }\\n\\n /**\\n * Creates an array of unique values that are included in all given arrays\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. The order and references of result values are\\n * determined by the first array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * _.intersection([2, 1], [2, 3]);\\n * // => [2]\\n */\\n var intersection = baseRest(function(arrays) {\\n var mapped = arrayMap(arrays, castArrayLikeObject);\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped)\\n : [];\\n });\\n\\n /**\\n * This method is like `_.intersection` except that it accepts `iteratee`\\n * which is invoked for each element of each `arrays` to generate the criterion\\n * by which they're compared. The order and references of result values are\\n * determined by the first array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [2.1]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }]\\n */\\n var intersectionBy = baseRest(function(arrays) {\\n var iteratee = last(arrays),\\n mapped = arrayMap(arrays, castArrayLikeObject);\\n\\n if (iteratee === last(mapped)) {\\n iteratee = undefined;\\n } else {\\n mapped.pop();\\n }\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.intersection` except that it accepts `comparator`\\n * which is invoked to compare elements of `arrays`. The order and references\\n * of result values are determined by the first array. The comparator is\\n * invoked with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.intersectionWith(objects, others, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }]\\n */\\n var intersectionWith = baseRest(function(arrays) {\\n var comparator = last(arrays),\\n mapped = arrayMap(arrays, castArrayLikeObject);\\n\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n if (comparator) {\\n mapped.pop();\\n }\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped, undefined, comparator)\\n : [];\\n });\\n\\n /**\\n * Converts all elements in `array` into a string separated by `separator`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to convert.\\n * @param {string} [separator=','] The element separator.\\n * @returns {string} Returns the joined string.\\n * @example\\n *\\n * _.join(['a', 'b', 'c'], '~');\\n * // => 'a~b~c'\\n */\\n function join(array, separator) {\\n return array == null ? '' : nativeJoin.call(array, separator);\\n }\\n\\n /**\\n * Gets the last element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {*} Returns the last element of `array`.\\n * @example\\n *\\n * _.last([1, 2, 3]);\\n * // => 3\\n */\\n function last(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? array[length - 1] : undefined;\\n }\\n\\n /**\\n * This method is like `_.indexOf` except that it iterates over elements of\\n * `array` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=array.length-1] The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.lastIndexOf([1, 2, 1, 2], 2);\\n * // => 3\\n *\\n * // Search from the `fromIndex`.\\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\\n * // => 1\\n */\\n function lastIndexOf(array, value, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = length;\\n if (fromIndex !== undefined) {\\n index = toInteger(fromIndex);\\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\\n }\\n return value === value\\n ? strictLastIndexOf(array, value, index)\\n : baseFindIndex(array, baseIsNaN, index, true);\\n }\\n\\n /**\\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\\n * element from the end is returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.11.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=0] The index of the element to return.\\n * @returns {*} Returns the nth element of `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'd'];\\n *\\n * _.nth(array, 1);\\n * // => 'b'\\n *\\n * _.nth(array, -2);\\n * // => 'c';\\n */\\n function nth(array, n) {\\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\\n }\\n\\n /**\\n * Removes all given values from `array` using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\\n * to remove elements from an array by predicate.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {...*} [values] The values to remove.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\\n *\\n * _.pull(array, 'a', 'c');\\n * console.log(array);\\n * // => ['b', 'b']\\n */\\n var pull = baseRest(pullAll);\\n\\n /**\\n * This method is like `_.pull` except that it accepts an array of values to remove.\\n *\\n * **Note:** Unlike `_.difference`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\\n *\\n * _.pullAll(array, ['a', 'c']);\\n * console.log(array);\\n * // => ['b', 'b']\\n */\\n function pullAll(array, values) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values)\\n : array;\\n }\\n\\n /**\\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\\n * invoked for each element of `array` and `values` to generate the criterion\\n * by which they're compared. The iteratee is invoked with one argument: (value).\\n *\\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\\n *\\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\\n * console.log(array);\\n * // => [{ 'x': 2 }]\\n */\\n function pullAllBy(array, values, iteratee) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values, getIteratee(iteratee, 2))\\n : array;\\n }\\n\\n /**\\n * This method is like `_.pullAll` except that it accepts `comparator` which\\n * is invoked to compare elements of `array` to `values`. The comparator is\\n * invoked with two arguments: (arrVal, othVal).\\n *\\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\\n *\\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\\n * console.log(array);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\\n */\\n function pullAllWith(array, values, comparator) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values, undefined, comparator)\\n : array;\\n }\\n\\n /**\\n * Removes elements from `array` corresponding to `indexes` and returns an\\n * array of removed elements.\\n *\\n * **Note:** Unlike `_.at`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\\n * @returns {Array} Returns the new array of removed elements.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'd'];\\n * var pulled = _.pullAt(array, [1, 3]);\\n *\\n * console.log(array);\\n * // => ['a', 'c']\\n *\\n * console.log(pulled);\\n * // => ['b', 'd']\\n */\\n var pullAt = flatRest(function(array, indexes) {\\n var length = array == null ? 0 : array.length,\\n result = baseAt(array, indexes);\\n\\n basePullAt(array, arrayMap(indexes, function(index) {\\n return isIndex(index, length) ? +index : index;\\n }).sort(compareAscending));\\n\\n return result;\\n });\\n\\n /**\\n * Removes all elements from `array` that `predicate` returns truthy for\\n * and returns an array of the removed elements. The predicate is invoked\\n * with three arguments: (value, index, array).\\n *\\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\\n * to pull elements from an array by value.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new array of removed elements.\\n * @example\\n *\\n * var array = [1, 2, 3, 4];\\n * var evens = _.remove(array, function(n) {\\n * return n % 2 == 0;\\n * });\\n *\\n * console.log(array);\\n * // => [1, 3]\\n *\\n * console.log(evens);\\n * // => [2, 4]\\n */\\n function remove(array, predicate) {\\n var result = [];\\n if (!(array && array.length)) {\\n return result;\\n }\\n var index = -1,\\n indexes = [],\\n length = array.length;\\n\\n predicate = getIteratee(predicate, 3);\\n while (++index < length) {\\n var value = array[index];\\n if (predicate(value, index, array)) {\\n result.push(value);\\n indexes.push(index);\\n }\\n }\\n basePullAt(array, indexes);\\n return result;\\n }\\n\\n /**\\n * Reverses `array` so that the first element becomes the last, the second\\n * element becomes the second to last, and so on.\\n *\\n * **Note:** This method mutates `array` and is based on\\n * [`Array#reverse`](https://mdn.io/Array/reverse).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _.reverse(array);\\n * // => [3, 2, 1]\\n *\\n * console.log(array);\\n * // => [3, 2, 1]\\n */\\n function reverse(array) {\\n return array == null ? array : nativeReverse.call(array);\\n }\\n\\n /**\\n * Creates a slice of `array` from `start` up to, but not including, `end`.\\n *\\n * **Note:** This method is used instead of\\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\\n * returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to slice.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function slice(array, start, end) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\\n start = 0;\\n end = length;\\n }\\n else {\\n start = start == null ? 0 : toInteger(start);\\n end = end === undefined ? length : toInteger(end);\\n }\\n return baseSlice(array, start, end);\\n }\\n\\n /**\\n * Uses a binary search to determine the lowest index at which `value`\\n * should be inserted into `array` in order to maintain its sort order.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * _.sortedIndex([30, 50], 40);\\n * // => 1\\n */\\n function sortedIndex(array, value) {\\n return baseSortedIndex(array, value);\\n }\\n\\n /**\\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\\n * which is invoked for `value` and each element of `array` to compute their\\n * sort ranking. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\\n *\\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\\n * // => 0\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\\n * // => 0\\n */\\n function sortedIndexBy(array, value, iteratee) {\\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\\n }\\n\\n /**\\n * This method is like `_.indexOf` except that it performs a binary\\n * search on a sorted `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\\n * // => 1\\n */\\n function sortedIndexOf(array, value) {\\n var length = array == null ? 0 : array.length;\\n if (length) {\\n var index = baseSortedIndex(array, value);\\n if (index < length && eq(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * This method is like `_.sortedIndex` except that it returns the highest\\n * index at which `value` should be inserted into `array` in order to\\n * maintain its sort order.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\\n * // => 4\\n */\\n function sortedLastIndex(array, value) {\\n return baseSortedIndex(array, value, true);\\n }\\n\\n /**\\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\\n * which is invoked for `value` and each element of `array` to compute their\\n * sort ranking. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\\n *\\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\\n * // => 1\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\\n * // => 1\\n */\\n function sortedLastIndexBy(array, value, iteratee) {\\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\\n }\\n\\n /**\\n * This method is like `_.lastIndexOf` except that it performs a binary\\n * search on a sorted `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\\n * // => 3\\n */\\n function sortedLastIndexOf(array, value) {\\n var length = array == null ? 0 : array.length;\\n if (length) {\\n var index = baseSortedIndex(array, value, true) - 1;\\n if (eq(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it's designed and optimized\\n * for sorted arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.sortedUniq([1, 1, 2]);\\n * // => [1, 2]\\n */\\n function sortedUniq(array) {\\n return (array && array.length)\\n ? baseSortedUniq(array)\\n : [];\\n }\\n\\n /**\\n * This method is like `_.uniqBy` except that it's designed and optimized\\n * for sorted arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\\n * // => [1.1, 2.3]\\n */\\n function sortedUniqBy(array, iteratee) {\\n return (array && array.length)\\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\\n : [];\\n }\\n\\n /**\\n * Gets all but the first element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.tail([1, 2, 3]);\\n * // => [2, 3]\\n */\\n function tail(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseSlice(array, 1, length) : [];\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements taken from the beginning.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to take.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.take([1, 2, 3]);\\n * // => [1]\\n *\\n * _.take([1, 2, 3], 2);\\n * // => [1, 2]\\n *\\n * _.take([1, 2, 3], 5);\\n * // => [1, 2, 3]\\n *\\n * _.take([1, 2, 3], 0);\\n * // => []\\n */\\n function take(array, n, guard) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n return baseSlice(array, 0, n < 0 ? 0 : n);\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements taken from the end.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to take.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.takeRight([1, 2, 3]);\\n * // => [3]\\n *\\n * _.takeRight([1, 2, 3], 2);\\n * // => [2, 3]\\n *\\n * _.takeRight([1, 2, 3], 5);\\n * // => [1, 2, 3]\\n *\\n * _.takeRight([1, 2, 3], 0);\\n * // => []\\n */\\n function takeRight(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n n = length - n;\\n return baseSlice(array, n < 0 ? 0 : n, length);\\n }\\n\\n /**\\n * Creates a slice of `array` with elements taken from the end. Elements are\\n * taken until `predicate` returns falsey. The predicate is invoked with\\n * three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.takeRightWhile(users, function(o) { return !o.active; });\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\\n * // => objects for ['pebbles']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.takeRightWhile(users, ['active', false]);\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.takeRightWhile(users, 'active');\\n * // => []\\n */\\n function takeRightWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\\n : [];\\n }\\n\\n /**\\n * Creates a slice of `array` with elements taken from the beginning. Elements\\n * are taken until `predicate` returns falsey. The predicate is invoked with\\n * three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.takeWhile(users, function(o) { return !o.active; });\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.takeWhile(users, ['active', false]);\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.takeWhile(users, 'active');\\n * // => []\\n */\\n function takeWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3))\\n : [];\\n }\\n\\n /**\\n * Creates an array of unique values, in order, from all given arrays using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * _.union([2], [1, 2]);\\n * // => [2, 1]\\n */\\n var union = baseRest(function(arrays) {\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\\n });\\n\\n /**\\n * This method is like `_.union` except that it accepts `iteratee` which is\\n * invoked for each element of each `arrays` to generate the criterion by\\n * which uniqueness is computed. Result values are chosen from the first\\n * array in which the value occurs. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\\n * // => [2.1, 1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }, { 'x': 2 }]\\n */\\n var unionBy = baseRest(function(arrays) {\\n var iteratee = last(arrays);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\\n });\\n\\n /**\\n * This method is like `_.union` except that it accepts `comparator` which\\n * is invoked to compare elements of `arrays`. Result values are chosen from\\n * the first array in which the value occurs. The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.unionWith(objects, others, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\\n */\\n var unionWith = baseRest(function(arrays) {\\n var comparator = last(arrays);\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\\n });\\n\\n /**\\n * Creates a duplicate-free version of an array, using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons, in which only the first occurrence of each element\\n * is kept. The order of result values is determined by the order they occur\\n * in the array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.uniq([2, 1, 2]);\\n * // => [2, 1]\\n */\\n function uniq(array) {\\n return (array && array.length) ? baseUniq(array) : [];\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it accepts `iteratee` which is\\n * invoked for each element in `array` to generate the criterion by which\\n * uniqueness is computed. The order of result values is determined by the\\n * order they occur in the array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\\n * // => [2.1, 1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }, { 'x': 2 }]\\n */\\n function uniqBy(array, iteratee) {\\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it accepts `comparator` which\\n * is invoked to compare elements of `array`. The order of result values is\\n * determined by the order they occur in the array.The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.uniqWith(objects, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\\n */\\n function uniqWith(array, comparator) {\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\\n }\\n\\n /**\\n * This method is like `_.zip` except that it accepts an array of grouped\\n * elements and creates an array regrouping the elements to their pre-zip\\n * configuration.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.2.0\\n * @category Array\\n * @param {Array} array The array of grouped elements to process.\\n * @returns {Array} Returns the new array of regrouped elements.\\n * @example\\n *\\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\\n * // => [['a', 1, true], ['b', 2, false]]\\n *\\n * _.unzip(zipped);\\n * // => [['a', 'b'], [1, 2], [true, false]]\\n */\\n function unzip(array) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n var length = 0;\\n array = arrayFilter(array, function(group) {\\n if (isArrayLikeObject(group)) {\\n length = nativeMax(group.length, length);\\n return true;\\n }\\n });\\n return baseTimes(length, function(index) {\\n return arrayMap(array, baseProperty(index));\\n });\\n }\\n\\n /**\\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\\n * how regrouped values should be combined. The iteratee is invoked with the\\n * elements of each group: (...group).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Array\\n * @param {Array} array The array of grouped elements to process.\\n * @param {Function} [iteratee=_.identity] The function to combine\\n * regrouped values.\\n * @returns {Array} Returns the new array of regrouped elements.\\n * @example\\n *\\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\\n * // => [[1, 10, 100], [2, 20, 200]]\\n *\\n * _.unzipWith(zipped, _.add);\\n * // => [3, 30, 300]\\n */\\n function unzipWith(array, iteratee) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n var result = unzip(array);\\n if (iteratee == null) {\\n return result;\\n }\\n return arrayMap(result, function(group) {\\n return apply(iteratee, undefined, group);\\n });\\n }\\n\\n /**\\n * Creates an array excluding all given values using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * **Note:** Unlike `_.pull`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...*} [values] The values to exclude.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.difference, _.xor\\n * @example\\n *\\n * _.without([2, 1, 2, 3], 1, 2);\\n * // => [3]\\n */\\n var without = baseRest(function(array, values) {\\n return isArrayLikeObject(array)\\n ? baseDifference(array, values)\\n : [];\\n });\\n\\n /**\\n * Creates an array of unique values that is the\\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\\n * of the given arrays. The order of result values is determined by the order\\n * they occur in the arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.difference, _.without\\n * @example\\n *\\n * _.xor([2, 1], [2, 3]);\\n * // => [1, 3]\\n */\\n var xor = baseRest(function(arrays) {\\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\\n });\\n\\n /**\\n * This method is like `_.xor` except that it accepts `iteratee` which is\\n * invoked for each element of each `arrays` to generate the criterion by\\n * which by which they're compared. The order of result values is determined\\n * by the order they occur in the arrays. The iteratee is invoked with one\\n * argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [1.2, 3.4]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 2 }]\\n */\\n var xorBy = baseRest(function(arrays) {\\n var iteratee = last(arrays);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\\n });\\n\\n /**\\n * This method is like `_.xor` except that it accepts `comparator` which is\\n * invoked to compare elements of `arrays`. The order of result values is\\n * determined by the order they occur in the arrays. The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.xorWith(objects, others, _.isEqual);\\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\\n */\\n var xorWith = baseRest(function(arrays) {\\n var comparator = last(arrays);\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\\n });\\n\\n /**\\n * Creates an array of grouped elements, the first of which contains the\\n * first elements of the given arrays, the second of which contains the\\n * second elements of the given arrays, and so on.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to process.\\n * @returns {Array} Returns the new array of grouped elements.\\n * @example\\n *\\n * _.zip(['a', 'b'], [1, 2], [true, false]);\\n * // => [['a', 1, true], ['b', 2, false]]\\n */\\n var zip = baseRest(unzip);\\n\\n /**\\n * This method is like `_.fromPairs` except that it accepts two arrays,\\n * one of property identifiers and one of corresponding values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.4.0\\n * @category Array\\n * @param {Array} [props=[]] The property identifiers.\\n * @param {Array} [values=[]] The property values.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.zipObject(['a', 'b'], [1, 2]);\\n * // => { 'a': 1, 'b': 2 }\\n */\\n function zipObject(props, values) {\\n return baseZipObject(props || [], values || [], assignValue);\\n }\\n\\n /**\\n * This method is like `_.zipObject` except that it supports property paths.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.1.0\\n * @category Array\\n * @param {Array} [props=[]] The property identifiers.\\n * @param {Array} [values=[]] The property values.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\\n */\\n function zipObjectDeep(props, values) {\\n return baseZipObject(props || [], values || [], baseSet);\\n }\\n\\n /**\\n * This method is like `_.zip` except that it accepts `iteratee` to specify\\n * how grouped values should be combined. The iteratee is invoked with the\\n * elements of each group: (...group).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to process.\\n * @param {Function} [iteratee=_.identity] The function to combine\\n * grouped values.\\n * @returns {Array} Returns the new array of grouped elements.\\n * @example\\n *\\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\\n * return a + b + c;\\n * });\\n * // => [111, 222]\\n */\\n var zipWith = baseRest(function(arrays) {\\n var length = arrays.length,\\n iteratee = length > 1 ? arrays[length - 1] : undefined;\\n\\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\\n return unzipWith(arrays, iteratee);\\n });\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\\n * chain sequences enabled. The result of such sequences must be unwrapped\\n * with `_#value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.3.0\\n * @category Seq\\n * @param {*} value The value to wrap.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'pebbles', 'age': 1 }\\n * ];\\n *\\n * var youngest = _\\n * .chain(users)\\n * .sortBy('age')\\n * .map(function(o) {\\n * return o.user + ' is ' + o.age;\\n * })\\n * .head()\\n * .value();\\n * // => 'pebbles is 1'\\n */\\n function chain(value) {\\n var result = lodash(value);\\n result.__chain__ = true;\\n return result;\\n }\\n\\n /**\\n * This method invokes `interceptor` and returns `value`. The interceptor\\n * is invoked with one argument; (value). The purpose of this method is to\\n * \\\"tap into\\\" a method chain sequence in order to modify intermediate results.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @param {*} value The value to provide to `interceptor`.\\n * @param {Function} interceptor The function to invoke.\\n * @returns {*} Returns `value`.\\n * @example\\n *\\n * _([1, 2, 3])\\n * .tap(function(array) {\\n * // Mutate input array.\\n * array.pop();\\n * })\\n * .reverse()\\n * .value();\\n * // => [2, 1]\\n */\\n function tap(value, interceptor) {\\n interceptor(value);\\n return value;\\n }\\n\\n /**\\n * This method is like `_.tap` except that it returns the result of `interceptor`.\\n * The purpose of this method is to \\\"pass thru\\\" values replacing intermediate\\n * results in a method chain sequence.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Seq\\n * @param {*} value The value to provide to `interceptor`.\\n * @param {Function} interceptor The function to invoke.\\n * @returns {*} Returns the result of `interceptor`.\\n * @example\\n *\\n * _(' abc ')\\n * .chain()\\n * .trim()\\n * .thru(function(value) {\\n * return [value];\\n * })\\n * .value();\\n * // => ['abc']\\n */\\n function thru(value, interceptor) {\\n return interceptor(value);\\n }\\n\\n /**\\n * This method is the wrapper version of `_.at`.\\n *\\n * @name at\\n * @memberOf _\\n * @since 1.0.0\\n * @category Seq\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\\n *\\n * _(object).at(['a[0].b.c', 'a[1]']).value();\\n * // => [3, 4]\\n */\\n var wrapperAt = flatRest(function(paths) {\\n var length = paths.length,\\n start = length ? paths[0] : 0,\\n value = this.__wrapped__,\\n interceptor = function(object) { return baseAt(object, paths); };\\n\\n if (length > 1 || this.__actions__.length ||\\n !(value instanceof LazyWrapper) || !isIndex(start)) {\\n return this.thru(interceptor);\\n }\\n value = value.slice(start, +start + (length ? 1 : 0));\\n value.__actions__.push({\\n 'func': thru,\\n 'args': [interceptor],\\n 'thisArg': undefined\\n });\\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\\n if (length && !array.length) {\\n array.push(undefined);\\n }\\n return array;\\n });\\n });\\n\\n /**\\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\\n *\\n * @name chain\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 }\\n * ];\\n *\\n * // A sequence without explicit chaining.\\n * _(users).head();\\n * // => { 'user': 'barney', 'age': 36 }\\n *\\n * // A sequence with explicit chaining.\\n * _(users)\\n * .chain()\\n * .head()\\n * .pick('user')\\n * .value();\\n * // => { 'user': 'barney' }\\n */\\n function wrapperChain() {\\n return chain(this);\\n }\\n\\n /**\\n * Executes the chain sequence and returns the wrapped result.\\n *\\n * @name commit\\n * @memberOf _\\n * @since 3.2.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var array = [1, 2];\\n * var wrapped = _(array).push(3);\\n *\\n * console.log(array);\\n * // => [1, 2]\\n *\\n * wrapped = wrapped.commit();\\n * console.log(array);\\n * // => [1, 2, 3]\\n *\\n * wrapped.last();\\n * // => 3\\n *\\n * console.log(array);\\n * // => [1, 2, 3]\\n */\\n function wrapperCommit() {\\n return new LodashWrapper(this.value(), this.__chain__);\\n }\\n\\n /**\\n * Gets the next value on a wrapped object following the\\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\\n *\\n * @name next\\n * @memberOf _\\n * @since 4.0.0\\n * @category Seq\\n * @returns {Object} Returns the next iterator value.\\n * @example\\n *\\n * var wrapped = _([1, 2]);\\n *\\n * wrapped.next();\\n * // => { 'done': false, 'value': 1 }\\n *\\n * wrapped.next();\\n * // => { 'done': false, 'value': 2 }\\n *\\n * wrapped.next();\\n * // => { 'done': true, 'value': undefined }\\n */\\n function wrapperNext() {\\n if (this.__values__ === undefined) {\\n this.__values__ = toArray(this.value());\\n }\\n var done = this.__index__ >= this.__values__.length,\\n value = done ? undefined : this.__values__[this.__index__++];\\n\\n return { 'done': done, 'value': value };\\n }\\n\\n /**\\n * Enables the wrapper to be iterable.\\n *\\n * @name Symbol.iterator\\n * @memberOf _\\n * @since 4.0.0\\n * @category Seq\\n * @returns {Object} Returns the wrapper object.\\n * @example\\n *\\n * var wrapped = _([1, 2]);\\n *\\n * wrapped[Symbol.iterator]() === wrapped;\\n * // => true\\n *\\n * Array.from(wrapped);\\n * // => [1, 2]\\n */\\n function wrapperToIterator() {\\n return this;\\n }\\n\\n /**\\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\\n *\\n * @name plant\\n * @memberOf _\\n * @since 3.2.0\\n * @category Seq\\n * @param {*} value The value to plant.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var wrapped = _([1, 2]).map(square);\\n * var other = wrapped.plant([3, 4]);\\n *\\n * other.value();\\n * // => [9, 16]\\n *\\n * wrapped.value();\\n * // => [1, 4]\\n */\\n function wrapperPlant(value) {\\n var result,\\n parent = this;\\n\\n while (parent instanceof baseLodash) {\\n var clone = wrapperClone(parent);\\n clone.__index__ = 0;\\n clone.__values__ = undefined;\\n if (result) {\\n previous.__wrapped__ = clone;\\n } else {\\n result = clone;\\n }\\n var previous = clone;\\n parent = parent.__wrapped__;\\n }\\n previous.__wrapped__ = value;\\n return result;\\n }\\n\\n /**\\n * This method is the wrapper version of `_.reverse`.\\n *\\n * **Note:** This method mutates the wrapped array.\\n *\\n * @name reverse\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _(array).reverse().value()\\n * // => [3, 2, 1]\\n *\\n * console.log(array);\\n * // => [3, 2, 1]\\n */\\n function wrapperReverse() {\\n var value = this.__wrapped__;\\n if (value instanceof LazyWrapper) {\\n var wrapped = value;\\n if (this.__actions__.length) {\\n wrapped = new LazyWrapper(this);\\n }\\n wrapped = wrapped.reverse();\\n wrapped.__actions__.push({\\n 'func': thru,\\n 'args': [reverse],\\n 'thisArg': undefined\\n });\\n return new LodashWrapper(wrapped, this.__chain__);\\n }\\n return this.thru(reverse);\\n }\\n\\n /**\\n * Executes the chain sequence to resolve the unwrapped value.\\n *\\n * @name value\\n * @memberOf _\\n * @since 0.1.0\\n * @alias toJSON, valueOf\\n * @category Seq\\n * @returns {*} Returns the resolved unwrapped value.\\n * @example\\n *\\n * _([1, 2, 3]).value();\\n * // => [1, 2, 3]\\n */\\n function wrapperValue() {\\n return baseWrapperValue(this.__wrapped__, this.__actions__);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The corresponding value of\\n * each key is the number of times the key was returned by `iteratee`. The\\n * iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\\n * // => { '4': 1, '6': 2 }\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.countBy(['one', 'two', 'three'], 'length');\\n * // => { '3': 2, '5': 1 }\\n */\\n var countBy = createAggregator(function(result, value, key) {\\n if (hasOwnProperty.call(result, key)) {\\n ++result[key];\\n } else {\\n baseAssignValue(result, key, 1);\\n }\\n });\\n\\n /**\\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\\n * Iteration is stopped once `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index|key, collection).\\n *\\n * **Note:** This method returns `true` for\\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\\n * elements of empty collections.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`.\\n * @example\\n *\\n * _.every([true, 1, null, 'yes'], Boolean);\\n * // => false\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': false }\\n * ];\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.every(users, { 'user': 'barney', 'active': false });\\n * // => false\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.every(users, ['active', false]);\\n * // => true\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.every(users, 'active');\\n * // => false\\n */\\n function every(collection, predicate, guard) {\\n var func = isArray(collection) ? arrayEvery : baseEvery;\\n if (guard && isIterateeCall(collection, predicate, guard)) {\\n predicate = undefined;\\n }\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Iterates over elements of `collection`, returning an array of all elements\\n * `predicate` returns truthy for. The predicate is invoked with three\\n * arguments: (value, index|key, collection).\\n *\\n * **Note:** Unlike `_.remove`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n * @see _.reject\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': true },\\n * { 'user': 'fred', 'age': 40, 'active': false }\\n * ];\\n *\\n * _.filter(users, function(o) { return !o.active; });\\n * // => objects for ['fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.filter(users, { 'age': 36, 'active': true });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.filter(users, ['active', false]);\\n * // => objects for ['fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.filter(users, 'active');\\n * // => objects for ['barney']\\n */\\n function filter(collection, predicate) {\\n var func = isArray(collection) ? arrayFilter : baseFilter;\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Iterates over elements of `collection`, returning the first element\\n * `predicate` returns truthy for. The predicate is invoked with three\\n * arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {*} Returns the matched element, else `undefined`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': true },\\n * { 'user': 'fred', 'age': 40, 'active': false },\\n * { 'user': 'pebbles', 'age': 1, 'active': true }\\n * ];\\n *\\n * _.find(users, function(o) { return o.age < 40; });\\n * // => object for 'barney'\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.find(users, { 'age': 1, 'active': true });\\n * // => object for 'pebbles'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.find(users, ['active', false]);\\n * // => object for 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.find(users, 'active');\\n * // => object for 'barney'\\n */\\n var find = createFind(findIndex);\\n\\n /**\\n * This method is like `_.find` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=collection.length-1] The index to search from.\\n * @returns {*} Returns the matched element, else `undefined`.\\n * @example\\n *\\n * _.findLast([1, 2, 3, 4], function(n) {\\n * return n % 2 == 1;\\n * });\\n * // => 3\\n */\\n var findLast = createFind(findLastIndex);\\n\\n /**\\n * Creates a flattened array of values by running each element in `collection`\\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\\n * with three arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [n, n];\\n * }\\n *\\n * _.flatMap([1, 2], duplicate);\\n * // => [1, 1, 2, 2]\\n */\\n function flatMap(collection, iteratee) {\\n return baseFlatten(map(collection, iteratee), 1);\\n }\\n\\n /**\\n * This method is like `_.flatMap` except that it recursively flattens the\\n * mapped results.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.7.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [[[n, n]]];\\n * }\\n *\\n * _.flatMapDeep([1, 2], duplicate);\\n * // => [1, 1, 2, 2]\\n */\\n function flatMapDeep(collection, iteratee) {\\n return baseFlatten(map(collection, iteratee), INFINITY);\\n }\\n\\n /**\\n * This method is like `_.flatMap` except that it recursively flattens the\\n * mapped results up to `depth` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.7.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {number} [depth=1] The maximum recursion depth.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [[[n, n]]];\\n * }\\n *\\n * _.flatMapDepth([1, 2], duplicate, 2);\\n * // => [[1, 1], [2, 2]]\\n */\\n function flatMapDepth(collection, iteratee, depth) {\\n depth = depth === undefined ? 1 : toInteger(depth);\\n return baseFlatten(map(collection, iteratee), depth);\\n }\\n\\n /**\\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\\n * The iteratee is invoked with three arguments: (value, index|key, collection).\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * **Note:** As with other \\\"Collections\\\" methods, objects with a \\\"length\\\"\\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\\n * or `_.forOwn` for object iteration.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @alias each\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n * @see _.forEachRight\\n * @example\\n *\\n * _.forEach([1, 2], function(value) {\\n * console.log(value);\\n * });\\n * // => Logs `1` then `2`.\\n *\\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\\n */\\n function forEach(collection, iteratee) {\\n var func = isArray(collection) ? arrayEach : baseEach;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.forEach` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @alias eachRight\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n * @see _.forEach\\n * @example\\n *\\n * _.forEachRight([1, 2], function(value) {\\n * console.log(value);\\n * });\\n * // => Logs `2` then `1`.\\n */\\n function forEachRight(collection, iteratee) {\\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The order of grouped values\\n * is determined by the order they occur in `collection`. The corresponding\\n * value of each key is an array of elements responsible for generating the\\n * key. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\\n * // => { '4': [4.2], '6': [6.1, 6.3] }\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.groupBy(['one', 'two', 'three'], 'length');\\n * // => { '3': ['one', 'two'], '5': ['three'] }\\n */\\n var groupBy = createAggregator(function(result, value, key) {\\n if (hasOwnProperty.call(result, key)) {\\n result[key].push(value);\\n } else {\\n baseAssignValue(result, key, [value]);\\n }\\n });\\n\\n /**\\n * Checks if `value` is in `collection`. If `collection` is a string, it's\\n * checked for a substring of `value`, otherwise\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\\n * the offset from the end of `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object|string} collection The collection to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\\n * @example\\n *\\n * _.includes([1, 2, 3], 1);\\n * // => true\\n *\\n * _.includes([1, 2, 3], 1, 2);\\n * // => false\\n *\\n * _.includes({ 'a': 1, 'b': 2 }, 1);\\n * // => true\\n *\\n * _.includes('abcd', 'bc');\\n * // => true\\n */\\n function includes(collection, value, fromIndex, guard) {\\n collection = isArrayLike(collection) ? collection : values(collection);\\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\\n\\n var length = collection.length;\\n if (fromIndex < 0) {\\n fromIndex = nativeMax(length + fromIndex, 0);\\n }\\n return isString(collection)\\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\\n }\\n\\n /**\\n * Invokes the method at `path` of each element in `collection`, returning\\n * an array of the results of each invoked method. Any additional arguments\\n * are provided to each invoked method. If `path` is a function, it's invoked\\n * for, and `this` bound to, each element in `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Array|Function|string} path The path of the method to invoke or\\n * the function invoked per iteration.\\n * @param {...*} [args] The arguments to invoke each method with.\\n * @returns {Array} Returns the array of results.\\n * @example\\n *\\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\\n * // => [[1, 5, 7], [1, 2, 3]]\\n *\\n * _.invokeMap([123, 456], String.prototype.split, '');\\n * // => [['1', '2', '3'], ['4', '5', '6']]\\n */\\n var invokeMap = baseRest(function(collection, path, args) {\\n var index = -1,\\n isFunc = typeof path == 'function',\\n result = isArrayLike(collection) ? Array(collection.length) : [];\\n\\n baseEach(collection, function(value) {\\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\\n });\\n return result;\\n });\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The corresponding value of\\n * each key is the last element responsible for generating the key. The\\n * iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * var array = [\\n * { 'dir': 'left', 'code': 97 },\\n * { 'dir': 'right', 'code': 100 }\\n * ];\\n *\\n * _.keyBy(array, function(o) {\\n * return String.fromCharCode(o.code);\\n * });\\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\\n *\\n * _.keyBy(array, 'dir');\\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\\n */\\n var keyBy = createAggregator(function(result, value, key) {\\n baseAssignValue(result, key, value);\\n });\\n\\n /**\\n * Creates an array of values by running each element in `collection` thru\\n * `iteratee`. The iteratee is invoked with three arguments:\\n * (value, index|key, collection).\\n *\\n * Many lodash methods are guarded to work as iteratees for methods like\\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\\n *\\n * The guarded methods are:\\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * _.map([4, 8], square);\\n * // => [16, 64]\\n *\\n * _.map({ 'a': 4, 'b': 8 }, square);\\n * // => [16, 64] (iteration order is not guaranteed)\\n *\\n * var users = [\\n * { 'user': 'barney' },\\n * { 'user': 'fred' }\\n * ];\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.map(users, 'user');\\n * // => ['barney', 'fred']\\n */\\n function map(collection, iteratee) {\\n var func = isArray(collection) ? arrayMap : baseMap;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.sortBy` except that it allows specifying the sort\\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\\n * are sorted in ascending order. Otherwise, specify an order of \\\"desc\\\" for\\n * descending or \\\"asc\\\" for ascending sort order of corresponding values.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\\n * The iteratees to sort by.\\n * @param {string[]} [orders] The sort orders of `iteratees`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\\n * @returns {Array} Returns the new sorted array.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'fred', 'age': 48 },\\n * { 'user': 'barney', 'age': 34 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'barney', 'age': 36 }\\n * ];\\n *\\n * // Sort by `user` in ascending order and by `age` in descending order.\\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\\n */\\n function orderBy(collection, iteratees, orders, guard) {\\n if (collection == null) {\\n return [];\\n }\\n if (!isArray(iteratees)) {\\n iteratees = iteratees == null ? [] : [iteratees];\\n }\\n orders = guard ? undefined : orders;\\n if (!isArray(orders)) {\\n orders = orders == null ? [] : [orders];\\n }\\n return baseOrderBy(collection, iteratees, orders);\\n }\\n\\n /**\\n * Creates an array of elements split into two groups, the first of which\\n * contains elements `predicate` returns truthy for, the second of which\\n * contains elements `predicate` returns falsey for. The predicate is\\n * invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the array of grouped elements.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': true },\\n * { 'user': 'pebbles', 'age': 1, 'active': false }\\n * ];\\n *\\n * _.partition(users, function(o) { return o.active; });\\n * // => objects for [['fred'], ['barney', 'pebbles']]\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.partition(users, { 'age': 1, 'active': false });\\n * // => objects for [['pebbles'], ['barney', 'fred']]\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.partition(users, ['active', false]);\\n * // => objects for [['barney', 'pebbles'], ['fred']]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.partition(users, 'active');\\n * // => objects for [['fred'], ['barney', 'pebbles']]\\n */\\n var partition = createAggregator(function(result, value, key) {\\n result[key ? 0 : 1].push(value);\\n }, function() { return [[], []]; });\\n\\n /**\\n * Reduces `collection` to a value which is the accumulated result of running\\n * each element in `collection` thru `iteratee`, where each successive\\n * invocation is supplied the return value of the previous. If `accumulator`\\n * is not given, the first element of `collection` is used as the initial\\n * value. The iteratee is invoked with four arguments:\\n * (accumulator, value, index|key, collection).\\n *\\n * Many lodash methods are guarded to work as iteratees for methods like\\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\\n *\\n * The guarded methods are:\\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\\n * and `sortBy`\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @returns {*} Returns the accumulated value.\\n * @see _.reduceRight\\n * @example\\n *\\n * _.reduce([1, 2], function(sum, n) {\\n * return sum + n;\\n * }, 0);\\n * // => 3\\n *\\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\\n * (result[value] || (result[value] = [])).push(key);\\n * return result;\\n * }, {});\\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\\n */\\n function reduce(collection, iteratee, accumulator) {\\n var func = isArray(collection) ? arrayReduce : baseReduce,\\n initAccum = arguments.length < 3;\\n\\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\\n }\\n\\n /**\\n * This method is like `_.reduce` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @returns {*} Returns the accumulated value.\\n * @see _.reduce\\n * @example\\n *\\n * var array = [[0, 1], [2, 3], [4, 5]];\\n *\\n * _.reduceRight(array, function(flattened, other) {\\n * return flattened.concat(other);\\n * }, []);\\n * // => [4, 5, 2, 3, 0, 1]\\n */\\n function reduceRight(collection, iteratee, accumulator) {\\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\\n initAccum = arguments.length < 3;\\n\\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\\n }\\n\\n /**\\n * The opposite of `_.filter`; this method returns the elements of `collection`\\n * that `predicate` does **not** return truthy for.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n * @see _.filter\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': true }\\n * ];\\n *\\n * _.reject(users, function(o) { return !o.active; });\\n * // => objects for ['fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.reject(users, { 'age': 40, 'active': true });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.reject(users, ['active', false]);\\n * // => objects for ['fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.reject(users, 'active');\\n * // => objects for ['barney']\\n */\\n function reject(collection, predicate) {\\n var func = isArray(collection) ? arrayFilter : baseFilter;\\n return func(collection, negate(getIteratee(predicate, 3)));\\n }\\n\\n /**\\n * Gets a random element from `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to sample.\\n * @returns {*} Returns the random element.\\n * @example\\n *\\n * _.sample([1, 2, 3, 4]);\\n * // => 2\\n */\\n function sample(collection) {\\n var func = isArray(collection) ? arraySample : baseSample;\\n return func(collection);\\n }\\n\\n /**\\n * Gets `n` random elements at unique keys from `collection` up to the\\n * size of `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to sample.\\n * @param {number} [n=1] The number of elements to sample.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the random elements.\\n * @example\\n *\\n * _.sampleSize([1, 2, 3], 2);\\n * // => [3, 1]\\n *\\n * _.sampleSize([1, 2, 3], 4);\\n * // => [2, 3, 1]\\n */\\n function sampleSize(collection, n, guard) {\\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\\n n = 1;\\n } else {\\n n = toInteger(n);\\n }\\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\\n return func(collection, n);\\n }\\n\\n /**\\n * Creates an array of shuffled values, using a version of the\\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n * @example\\n *\\n * _.shuffle([1, 2, 3, 4]);\\n * // => [4, 1, 3, 2]\\n */\\n function shuffle(collection) {\\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\\n return func(collection);\\n }\\n\\n /**\\n * Gets the size of `collection` by returning its length for array-like\\n * values or the number of own enumerable string keyed properties for objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object|string} collection The collection to inspect.\\n * @returns {number} Returns the collection size.\\n * @example\\n *\\n * _.size([1, 2, 3]);\\n * // => 3\\n *\\n * _.size({ 'a': 1, 'b': 2 });\\n * // => 2\\n *\\n * _.size('pebbles');\\n * // => 7\\n */\\n function size(collection) {\\n if (collection == null) {\\n return 0;\\n }\\n if (isArrayLike(collection)) {\\n return isString(collection) ? stringSize(collection) : collection.length;\\n }\\n var tag = getTag(collection);\\n if (tag == mapTag || tag == setTag) {\\n return collection.size;\\n }\\n return baseKeys(collection).length;\\n }\\n\\n /**\\n * Checks if `predicate` returns truthy for **any** element of `collection`.\\n * Iteration is stopped once `predicate` returns truthy. The predicate is\\n * invoked with three arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n * @example\\n *\\n * _.some([null, 0, 'yes', false], Boolean);\\n * // => true\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false }\\n * ];\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.some(users, { 'user': 'barney', 'active': false });\\n * // => false\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.some(users, ['active', false]);\\n * // => true\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.some(users, 'active');\\n * // => true\\n */\\n function some(collection, predicate, guard) {\\n var func = isArray(collection) ? arraySome : baseSome;\\n if (guard && isIterateeCall(collection, predicate, guard)) {\\n predicate = undefined;\\n }\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Creates an array of elements, sorted in ascending order by the results of\\n * running each element in a collection thru each iteratee. This method\\n * performs a stable sort, that is, it preserves the original sort order of\\n * equal elements. The iteratees are invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\\n * The iteratees to sort by.\\n * @returns {Array} Returns the new sorted array.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'fred', 'age': 48 },\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'barney', 'age': 34 }\\n * ];\\n *\\n * _.sortBy(users, [function(o) { return o.user; }]);\\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\\n *\\n * _.sortBy(users, ['user', 'age']);\\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\\n */\\n var sortBy = baseRest(function(collection, iteratees) {\\n if (collection == null) {\\n return [];\\n }\\n var length = iteratees.length;\\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\\n iteratees = [];\\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\\n iteratees = [iteratees[0]];\\n }\\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\\n });\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Gets the timestamp of the number of milliseconds that have elapsed since\\n * the Unix epoch (1 January 1970 00:00:00 UTC).\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Date\\n * @returns {number} Returns the timestamp.\\n * @example\\n *\\n * _.defer(function(stamp) {\\n * console.log(_.now() - stamp);\\n * }, _.now());\\n * // => Logs the number of milliseconds it took for the deferred invocation.\\n */\\n var now = ctxNow || function() {\\n return root.Date.now();\\n };\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * The opposite of `_.before`; this method creates a function that invokes\\n * `func` once it's called `n` or more times.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {number} n The number of calls before `func` is invoked.\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * var saves = ['profile', 'settings'];\\n *\\n * var done = _.after(saves.length, function() {\\n * console.log('done saving!');\\n * });\\n *\\n * _.forEach(saves, function(type) {\\n * asyncSave({ 'type': type, 'complete': done });\\n * });\\n * // => Logs 'done saving!' after the two async saves have completed.\\n */\\n function after(n, func) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n n = toInteger(n);\\n return function() {\\n if (--n < 1) {\\n return func.apply(this, arguments);\\n }\\n };\\n }\\n\\n /**\\n * Creates a function that invokes `func`, with up to `n` arguments,\\n * ignoring any additional arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to cap arguments for.\\n * @param {number} [n=func.length] The arity cap.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new capped function.\\n * @example\\n *\\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\\n * // => [6, 8, 10]\\n */\\n function ary(func, n, guard) {\\n n = guard ? undefined : n;\\n n = (func && n == null) ? func.length : n;\\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\\n }\\n\\n /**\\n * Creates a function that invokes `func`, with the `this` binding and arguments\\n * of the created function, while it's called less than `n` times. Subsequent\\n * calls to the created function return the result of the last `func` invocation.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {number} n The number of calls at which `func` is no longer invoked.\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * jQuery(element).on('click', _.before(5, addContactToList));\\n * // => Allows adding up to 4 contacts to the list.\\n */\\n function before(n, func) {\\n var result;\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n n = toInteger(n);\\n return function() {\\n if (--n > 0) {\\n result = func.apply(this, arguments);\\n }\\n if (n <= 1) {\\n func = undefined;\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\\n * and `partials` prepended to the arguments it receives.\\n *\\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\\n * may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \\\"length\\\"\\n * property of bound functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to bind.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new bound function.\\n * @example\\n *\\n * function greet(greeting, punctuation) {\\n * return greeting + ' ' + this.user + punctuation;\\n * }\\n *\\n * var object = { 'user': 'fred' };\\n *\\n * var bound = _.bind(greet, object, 'hi');\\n * bound('!');\\n * // => 'hi fred!'\\n *\\n * // Bound with placeholders.\\n * var bound = _.bind(greet, object, _, '!');\\n * bound('hi');\\n * // => 'hi fred!'\\n */\\n var bind = baseRest(function(func, thisArg, partials) {\\n var bitmask = WRAP_BIND_FLAG;\\n if (partials.length) {\\n var holders = replaceHolders(partials, getHolder(bind));\\n bitmask |= WRAP_PARTIAL_FLAG;\\n }\\n return createWrap(func, bitmask, thisArg, partials, holders);\\n });\\n\\n /**\\n * Creates a function that invokes the method at `object[key]` with `partials`\\n * prepended to the arguments it receives.\\n *\\n * This method differs from `_.bind` by allowing bound functions to reference\\n * methods that may be redefined or don't yet exist. See\\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\\n * for more details.\\n *\\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.10.0\\n * @category Function\\n * @param {Object} object The object to invoke the method on.\\n * @param {string} key The key of the method.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new bound function.\\n * @example\\n *\\n * var object = {\\n * 'user': 'fred',\\n * 'greet': function(greeting, punctuation) {\\n * return greeting + ' ' + this.user + punctuation;\\n * }\\n * };\\n *\\n * var bound = _.bindKey(object, 'greet', 'hi');\\n * bound('!');\\n * // => 'hi fred!'\\n *\\n * object.greet = function(greeting, punctuation) {\\n * return greeting + 'ya ' + this.user + punctuation;\\n * };\\n *\\n * bound('!');\\n * // => 'hiya fred!'\\n *\\n * // Bound with placeholders.\\n * var bound = _.bindKey(object, 'greet', _, '!');\\n * bound('hi');\\n * // => 'hiya fred!'\\n */\\n var bindKey = baseRest(function(object, key, partials) {\\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\\n if (partials.length) {\\n var holders = replaceHolders(partials, getHolder(bindKey));\\n bitmask |= WRAP_PARTIAL_FLAG;\\n }\\n return createWrap(key, bitmask, object, partials, holders);\\n });\\n\\n /**\\n * Creates a function that accepts arguments of `func` and either invokes\\n * `func` returning its result, if at least `arity` number of arguments have\\n * been provided, or returns a function that accepts the remaining `func`\\n * arguments, and so on. The arity of `func` may be specified if `func.length`\\n * is not sufficient.\\n *\\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\\n * may be used as a placeholder for provided arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of curried functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Function\\n * @param {Function} func The function to curry.\\n * @param {number} [arity=func.length] The arity of `func`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new curried function.\\n * @example\\n *\\n * var abc = function(a, b, c) {\\n * return [a, b, c];\\n * };\\n *\\n * var curried = _.curry(abc);\\n *\\n * curried(1)(2)(3);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2)(3);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2, 3);\\n * // => [1, 2, 3]\\n *\\n * // Curried with placeholders.\\n * curried(1)(_, 3)(2);\\n * // => [1, 2, 3]\\n */\\n function curry(func, arity, guard) {\\n arity = guard ? undefined : arity;\\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\\n result.placeholder = curry.placeholder;\\n return result;\\n }\\n\\n /**\\n * This method is like `_.curry` except that arguments are applied to `func`\\n * in the manner of `_.partialRight` instead of `_.partial`.\\n *\\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for provided arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of curried functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to curry.\\n * @param {number} [arity=func.length] The arity of `func`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new curried function.\\n * @example\\n *\\n * var abc = function(a, b, c) {\\n * return [a, b, c];\\n * };\\n *\\n * var curried = _.curryRight(abc);\\n *\\n * curried(3)(2)(1);\\n * // => [1, 2, 3]\\n *\\n * curried(2, 3)(1);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2, 3);\\n * // => [1, 2, 3]\\n *\\n * // Curried with placeholders.\\n * curried(3)(1, _)(2);\\n * // => [1, 2, 3]\\n */\\n function curryRight(func, arity, guard) {\\n arity = guard ? undefined : arity;\\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\\n result.placeholder = curryRight.placeholder;\\n return result;\\n }\\n\\n /**\\n * Creates a debounced function that delays invoking `func` until after `wait`\\n * milliseconds have elapsed since the last time the debounced function was\\n * invoked. The debounced function comes with a `cancel` method to cancel\\n * delayed `func` invocations and a `flush` method to immediately invoke them.\\n * Provide `options` to indicate whether `func` should be invoked on the\\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\\n * with the last arguments provided to the debounced function. Subsequent\\n * calls to the debounced function return the result of the last `func`\\n * invocation.\\n *\\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\\n * invoked on the trailing edge of the timeout only if the debounced function\\n * is invoked more than once during the `wait` timeout.\\n *\\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\\n *\\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\\n * for details over the differences between `_.debounce` and `_.throttle`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to debounce.\\n * @param {number} [wait=0] The number of milliseconds to delay.\\n * @param {Object} [options={}] The options object.\\n * @param {boolean} [options.leading=false]\\n * Specify invoking on the leading edge of the timeout.\\n * @param {number} [options.maxWait]\\n * The maximum time `func` is allowed to be delayed before it's invoked.\\n * @param {boolean} [options.trailing=true]\\n * Specify invoking on the trailing edge of the timeout.\\n * @returns {Function} Returns the new debounced function.\\n * @example\\n *\\n * // Avoid costly calculations while the window size is in flux.\\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\\n *\\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\\n * 'leading': true,\\n * 'trailing': false\\n * }));\\n *\\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\\n * var source = new EventSource('/stream');\\n * jQuery(source).on('message', debounced);\\n *\\n * // Cancel the trailing debounced invocation.\\n * jQuery(window).on('popstate', debounced.cancel);\\n */\\n function debounce(func, wait, options) {\\n var lastArgs,\\n lastThis,\\n maxWait,\\n result,\\n timerId,\\n lastCallTime,\\n lastInvokeTime = 0,\\n leading = false,\\n maxing = false,\\n trailing = true;\\n\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n wait = toNumber(wait) || 0;\\n if (isObject(options)) {\\n leading = !!options.leading;\\n maxing = 'maxWait' in options;\\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\\n trailing = 'trailing' in options ? !!options.trailing : trailing;\\n }\\n\\n function invokeFunc(time) {\\n var args = lastArgs,\\n thisArg = lastThis;\\n\\n lastArgs = lastThis = undefined;\\n lastInvokeTime = time;\\n result = func.apply(thisArg, args);\\n return result;\\n }\\n\\n function leadingEdge(time) {\\n // Reset any `maxWait` timer.\\n lastInvokeTime = time;\\n // Start the timer for the trailing edge.\\n timerId = setTimeout(timerExpired, wait);\\n // Invoke the leading edge.\\n return leading ? invokeFunc(time) : result;\\n }\\n\\n function remainingWait(time) {\\n var timeSinceLastCall = time - lastCallTime,\\n timeSinceLastInvoke = time - lastInvokeTime,\\n result = wait - timeSinceLastCall;\\n\\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\\n }\\n\\n function shouldInvoke(time) {\\n var timeSinceLastCall = time - lastCallTime,\\n timeSinceLastInvoke = time - lastInvokeTime;\\n\\n // Either this is the first call, activity has stopped and we're at the\\n // trailing edge, the system time has gone backwards and we're treating\\n // it as the trailing edge, or we've hit the `maxWait` limit.\\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\\n }\\n\\n function timerExpired() {\\n var time = now();\\n if (shouldInvoke(time)) {\\n return trailingEdge(time);\\n }\\n // Restart the timer.\\n timerId = setTimeout(timerExpired, remainingWait(time));\\n }\\n\\n function trailingEdge(time) {\\n timerId = undefined;\\n\\n // Only invoke if we have `lastArgs` which means `func` has been\\n // debounced at least once.\\n if (trailing && lastArgs) {\\n return invokeFunc(time);\\n }\\n lastArgs = lastThis = undefined;\\n return result;\\n }\\n\\n function cancel() {\\n if (timerId !== undefined) {\\n clearTimeout(timerId);\\n }\\n lastInvokeTime = 0;\\n lastArgs = lastCallTime = lastThis = timerId = undefined;\\n }\\n\\n function flush() {\\n return timerId === undefined ? result : trailingEdge(now());\\n }\\n\\n function debounced() {\\n var time = now(),\\n isInvoking = shouldInvoke(time);\\n\\n lastArgs = arguments;\\n lastThis = this;\\n lastCallTime = time;\\n\\n if (isInvoking) {\\n if (timerId === undefined) {\\n return leadingEdge(lastCallTime);\\n }\\n if (maxing) {\\n // Handle invocations in a tight loop.\\n timerId = setTimeout(timerExpired, wait);\\n return invokeFunc(lastCallTime);\\n }\\n }\\n if (timerId === undefined) {\\n timerId = setTimeout(timerExpired, wait);\\n }\\n return result;\\n }\\n debounced.cancel = cancel;\\n debounced.flush = flush;\\n return debounced;\\n }\\n\\n /**\\n * Defers invoking the `func` until the current call stack has cleared. Any\\n * additional arguments are provided to `func` when it's invoked.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to defer.\\n * @param {...*} [args] The arguments to invoke `func` with.\\n * @returns {number} Returns the timer id.\\n * @example\\n *\\n * _.defer(function(text) {\\n * console.log(text);\\n * }, 'deferred');\\n * // => Logs 'deferred' after one millisecond.\\n */\\n var defer = baseRest(function(func, args) {\\n return baseDelay(func, 1, args);\\n });\\n\\n /**\\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\\n * provided to `func` when it's invoked.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @param {...*} [args] The arguments to invoke `func` with.\\n * @returns {number} Returns the timer id.\\n * @example\\n *\\n * _.delay(function(text) {\\n * console.log(text);\\n * }, 1000, 'later');\\n * // => Logs 'later' after one second.\\n */\\n var delay = baseRest(function(func, wait, args) {\\n return baseDelay(func, toNumber(wait) || 0, args);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with arguments reversed.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to flip arguments for.\\n * @returns {Function} Returns the new flipped function.\\n * @example\\n *\\n * var flipped = _.flip(function() {\\n * return _.toArray(arguments);\\n * });\\n *\\n * flipped('a', 'b', 'c', 'd');\\n * // => ['d', 'c', 'b', 'a']\\n */\\n function flip(func) {\\n return createWrap(func, WRAP_FLIP_FLAG);\\n }\\n\\n /**\\n * Creates a function that memoizes the result of `func`. If `resolver` is\\n * provided, it determines the cache key for storing the result based on the\\n * arguments provided to the memoized function. By default, the first argument\\n * provided to the memoized function is used as the map cache key. The `func`\\n * is invoked with the `this` binding of the memoized function.\\n *\\n * **Note:** The cache is exposed as the `cache` property on the memoized\\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\\n * constructor with one whose instances implement the\\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to have its output memoized.\\n * @param {Function} [resolver] The function to resolve the cache key.\\n * @returns {Function} Returns the new memoized function.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n * var other = { 'c': 3, 'd': 4 };\\n *\\n * var values = _.memoize(_.values);\\n * values(object);\\n * // => [1, 2]\\n *\\n * values(other);\\n * // => [3, 4]\\n *\\n * object.a = 2;\\n * values(object);\\n * // => [1, 2]\\n *\\n * // Modify the result cache.\\n * values.cache.set(object, ['a', 'b']);\\n * values(object);\\n * // => ['a', 'b']\\n *\\n * // Replace `_.memoize.Cache`.\\n * _.memoize.Cache = WeakMap;\\n */\\n function memoize(func, resolver) {\\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n var memoized = function() {\\n var args = arguments,\\n key = resolver ? resolver.apply(this, args) : args[0],\\n cache = memoized.cache;\\n\\n if (cache.has(key)) {\\n return cache.get(key);\\n }\\n var result = func.apply(this, args);\\n memoized.cache = cache.set(key, result) || cache;\\n return result;\\n };\\n memoized.cache = new (memoize.Cache || MapCache);\\n return memoized;\\n }\\n\\n // Expose `MapCache`.\\n memoize.Cache = MapCache;\\n\\n /**\\n * Creates a function that negates the result of the predicate `func`. The\\n * `func` predicate is invoked with the `this` binding and arguments of the\\n * created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} predicate The predicate to negate.\\n * @returns {Function} Returns the new negated function.\\n * @example\\n *\\n * function isEven(n) {\\n * return n % 2 == 0;\\n * }\\n *\\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\\n * // => [1, 3, 5]\\n */\\n function negate(predicate) {\\n if (typeof predicate != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n return function() {\\n var args = arguments;\\n switch (args.length) {\\n case 0: return !predicate.call(this);\\n case 1: return !predicate.call(this, args[0]);\\n case 2: return !predicate.call(this, args[0], args[1]);\\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\\n }\\n return !predicate.apply(this, args);\\n };\\n }\\n\\n /**\\n * Creates a function that is restricted to invoking `func` once. Repeat calls\\n * to the function return the value of the first invocation. The `func` is\\n * invoked with the `this` binding and arguments of the created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * var initialize = _.once(createApplication);\\n * initialize();\\n * initialize();\\n * // => `createApplication` is invoked once\\n */\\n function once(func) {\\n return before(2, func);\\n }\\n\\n /**\\n * Creates a function that invokes `func` with its arguments transformed.\\n *\\n * @static\\n * @since 4.0.0\\n * @memberOf _\\n * @category Function\\n * @param {Function} func The function to wrap.\\n * @param {...(Function|Function[])} [transforms=[_.identity]]\\n * The argument transforms.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * function doubled(n) {\\n * return n * 2;\\n * }\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var func = _.overArgs(function(x, y) {\\n * return [x, y];\\n * }, [square, doubled]);\\n *\\n * func(9, 3);\\n * // => [81, 6]\\n *\\n * func(10, 5);\\n * // => [100, 10]\\n */\\n var overArgs = castRest(function(func, transforms) {\\n transforms = (transforms.length == 1 && isArray(transforms[0]))\\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\\n\\n var funcsLength = transforms.length;\\n return baseRest(function(args) {\\n var index = -1,\\n length = nativeMin(args.length, funcsLength);\\n\\n while (++index < length) {\\n args[index] = transforms[index].call(this, args[index]);\\n }\\n return apply(func, this, args);\\n });\\n });\\n\\n /**\\n * Creates a function that invokes `func` with `partials` prepended to the\\n * arguments it receives. This method is like `_.bind` except it does **not**\\n * alter the `this` binding.\\n *\\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of partially\\n * applied functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.2.0\\n * @category Function\\n * @param {Function} func The function to partially apply arguments to.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new partially applied function.\\n * @example\\n *\\n * function greet(greeting, name) {\\n * return greeting + ' ' + name;\\n * }\\n *\\n * var sayHelloTo = _.partial(greet, 'hello');\\n * sayHelloTo('fred');\\n * // => 'hello fred'\\n *\\n * // Partially applied with placeholders.\\n * var greetFred = _.partial(greet, _, 'fred');\\n * greetFred('hi');\\n * // => 'hi fred'\\n */\\n var partial = baseRest(function(func, partials) {\\n var holders = replaceHolders(partials, getHolder(partial));\\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\\n });\\n\\n /**\\n * This method is like `_.partial` except that partially applied arguments\\n * are appended to the arguments it receives.\\n *\\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of partially\\n * applied functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Function\\n * @param {Function} func The function to partially apply arguments to.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new partially applied function.\\n * @example\\n *\\n * function greet(greeting, name) {\\n * return greeting + ' ' + name;\\n * }\\n *\\n * var greetFred = _.partialRight(greet, 'fred');\\n * greetFred('hi');\\n * // => 'hi fred'\\n *\\n * // Partially applied with placeholders.\\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\\n * sayHelloTo('fred');\\n * // => 'hello fred'\\n */\\n var partialRight = baseRest(function(func, partials) {\\n var holders = replaceHolders(partials, getHolder(partialRight));\\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with arguments arranged according\\n * to the specified `indexes` where the argument value at the first index is\\n * provided as the first argument, the argument value at the second index is\\n * provided as the second argument, and so on.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to rearrange arguments for.\\n * @param {...(number|number[])} indexes The arranged argument indexes.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var rearged = _.rearg(function(a, b, c) {\\n * return [a, b, c];\\n * }, [2, 0, 1]);\\n *\\n * rearged('b', 'c', 'a')\\n * // => ['a', 'b', 'c']\\n */\\n var rearg = flatRest(function(func, indexes) {\\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of the\\n * created function and arguments from `start` and beyond provided as\\n * an array.\\n *\\n * **Note:** This method is based on the\\n * [rest parameter](https://mdn.io/rest_parameters).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var say = _.rest(function(what, names) {\\n * return what + ' ' + _.initial(names).join(', ') +\\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\\n * });\\n *\\n * say('hello', 'fred', 'barney', 'pebbles');\\n * // => 'hello fred, barney, & pebbles'\\n */\\n function rest(func, start) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n start = start === undefined ? start : toInteger(start);\\n return baseRest(func, start);\\n }\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of the\\n * create function and an array of arguments much like\\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\\n *\\n * **Note:** This method is based on the\\n * [spread operator](https://mdn.io/spread_operator).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.2.0\\n * @category Function\\n * @param {Function} func The function to spread arguments over.\\n * @param {number} [start=0] The start position of the spread.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var say = _.spread(function(who, what) {\\n * return who + ' says ' + what;\\n * });\\n *\\n * say(['fred', 'hello']);\\n * // => 'fred says hello'\\n *\\n * var numbers = Promise.all([\\n * Promise.resolve(40),\\n * Promise.resolve(36)\\n * ]);\\n *\\n * numbers.then(_.spread(function(x, y) {\\n * return x + y;\\n * }));\\n * // => a Promise of 76\\n */\\n function spread(func, start) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\\n return baseRest(function(args) {\\n var array = args[start],\\n otherArgs = castSlice(args, 0, start);\\n\\n if (array) {\\n arrayPush(otherArgs, array);\\n }\\n return apply(func, this, otherArgs);\\n });\\n }\\n\\n /**\\n * Creates a throttled function that only invokes `func` at most once per\\n * every `wait` milliseconds. The throttled function comes with a `cancel`\\n * method to cancel delayed `func` invocations and a `flush` method to\\n * immediately invoke them. Provide `options` to indicate whether `func`\\n * should be invoked on the leading and/or trailing edge of the `wait`\\n * timeout. The `func` is invoked with the last arguments provided to the\\n * throttled function. Subsequent calls to the throttled function return the\\n * result of the last `func` invocation.\\n *\\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\\n * invoked on the trailing edge of the timeout only if the throttled function\\n * is invoked more than once during the `wait` timeout.\\n *\\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\\n *\\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\\n * for details over the differences between `_.throttle` and `_.debounce`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to throttle.\\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\\n * @param {Object} [options={}] The options object.\\n * @param {boolean} [options.leading=true]\\n * Specify invoking on the leading edge of the timeout.\\n * @param {boolean} [options.trailing=true]\\n * Specify invoking on the trailing edge of the timeout.\\n * @returns {Function} Returns the new throttled function.\\n * @example\\n *\\n * // Avoid excessively updating the position while scrolling.\\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\\n *\\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\\n * jQuery(element).on('click', throttled);\\n *\\n * // Cancel the trailing throttled invocation.\\n * jQuery(window).on('popstate', throttled.cancel);\\n */\\n function throttle(func, wait, options) {\\n var leading = true,\\n trailing = true;\\n\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n if (isObject(options)) {\\n leading = 'leading' in options ? !!options.leading : leading;\\n trailing = 'trailing' in options ? !!options.trailing : trailing;\\n }\\n return debounce(func, wait, {\\n 'leading': leading,\\n 'maxWait': wait,\\n 'trailing': trailing\\n });\\n }\\n\\n /**\\n * Creates a function that accepts up to one argument, ignoring any\\n * additional arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to cap arguments for.\\n * @returns {Function} Returns the new capped function.\\n * @example\\n *\\n * _.map(['6', '8', '10'], _.unary(parseInt));\\n * // => [6, 8, 10]\\n */\\n function unary(func) {\\n return ary(func, 1);\\n }\\n\\n /**\\n * Creates a function that provides `value` to `wrapper` as its first\\n * argument. Any additional arguments provided to the function are appended\\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\\n * binding of the created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {*} value The value to wrap.\\n * @param {Function} [wrapper=identity] The wrapper function.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var p = _.wrap(_.escape, function(func, text) {\\n * return '

' + func(text) + '

';\\n * });\\n *\\n * p('fred, barney, & pebbles');\\n * // => '

fred, barney, & pebbles

'\\n */\\n function wrap(value, wrapper) {\\n return partial(castFunction(wrapper), value);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Casts `value` as an array if it's not one.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.4.0\\n * @category Lang\\n * @param {*} value The value to inspect.\\n * @returns {Array} Returns the cast array.\\n * @example\\n *\\n * _.castArray(1);\\n * // => [1]\\n *\\n * _.castArray({ 'a': 1 });\\n * // => [{ 'a': 1 }]\\n *\\n * _.castArray('abc');\\n * // => ['abc']\\n *\\n * _.castArray(null);\\n * // => [null]\\n *\\n * _.castArray(undefined);\\n * // => [undefined]\\n *\\n * _.castArray();\\n * // => []\\n *\\n * var array = [1, 2, 3];\\n * console.log(_.castArray(array) === array);\\n * // => true\\n */\\n function castArray() {\\n if (!arguments.length) {\\n return [];\\n }\\n var value = arguments[0];\\n return isArray(value) ? value : [value];\\n }\\n\\n /**\\n * Creates a shallow clone of `value`.\\n *\\n * **Note:** This method is loosely based on the\\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\\n * arrays. The own enumerable properties of `arguments` objects are cloned\\n * as plain objects. An empty object is returned for uncloneable values such\\n * as error objects, functions, DOM nodes, and WeakMaps.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to clone.\\n * @returns {*} Returns the cloned value.\\n * @see _.cloneDeep\\n * @example\\n *\\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\\n *\\n * var shallow = _.clone(objects);\\n * console.log(shallow[0] === objects[0]);\\n * // => true\\n */\\n function clone(value) {\\n return baseClone(value, CLONE_SYMBOLS_FLAG);\\n }\\n\\n /**\\n * This method is like `_.clone` except that it accepts `customizer` which\\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\\n * cloning is handled by the method instead. The `customizer` is invoked with\\n * up to four arguments; (value [, index|key, object, stack]).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to clone.\\n * @param {Function} [customizer] The function to customize cloning.\\n * @returns {*} Returns the cloned value.\\n * @see _.cloneDeepWith\\n * @example\\n *\\n * function customizer(value) {\\n * if (_.isElement(value)) {\\n * return value.cloneNode(false);\\n * }\\n * }\\n *\\n * var el = _.cloneWith(document.body, customizer);\\n *\\n * console.log(el === document.body);\\n * // => false\\n * console.log(el.nodeName);\\n * // => 'BODY'\\n * console.log(el.childNodes.length);\\n * // => 0\\n */\\n function cloneWith(value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\\n }\\n\\n /**\\n * This method is like `_.clone` except that it recursively clones `value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Lang\\n * @param {*} value The value to recursively clone.\\n * @returns {*} Returns the deep cloned value.\\n * @see _.clone\\n * @example\\n *\\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\\n *\\n * var deep = _.cloneDeep(objects);\\n * console.log(deep[0] === objects[0]);\\n * // => false\\n */\\n function cloneDeep(value) {\\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\\n }\\n\\n /**\\n * This method is like `_.cloneWith` except that it recursively clones `value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to recursively clone.\\n * @param {Function} [customizer] The function to customize cloning.\\n * @returns {*} Returns the deep cloned value.\\n * @see _.cloneWith\\n * @example\\n *\\n * function customizer(value) {\\n * if (_.isElement(value)) {\\n * return value.cloneNode(true);\\n * }\\n * }\\n *\\n * var el = _.cloneDeepWith(document.body, customizer);\\n *\\n * console.log(el === document.body);\\n * // => false\\n * console.log(el.nodeName);\\n * // => 'BODY'\\n * console.log(el.childNodes.length);\\n * // => 20\\n */\\n function cloneDeepWith(value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\\n }\\n\\n /**\\n * Checks if `object` conforms to `source` by invoking the predicate\\n * properties of `source` with the corresponding property values of `object`.\\n *\\n * **Note:** This method is equivalent to `_.conforms` when `source` is\\n * partially applied.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.14.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n *\\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\\n * // => true\\n *\\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\\n * // => false\\n */\\n function conformsTo(object, source) {\\n return source == null || baseConformsTo(object, source, keys(source));\\n }\\n\\n /**\\n * Performs a\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * comparison between two values to determine if they are equivalent.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1 };\\n * var other = { 'a': 1 };\\n *\\n * _.eq(object, object);\\n * // => true\\n *\\n * _.eq(object, other);\\n * // => false\\n *\\n * _.eq('a', 'a');\\n * // => true\\n *\\n * _.eq('a', Object('a'));\\n * // => false\\n *\\n * _.eq(NaN, NaN);\\n * // => true\\n */\\n function eq(value, other) {\\n return value === other || (value !== value && other !== other);\\n }\\n\\n /**\\n * Checks if `value` is greater than `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\\n * else `false`.\\n * @see _.lt\\n * @example\\n *\\n * _.gt(3, 1);\\n * // => true\\n *\\n * _.gt(3, 3);\\n * // => false\\n *\\n * _.gt(1, 3);\\n * // => false\\n */\\n var gt = createRelationalOperation(baseGt);\\n\\n /**\\n * Checks if `value` is greater than or equal to `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\\n * `other`, else `false`.\\n * @see _.lte\\n * @example\\n *\\n * _.gte(3, 1);\\n * // => true\\n *\\n * _.gte(3, 3);\\n * // => true\\n *\\n * _.gte(1, 3);\\n * // => false\\n */\\n var gte = createRelationalOperation(function(value, other) {\\n return value >= other;\\n });\\n\\n /**\\n * Checks if `value` is likely an `arguments` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\\n * else `false`.\\n * @example\\n *\\n * _.isArguments(function() { return arguments; }());\\n * // => true\\n *\\n * _.isArguments([1, 2, 3]);\\n * // => false\\n */\\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\\n !propertyIsEnumerable.call(value, 'callee');\\n };\\n\\n /**\\n * Checks if `value` is classified as an `Array` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\\n * @example\\n *\\n * _.isArray([1, 2, 3]);\\n * // => true\\n *\\n * _.isArray(document.body.children);\\n * // => false\\n *\\n * _.isArray('abc');\\n * // => false\\n *\\n * _.isArray(_.noop);\\n * // => false\\n */\\n var isArray = Array.isArray;\\n\\n /**\\n * Checks if `value` is classified as an `ArrayBuffer` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\\n * @example\\n *\\n * _.isArrayBuffer(new ArrayBuffer(2));\\n * // => true\\n *\\n * _.isArrayBuffer(new Array(2));\\n * // => false\\n */\\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\\n\\n /**\\n * Checks if `value` is array-like. A value is considered array-like if it's\\n * not a function and has a `value.length` that's an integer greater than or\\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\\n * @example\\n *\\n * _.isArrayLike([1, 2, 3]);\\n * // => true\\n *\\n * _.isArrayLike(document.body.children);\\n * // => true\\n *\\n * _.isArrayLike('abc');\\n * // => true\\n *\\n * _.isArrayLike(_.noop);\\n * // => false\\n */\\n function isArrayLike(value) {\\n return value != null && isLength(value.length) && !isFunction(value);\\n }\\n\\n /**\\n * This method is like `_.isArrayLike` except that it also checks if `value`\\n * is an object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array-like object,\\n * else `false`.\\n * @example\\n *\\n * _.isArrayLikeObject([1, 2, 3]);\\n * // => true\\n *\\n * _.isArrayLikeObject(document.body.children);\\n * // => true\\n *\\n * _.isArrayLikeObject('abc');\\n * // => false\\n *\\n * _.isArrayLikeObject(_.noop);\\n * // => false\\n */\\n function isArrayLikeObject(value) {\\n return isObjectLike(value) && isArrayLike(value);\\n }\\n\\n /**\\n * Checks if `value` is classified as a boolean primitive or object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\\n * @example\\n *\\n * _.isBoolean(false);\\n * // => true\\n *\\n * _.isBoolean(null);\\n * // => false\\n */\\n function isBoolean(value) {\\n return value === true || value === false ||\\n (isObjectLike(value) && baseGetTag(value) == boolTag);\\n }\\n\\n /**\\n * Checks if `value` is a buffer.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\\n * @example\\n *\\n * _.isBuffer(new Buffer(2));\\n * // => true\\n *\\n * _.isBuffer(new Uint8Array(2));\\n * // => false\\n */\\n var isBuffer = nativeIsBuffer || stubFalse;\\n\\n /**\\n * Checks if `value` is classified as a `Date` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\\n * @example\\n *\\n * _.isDate(new Date);\\n * // => true\\n *\\n * _.isDate('Mon April 23 2012');\\n * // => false\\n */\\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\\n\\n /**\\n * Checks if `value` is likely a DOM element.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\\n * @example\\n *\\n * _.isElement(document.body);\\n * // => true\\n *\\n * _.isElement('');\\n * // => false\\n */\\n function isElement(value) {\\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\\n }\\n\\n /**\\n * Checks if `value` is an empty object, collection, map, or set.\\n *\\n * Objects are considered empty if they have no own enumerable string keyed\\n * properties.\\n *\\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\\n * jQuery-like collections are considered empty if they have a `length` of `0`.\\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\\n * @example\\n *\\n * _.isEmpty(null);\\n * // => true\\n *\\n * _.isEmpty(true);\\n * // => true\\n *\\n * _.isEmpty(1);\\n * // => true\\n *\\n * _.isEmpty([1, 2, 3]);\\n * // => false\\n *\\n * _.isEmpty({ 'a': 1 });\\n * // => false\\n */\\n function isEmpty(value) {\\n if (value == null) {\\n return true;\\n }\\n if (isArrayLike(value) &&\\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\\n return !value.length;\\n }\\n var tag = getTag(value);\\n if (tag == mapTag || tag == setTag) {\\n return !value.size;\\n }\\n if (isPrototype(value)) {\\n return !baseKeys(value).length;\\n }\\n for (var key in value) {\\n if (hasOwnProperty.call(value, key)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * Performs a deep comparison between two values to determine if they are\\n * equivalent.\\n *\\n * **Note:** This method supports comparing arrays, array buffers, booleans,\\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\\n * by their own, not inherited, enumerable properties. Functions and DOM\\n * nodes are compared by strict equality, i.e. `===`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1 };\\n * var other = { 'a': 1 };\\n *\\n * _.isEqual(object, other);\\n * // => true\\n *\\n * object === other;\\n * // => false\\n */\\n function isEqual(value, other) {\\n return baseIsEqual(value, other);\\n }\\n\\n /**\\n * This method is like `_.isEqual` except that it accepts `customizer` which\\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\\n * are handled by the method instead. The `customizer` is invoked with up to\\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * function isGreeting(value) {\\n * return /^h(?:i|ello)$/.test(value);\\n * }\\n *\\n * function customizer(objValue, othValue) {\\n * if (isGreeting(objValue) && isGreeting(othValue)) {\\n * return true;\\n * }\\n * }\\n *\\n * var array = ['hello', 'goodbye'];\\n * var other = ['hi', 'goodbye'];\\n *\\n * _.isEqualWith(array, other, customizer);\\n * // => true\\n */\\n function isEqualWith(value, other, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n var result = customizer ? customizer(value, other) : undefined;\\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\\n }\\n\\n /**\\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\\n * `SyntaxError`, `TypeError`, or `URIError` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\\n * @example\\n *\\n * _.isError(new Error);\\n * // => true\\n *\\n * _.isError(Error);\\n * // => false\\n */\\n function isError(value) {\\n if (!isObjectLike(value)) {\\n return false;\\n }\\n var tag = baseGetTag(value);\\n return tag == errorTag || tag == domExcTag ||\\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\\n }\\n\\n /**\\n * Checks if `value` is a finite primitive number.\\n *\\n * **Note:** This method is based on\\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\\n * @example\\n *\\n * _.isFinite(3);\\n * // => true\\n *\\n * _.isFinite(Number.MIN_VALUE);\\n * // => true\\n *\\n * _.isFinite(Infinity);\\n * // => false\\n *\\n * _.isFinite('3');\\n * // => false\\n */\\n function isFinite(value) {\\n return typeof value == 'number' && nativeIsFinite(value);\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Function` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\\n * @example\\n *\\n * _.isFunction(_);\\n * // => true\\n *\\n * _.isFunction(/abc/);\\n * // => false\\n */\\n function isFunction(value) {\\n if (!isObject(value)) {\\n return false;\\n }\\n // The use of `Object#toString` avoids issues with the `typeof` operator\\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\\n var tag = baseGetTag(value);\\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\\n }\\n\\n /**\\n * Checks if `value` is an integer.\\n *\\n * **Note:** This method is based on\\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\\n * @example\\n *\\n * _.isInteger(3);\\n * // => true\\n *\\n * _.isInteger(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isInteger(Infinity);\\n * // => false\\n *\\n * _.isInteger('3');\\n * // => false\\n */\\n function isInteger(value) {\\n return typeof value == 'number' && value == toInteger(value);\\n }\\n\\n /**\\n * Checks if `value` is a valid array-like length.\\n *\\n * **Note:** This method is loosely based on\\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\\n * @example\\n *\\n * _.isLength(3);\\n * // => true\\n *\\n * _.isLength(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isLength(Infinity);\\n * // => false\\n *\\n * _.isLength('3');\\n * // => false\\n */\\n function isLength(value) {\\n return typeof value == 'number' &&\\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\\n }\\n\\n /**\\n * Checks if `value` is the\\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\\n * @example\\n *\\n * _.isObject({});\\n * // => true\\n *\\n * _.isObject([1, 2, 3]);\\n * // => true\\n *\\n * _.isObject(_.noop);\\n * // => true\\n *\\n * _.isObject(null);\\n * // => false\\n */\\n function isObject(value) {\\n var type = typeof value;\\n return value != null && (type == 'object' || type == 'function');\\n }\\n\\n /**\\n * Checks if `value` is object-like. A value is object-like if it's not `null`\\n * and has a `typeof` result of \\\"object\\\".\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\\n * @example\\n *\\n * _.isObjectLike({});\\n * // => true\\n *\\n * _.isObjectLike([1, 2, 3]);\\n * // => true\\n *\\n * _.isObjectLike(_.noop);\\n * // => false\\n *\\n * _.isObjectLike(null);\\n * // => false\\n */\\n function isObjectLike(value) {\\n return value != null && typeof value == 'object';\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Map` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\\n * @example\\n *\\n * _.isMap(new Map);\\n * // => true\\n *\\n * _.isMap(new WeakMap);\\n * // => false\\n */\\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\\n\\n /**\\n * Performs a partial deep comparison between `object` and `source` to\\n * determine if `object` contains equivalent property values.\\n *\\n * **Note:** This method is equivalent to `_.matches` when `source` is\\n * partially applied.\\n *\\n * Partial comparisons will match empty array and empty object `source`\\n * values against any array or object value, respectively. See `_.isEqual`\\n * for a list of supported value comparisons.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n *\\n * _.isMatch(object, { 'b': 2 });\\n * // => true\\n *\\n * _.isMatch(object, { 'b': 1 });\\n * // => false\\n */\\n function isMatch(object, source) {\\n return object === source || baseIsMatch(object, source, getMatchData(source));\\n }\\n\\n /**\\n * This method is like `_.isMatch` except that it accepts `customizer` which\\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\\n * are handled by the method instead. The `customizer` is invoked with five\\n * arguments: (objValue, srcValue, index|key, object, source).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n * @example\\n *\\n * function isGreeting(value) {\\n * return /^h(?:i|ello)$/.test(value);\\n * }\\n *\\n * function customizer(objValue, srcValue) {\\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\\n * return true;\\n * }\\n * }\\n *\\n * var object = { 'greeting': 'hello' };\\n * var source = { 'greeting': 'hi' };\\n *\\n * _.isMatchWith(object, source, customizer);\\n * // => true\\n */\\n function isMatchWith(object, source, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseIsMatch(object, source, getMatchData(source), customizer);\\n }\\n\\n /**\\n * Checks if `value` is `NaN`.\\n *\\n * **Note:** This method is based on\\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\\n * `undefined` and other non-number values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\\n * @example\\n *\\n * _.isNaN(NaN);\\n * // => true\\n *\\n * _.isNaN(new Number(NaN));\\n * // => true\\n *\\n * isNaN(undefined);\\n * // => true\\n *\\n * _.isNaN(undefined);\\n * // => false\\n */\\n function isNaN(value) {\\n // An `NaN` primitive is the only value that is not equal to itself.\\n // Perform the `toStringTag` check first to avoid errors with some\\n // ActiveX objects in IE.\\n return isNumber(value) && value != +value;\\n }\\n\\n /**\\n * Checks if `value` is a pristine native function.\\n *\\n * **Note:** This method can't reliably detect native functions in the presence\\n * of the core-js package because core-js circumvents this kind of detection.\\n * Despite multiple requests, the core-js maintainer has made it clear: any\\n * attempt to fix the detection will be obstructed. As a result, we're left\\n * with little choice but to throw an error. Unfortunately, this also affects\\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\\n * which rely on core-js.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a native function,\\n * else `false`.\\n * @example\\n *\\n * _.isNative(Array.prototype.push);\\n * // => true\\n *\\n * _.isNative(_);\\n * // => false\\n */\\n function isNative(value) {\\n if (isMaskable(value)) {\\n throw new Error(CORE_ERROR_TEXT);\\n }\\n return baseIsNative(value);\\n }\\n\\n /**\\n * Checks if `value` is `null`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\\n * @example\\n *\\n * _.isNull(null);\\n * // => true\\n *\\n * _.isNull(void 0);\\n * // => false\\n */\\n function isNull(value) {\\n return value === null;\\n }\\n\\n /**\\n * Checks if `value` is `null` or `undefined`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\\n * @example\\n *\\n * _.isNil(null);\\n * // => true\\n *\\n * _.isNil(void 0);\\n * // => true\\n *\\n * _.isNil(NaN);\\n * // => false\\n */\\n function isNil(value) {\\n return value == null;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Number` primitive or object.\\n *\\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\\n * classified as numbers, use the `_.isFinite` method.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\\n * @example\\n *\\n * _.isNumber(3);\\n * // => true\\n *\\n * _.isNumber(Number.MIN_VALUE);\\n * // => true\\n *\\n * _.isNumber(Infinity);\\n * // => true\\n *\\n * _.isNumber('3');\\n * // => false\\n */\\n function isNumber(value) {\\n return typeof value == 'number' ||\\n (isObjectLike(value) && baseGetTag(value) == numberTag);\\n }\\n\\n /**\\n * Checks if `value` is a plain object, that is, an object created by the\\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.8.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * _.isPlainObject(new Foo);\\n * // => false\\n *\\n * _.isPlainObject([1, 2, 3]);\\n * // => false\\n *\\n * _.isPlainObject({ 'x': 0, 'y': 0 });\\n * // => true\\n *\\n * _.isPlainObject(Object.create(null));\\n * // => true\\n */\\n function isPlainObject(value) {\\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\\n return false;\\n }\\n var proto = getPrototype(value);\\n if (proto === null) {\\n return true;\\n }\\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\\n funcToString.call(Ctor) == objectCtorString;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `RegExp` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\\n * @example\\n *\\n * _.isRegExp(/abc/);\\n * // => true\\n *\\n * _.isRegExp('/abc/');\\n * // => false\\n */\\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\\n\\n /**\\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\\n * double precision number which isn't the result of a rounded unsafe integer.\\n *\\n * **Note:** This method is based on\\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\\n * @example\\n *\\n * _.isSafeInteger(3);\\n * // => true\\n *\\n * _.isSafeInteger(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isSafeInteger(Infinity);\\n * // => false\\n *\\n * _.isSafeInteger('3');\\n * // => false\\n */\\n function isSafeInteger(value) {\\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Set` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\\n * @example\\n *\\n * _.isSet(new Set);\\n * // => true\\n *\\n * _.isSet(new WeakSet);\\n * // => false\\n */\\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\\n\\n /**\\n * Checks if `value` is classified as a `String` primitive or object.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\\n * @example\\n *\\n * _.isString('abc');\\n * // => true\\n *\\n * _.isString(1);\\n * // => false\\n */\\n function isString(value) {\\n return typeof value == 'string' ||\\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Symbol` primitive or object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\\n * @example\\n *\\n * _.isSymbol(Symbol.iterator);\\n * // => true\\n *\\n * _.isSymbol('abc');\\n * // => false\\n */\\n function isSymbol(value) {\\n return typeof value == 'symbol' ||\\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\\n }\\n\\n /**\\n * Checks if `value` is classified as a typed array.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\\n * @example\\n *\\n * _.isTypedArray(new Uint8Array);\\n * // => true\\n *\\n * _.isTypedArray([]);\\n * // => false\\n */\\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\\n\\n /**\\n * Checks if `value` is `undefined`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\\n * @example\\n *\\n * _.isUndefined(void 0);\\n * // => true\\n *\\n * _.isUndefined(null);\\n * // => false\\n */\\n function isUndefined(value) {\\n return value === undefined;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `WeakMap` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\\n * @example\\n *\\n * _.isWeakMap(new WeakMap);\\n * // => true\\n *\\n * _.isWeakMap(new Map);\\n * // => false\\n */\\n function isWeakMap(value) {\\n return isObjectLike(value) && getTag(value) == weakMapTag;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `WeakSet` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\\n * @example\\n *\\n * _.isWeakSet(new WeakSet);\\n * // => true\\n *\\n * _.isWeakSet(new Set);\\n * // => false\\n */\\n function isWeakSet(value) {\\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\\n }\\n\\n /**\\n * Checks if `value` is less than `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than `other`,\\n * else `false`.\\n * @see _.gt\\n * @example\\n *\\n * _.lt(1, 3);\\n * // => true\\n *\\n * _.lt(3, 3);\\n * // => false\\n *\\n * _.lt(3, 1);\\n * // => false\\n */\\n var lt = createRelationalOperation(baseLt);\\n\\n /**\\n * Checks if `value` is less than or equal to `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than or equal to\\n * `other`, else `false`.\\n * @see _.gte\\n * @example\\n *\\n * _.lte(1, 3);\\n * // => true\\n *\\n * _.lte(3, 3);\\n * // => true\\n *\\n * _.lte(3, 1);\\n * // => false\\n */\\n var lte = createRelationalOperation(function(value, other) {\\n return value <= other;\\n });\\n\\n /**\\n * Converts `value` to an array.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {Array} Returns the converted array.\\n * @example\\n *\\n * _.toArray({ 'a': 1, 'b': 2 });\\n * // => [1, 2]\\n *\\n * _.toArray('abc');\\n * // => ['a', 'b', 'c']\\n *\\n * _.toArray(1);\\n * // => []\\n *\\n * _.toArray(null);\\n * // => []\\n */\\n function toArray(value) {\\n if (!value) {\\n return [];\\n }\\n if (isArrayLike(value)) {\\n return isString(value) ? stringToArray(value) : copyArray(value);\\n }\\n if (symIterator && value[symIterator]) {\\n return iteratorToArray(value[symIterator]());\\n }\\n var tag = getTag(value),\\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\\n\\n return func(value);\\n }\\n\\n /**\\n * Converts `value` to a finite number.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.12.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted number.\\n * @example\\n *\\n * _.toFinite(3.2);\\n * // => 3.2\\n *\\n * _.toFinite(Number.MIN_VALUE);\\n * // => 5e-324\\n *\\n * _.toFinite(Infinity);\\n * // => 1.7976931348623157e+308\\n *\\n * _.toFinite('3.2');\\n * // => 3.2\\n */\\n function toFinite(value) {\\n if (!value) {\\n return value === 0 ? value : 0;\\n }\\n value = toNumber(value);\\n if (value === INFINITY || value === -INFINITY) {\\n var sign = (value < 0 ? -1 : 1);\\n return sign * MAX_INTEGER;\\n }\\n return value === value ? value : 0;\\n }\\n\\n /**\\n * Converts `value` to an integer.\\n *\\n * **Note:** This method is loosely based on\\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toInteger(3.2);\\n * // => 3\\n *\\n * _.toInteger(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toInteger(Infinity);\\n * // => 1.7976931348623157e+308\\n *\\n * _.toInteger('3.2');\\n * // => 3\\n */\\n function toInteger(value) {\\n var result = toFinite(value),\\n remainder = result % 1;\\n\\n return result === result ? (remainder ? result - remainder : result) : 0;\\n }\\n\\n /**\\n * Converts `value` to an integer suitable for use as the length of an\\n * array-like object.\\n *\\n * **Note:** This method is based on\\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toLength(3.2);\\n * // => 3\\n *\\n * _.toLength(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toLength(Infinity);\\n * // => 4294967295\\n *\\n * _.toLength('3.2');\\n * // => 3\\n */\\n function toLength(value) {\\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\\n }\\n\\n /**\\n * Converts `value` to a number.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to process.\\n * @returns {number} Returns the number.\\n * @example\\n *\\n * _.toNumber(3.2);\\n * // => 3.2\\n *\\n * _.toNumber(Number.MIN_VALUE);\\n * // => 5e-324\\n *\\n * _.toNumber(Infinity);\\n * // => Infinity\\n *\\n * _.toNumber('3.2');\\n * // => 3.2\\n */\\n function toNumber(value) {\\n if (typeof value == 'number') {\\n return value;\\n }\\n if (isSymbol(value)) {\\n return NAN;\\n }\\n if (isObject(value)) {\\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\\n value = isObject(other) ? (other + '') : other;\\n }\\n if (typeof value != 'string') {\\n return value === 0 ? value : +value;\\n }\\n value = value.replace(reTrim, '');\\n var isBinary = reIsBinary.test(value);\\n return (isBinary || reIsOctal.test(value))\\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\\n : (reIsBadHex.test(value) ? NAN : +value);\\n }\\n\\n /**\\n * Converts `value` to a plain object flattening inherited enumerable string\\n * keyed properties of `value` to own properties of the plain object.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {Object} Returns the converted plain object.\\n * @example\\n *\\n * function Foo() {\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.assign({ 'a': 1 }, new Foo);\\n * // => { 'a': 1, 'b': 2 }\\n *\\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\\n * // => { 'a': 1, 'b': 2, 'c': 3 }\\n */\\n function toPlainObject(value) {\\n return copyObject(value, keysIn(value));\\n }\\n\\n /**\\n * Converts `value` to a safe integer. A safe integer can be compared and\\n * represented correctly.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toSafeInteger(3.2);\\n * // => 3\\n *\\n * _.toSafeInteger(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toSafeInteger(Infinity);\\n * // => 9007199254740991\\n *\\n * _.toSafeInteger('3.2');\\n * // => 3\\n */\\n function toSafeInteger(value) {\\n return value\\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\\n : (value === 0 ? value : 0);\\n }\\n\\n /**\\n * Converts `value` to a string. An empty string is returned for `null`\\n * and `undefined` values. The sign of `-0` is preserved.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {string} Returns the converted string.\\n * @example\\n *\\n * _.toString(null);\\n * // => ''\\n *\\n * _.toString(-0);\\n * // => '-0'\\n *\\n * _.toString([1, 2, 3]);\\n * // => '1,2,3'\\n */\\n function toString(value) {\\n return value == null ? '' : baseToString(value);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Assigns own enumerable string keyed properties of source objects to the\\n * destination object. Source objects are applied from left to right.\\n * Subsequent sources overwrite property assignments of previous sources.\\n *\\n * **Note:** This method mutates `object` and is loosely based on\\n * [`Object.assign`](https://mdn.io/Object/assign).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.10.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.assignIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * function Bar() {\\n * this.c = 3;\\n * }\\n *\\n * Foo.prototype.b = 2;\\n * Bar.prototype.d = 4;\\n *\\n * _.assign({ 'a': 0 }, new Foo, new Bar);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n var assign = createAssigner(function(object, source) {\\n if (isPrototype(source) || isArrayLike(source)) {\\n copyObject(source, keys(source), object);\\n return;\\n }\\n for (var key in source) {\\n if (hasOwnProperty.call(source, key)) {\\n assignValue(object, key, source[key]);\\n }\\n }\\n });\\n\\n /**\\n * This method is like `_.assign` except that it iterates over own and\\n * inherited source properties.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias extend\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.assign\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * function Bar() {\\n * this.c = 3;\\n * }\\n *\\n * Foo.prototype.b = 2;\\n * Bar.prototype.d = 4;\\n *\\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\\n */\\n var assignIn = createAssigner(function(object, source) {\\n copyObject(source, keysIn(source), object);\\n });\\n\\n /**\\n * This method is like `_.assignIn` except that it accepts `customizer`\\n * which is invoked to produce the assigned values. If `customizer` returns\\n * `undefined`, assignment is handled by the method instead. The `customizer`\\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias extendWith\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @see _.assignWith\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * return _.isUndefined(objValue) ? srcValue : objValue;\\n * }\\n *\\n * var defaults = _.partialRight(_.assignInWith, customizer);\\n *\\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\\n copyObject(source, keysIn(source), object, customizer);\\n });\\n\\n /**\\n * This method is like `_.assign` except that it accepts `customizer`\\n * which is invoked to produce the assigned values. If `customizer` returns\\n * `undefined`, assignment is handled by the method instead. The `customizer`\\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @see _.assignInWith\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * return _.isUndefined(objValue) ? srcValue : objValue;\\n * }\\n *\\n * var defaults = _.partialRight(_.assignWith, customizer);\\n *\\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\\n copyObject(source, keys(source), object, customizer);\\n });\\n\\n /**\\n * Creates an array of values corresponding to `paths` of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Array} Returns the picked values.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\\n *\\n * _.at(object, ['a[0].b.c', 'a[1]']);\\n * // => [3, 4]\\n */\\n var at = flatRest(baseAt);\\n\\n /**\\n * Creates an object that inherits from the `prototype` object. If a\\n * `properties` object is given, its own enumerable string keyed properties\\n * are assigned to the created object.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.3.0\\n * @category Object\\n * @param {Object} prototype The object to inherit from.\\n * @param {Object} [properties] The properties to assign to the object.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * function Shape() {\\n * this.x = 0;\\n * this.y = 0;\\n * }\\n *\\n * function Circle() {\\n * Shape.call(this);\\n * }\\n *\\n * Circle.prototype = _.create(Shape.prototype, {\\n * 'constructor': Circle\\n * });\\n *\\n * var circle = new Circle;\\n * circle instanceof Circle;\\n * // => true\\n *\\n * circle instanceof Shape;\\n * // => true\\n */\\n function create(prototype, properties) {\\n var result = baseCreate(prototype);\\n return properties == null ? result : baseAssign(result, properties);\\n }\\n\\n /**\\n * Assigns own and inherited enumerable string keyed properties of source\\n * objects to the destination object for all destination properties that\\n * resolve to `undefined`. Source objects are applied from left to right.\\n * Once a property is set, additional values of the same property are ignored.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.defaultsDeep\\n * @example\\n *\\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var defaults = baseRest(function(args) {\\n args.push(undefined, customDefaultsAssignIn);\\n return apply(assignInWith, undefined, args);\\n });\\n\\n /**\\n * This method is like `_.defaults` except that it recursively assigns\\n * default properties.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.10.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.defaults\\n * @example\\n *\\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\\n * // => { 'a': { 'b': 2, 'c': 3 } }\\n */\\n var defaultsDeep = baseRest(function(args) {\\n args.push(undefined, customDefaultsMerge);\\n return apply(mergeWith, undefined, args);\\n });\\n\\n /**\\n * This method is like `_.find` except that it returns the key of the first\\n * element `predicate` returns truthy for instead of the element itself.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {string|undefined} Returns the key of the matched element,\\n * else `undefined`.\\n * @example\\n *\\n * var users = {\\n * 'barney': { 'age': 36, 'active': true },\\n * 'fred': { 'age': 40, 'active': false },\\n * 'pebbles': { 'age': 1, 'active': true }\\n * };\\n *\\n * _.findKey(users, function(o) { return o.age < 40; });\\n * // => 'barney' (iteration order is not guaranteed)\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findKey(users, { 'age': 1, 'active': true });\\n * // => 'pebbles'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findKey(users, ['active', false]);\\n * // => 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findKey(users, 'active');\\n * // => 'barney'\\n */\\n function findKey(object, predicate) {\\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\\n }\\n\\n /**\\n * This method is like `_.findKey` except that it iterates over elements of\\n * a collection in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {string|undefined} Returns the key of the matched element,\\n * else `undefined`.\\n * @example\\n *\\n * var users = {\\n * 'barney': { 'age': 36, 'active': true },\\n * 'fred': { 'age': 40, 'active': false },\\n * 'pebbles': { 'age': 1, 'active': true }\\n * };\\n *\\n * _.findLastKey(users, function(o) { return o.age < 40; });\\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findLastKey(users, { 'age': 36, 'active': true });\\n * // => 'barney'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findLastKey(users, ['active', false]);\\n * // => 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findLastKey(users, 'active');\\n * // => 'pebbles'\\n */\\n function findLastKey(object, predicate) {\\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\\n }\\n\\n /**\\n * Iterates over own and inherited enumerable string keyed properties of an\\n * object and invokes `iteratee` for each property. The iteratee is invoked\\n * with three arguments: (value, key, object). Iteratee functions may exit\\n * iteration early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forInRight\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forIn(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\\n */\\n function forIn(object, iteratee) {\\n return object == null\\n ? object\\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\\n }\\n\\n /**\\n * This method is like `_.forIn` except that it iterates over properties of\\n * `object` in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forInRight(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\\n */\\n function forInRight(object, iteratee) {\\n return object == null\\n ? object\\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\\n }\\n\\n /**\\n * Iterates over own enumerable string keyed properties of an object and\\n * invokes `iteratee` for each property. The iteratee is invoked with three\\n * arguments: (value, key, object). Iteratee functions may exit iteration\\n * early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forOwnRight\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forOwn(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\\n */\\n function forOwn(object, iteratee) {\\n return object && baseForOwn(object, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.forOwn` except that it iterates over properties of\\n * `object` in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forOwn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forOwnRight(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\\n */\\n function forOwnRight(object, iteratee) {\\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * Creates an array of function property names from own enumerable properties\\n * of `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @returns {Array} Returns the function names.\\n * @see _.functionsIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = _.constant('a');\\n * this.b = _.constant('b');\\n * }\\n *\\n * Foo.prototype.c = _.constant('c');\\n *\\n * _.functions(new Foo);\\n * // => ['a', 'b']\\n */\\n function functions(object) {\\n return object == null ? [] : baseFunctions(object, keys(object));\\n }\\n\\n /**\\n * Creates an array of function property names from own and inherited\\n * enumerable properties of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @returns {Array} Returns the function names.\\n * @see _.functions\\n * @example\\n *\\n * function Foo() {\\n * this.a = _.constant('a');\\n * this.b = _.constant('b');\\n * }\\n *\\n * Foo.prototype.c = _.constant('c');\\n *\\n * _.functionsIn(new Foo);\\n * // => ['a', 'b', 'c']\\n */\\n function functionsIn(object) {\\n return object == null ? [] : baseFunctions(object, keysIn(object));\\n }\\n\\n /**\\n * Gets the value at `path` of `object`. If the resolved value is\\n * `undefined`, the `defaultValue` is returned in its place.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.7.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to get.\\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\\n * @returns {*} Returns the resolved value.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.get(object, 'a[0].b.c');\\n * // => 3\\n *\\n * _.get(object, ['a', '0', 'b', 'c']);\\n * // => 3\\n *\\n * _.get(object, 'a.b.c', 'default');\\n * // => 'default'\\n */\\n function get(object, path, defaultValue) {\\n var result = object == null ? undefined : baseGet(object, path);\\n return result === undefined ? defaultValue : result;\\n }\\n\\n /**\\n * Checks if `path` is a direct property of `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n * @example\\n *\\n * var object = { 'a': { 'b': 2 } };\\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\\n *\\n * _.has(object, 'a');\\n * // => true\\n *\\n * _.has(object, 'a.b');\\n * // => true\\n *\\n * _.has(object, ['a', 'b']);\\n * // => true\\n *\\n * _.has(other, 'a');\\n * // => false\\n */\\n function has(object, path) {\\n return object != null && hasPath(object, path, baseHas);\\n }\\n\\n /**\\n * Checks if `path` is a direct or inherited property of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n * @example\\n *\\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\\n *\\n * _.hasIn(object, 'a');\\n * // => true\\n *\\n * _.hasIn(object, 'a.b');\\n * // => true\\n *\\n * _.hasIn(object, ['a', 'b']);\\n * // => true\\n *\\n * _.hasIn(object, 'b');\\n * // => false\\n */\\n function hasIn(object, path) {\\n return object != null && hasPath(object, path, baseHasIn);\\n }\\n\\n /**\\n * Creates an object composed of the inverted keys and values of `object`.\\n * If `object` contains duplicate values, subsequent values overwrite\\n * property assignments of previous values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.7.0\\n * @category Object\\n * @param {Object} object The object to invert.\\n * @returns {Object} Returns the new inverted object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\\n *\\n * _.invert(object);\\n * // => { '1': 'c', '2': 'b' }\\n */\\n var invert = createInverter(function(result, value, key) {\\n result[value] = key;\\n }, constant(identity));\\n\\n /**\\n * This method is like `_.invert` except that the inverted object is generated\\n * from the results of running each element of `object` thru `iteratee`. The\\n * corresponding inverted value of each inverted key is an array of keys\\n * responsible for generating the inverted value. The iteratee is invoked\\n * with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.1.0\\n * @category Object\\n * @param {Object} object The object to invert.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Object} Returns the new inverted object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\\n *\\n * _.invertBy(object);\\n * // => { '1': ['a', 'c'], '2': ['b'] }\\n *\\n * _.invertBy(object, function(value) {\\n * return 'group' + value;\\n * });\\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\\n */\\n var invertBy = createInverter(function(result, value, key) {\\n if (hasOwnProperty.call(result, value)) {\\n result[value].push(key);\\n } else {\\n result[value] = [key];\\n }\\n }, getIteratee);\\n\\n /**\\n * Invokes the method at `path` of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the method to invoke.\\n * @param {...*} [args] The arguments to invoke the method with.\\n * @returns {*} Returns the result of the invoked method.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\\n *\\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\\n * // => [2, 3]\\n */\\n var invoke = baseRest(baseInvoke);\\n\\n /**\\n * Creates an array of the own enumerable property names of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects. See the\\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\\n * for more details.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.keys(new Foo);\\n * // => ['a', 'b'] (iteration order is not guaranteed)\\n *\\n * _.keys('hi');\\n * // => ['0', '1']\\n */\\n function keys(object) {\\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\\n }\\n\\n /**\\n * Creates an array of the own and inherited enumerable property names of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.keysIn(new Foo);\\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\\n */\\n function keysIn(object) {\\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\\n }\\n\\n /**\\n * The opposite of `_.mapValues`; this method creates an object with the\\n * same values as `object` and keys generated by running each own enumerable\\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\\n * with three arguments: (value, key, object).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns the new mapped object.\\n * @see _.mapValues\\n * @example\\n *\\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\\n * return key + value;\\n * });\\n * // => { 'a1': 1, 'b2': 2 }\\n */\\n function mapKeys(object, iteratee) {\\n var result = {};\\n iteratee = getIteratee(iteratee, 3);\\n\\n baseForOwn(object, function(value, key, object) {\\n baseAssignValue(result, iteratee(value, key, object), value);\\n });\\n return result;\\n }\\n\\n /**\\n * Creates an object with the same keys as `object` and values generated\\n * by running each own enumerable string keyed property of `object` thru\\n * `iteratee`. The iteratee is invoked with three arguments:\\n * (value, key, object).\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns the new mapped object.\\n * @see _.mapKeys\\n * @example\\n *\\n * var users = {\\n * 'fred': { 'user': 'fred', 'age': 40 },\\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\\n * };\\n *\\n * _.mapValues(users, function(o) { return o.age; });\\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.mapValues(users, 'age');\\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\\n */\\n function mapValues(object, iteratee) {\\n var result = {};\\n iteratee = getIteratee(iteratee, 3);\\n\\n baseForOwn(object, function(value, key, object) {\\n baseAssignValue(result, key, iteratee(value, key, object));\\n });\\n return result;\\n }\\n\\n /**\\n * This method is like `_.assign` except that it recursively merges own and\\n * inherited enumerable string keyed properties of source objects into the\\n * destination object. Source properties that resolve to `undefined` are\\n * skipped if a destination value exists. Array and plain object properties\\n * are merged recursively. Other objects and value types are overridden by\\n * assignment. Source objects are applied from left to right. Subsequent\\n * sources overwrite property assignments of previous sources.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {\\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\\n * };\\n *\\n * var other = {\\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\\n * };\\n *\\n * _.merge(object, other);\\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\\n */\\n var merge = createAssigner(function(object, source, srcIndex) {\\n baseMerge(object, source, srcIndex);\\n });\\n\\n /**\\n * This method is like `_.merge` except that it accepts `customizer` which\\n * is invoked to produce the merged values of the destination and source\\n * properties. If `customizer` returns `undefined`, merging is handled by the\\n * method instead. The `customizer` is invoked with six arguments:\\n * (objValue, srcValue, key, object, source, stack).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} customizer The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * if (_.isArray(objValue)) {\\n * return objValue.concat(srcValue);\\n * }\\n * }\\n *\\n * var object = { 'a': [1], 'b': [2] };\\n * var other = { 'a': [3], 'b': [4] };\\n *\\n * _.mergeWith(object, other, customizer);\\n * // => { 'a': [1, 3], 'b': [2, 4] }\\n */\\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\\n baseMerge(object, source, srcIndex, customizer);\\n });\\n\\n /**\\n * The opposite of `_.pick`; this method creates an object composed of the\\n * own and inherited enumerable property paths of `object` that are not omitted.\\n *\\n * **Note:** This method is considerably slower than `_.pick`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {...(string|string[])} [paths] The property paths to omit.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.omit(object, ['a', 'c']);\\n * // => { 'b': '2' }\\n */\\n var omit = flatRest(function(object, paths) {\\n var result = {};\\n if (object == null) {\\n return result;\\n }\\n var isDeep = false;\\n paths = arrayMap(paths, function(path) {\\n path = castPath(path, object);\\n isDeep || (isDeep = path.length > 1);\\n return path;\\n });\\n copyObject(object, getAllKeysIn(object), result);\\n if (isDeep) {\\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\\n }\\n var length = paths.length;\\n while (length--) {\\n baseUnset(result, paths[length]);\\n }\\n return result;\\n });\\n\\n /**\\n * The opposite of `_.pickBy`; this method creates an object composed of\\n * the own and inherited enumerable string keyed properties of `object` that\\n * `predicate` doesn't return truthy for. The predicate is invoked with two\\n * arguments: (value, key).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {Function} [predicate=_.identity] The function invoked per property.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.omitBy(object, _.isNumber);\\n * // => { 'b': '2' }\\n */\\n function omitBy(object, predicate) {\\n return pickBy(object, negate(getIteratee(predicate)));\\n }\\n\\n /**\\n * Creates an object composed of the picked `object` properties.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.pick(object, ['a', 'c']);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n var pick = flatRest(function(object, paths) {\\n return object == null ? {} : basePick(object, paths);\\n });\\n\\n /**\\n * Creates an object composed of the `object` properties `predicate` returns\\n * truthy for. The predicate is invoked with two arguments: (value, key).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {Function} [predicate=_.identity] The function invoked per property.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.pickBy(object, _.isNumber);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n function pickBy(object, predicate) {\\n if (object == null) {\\n return {};\\n }\\n var props = arrayMap(getAllKeysIn(object), function(prop) {\\n return [prop];\\n });\\n predicate = getIteratee(predicate);\\n return basePickBy(object, props, function(value, path) {\\n return predicate(value, path[0]);\\n });\\n }\\n\\n /**\\n * This method is like `_.get` except that if the resolved value is a\\n * function it's invoked with the `this` binding of its parent object and\\n * its result is returned.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to resolve.\\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\\n * @returns {*} Returns the resolved value.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\\n *\\n * _.result(object, 'a[0].b.c1');\\n * // => 3\\n *\\n * _.result(object, 'a[0].b.c2');\\n * // => 4\\n *\\n * _.result(object, 'a[0].b.c3', 'default');\\n * // => 'default'\\n *\\n * _.result(object, 'a[0].b.c3', _.constant('default'));\\n * // => 'default'\\n */\\n function result(object, path, defaultValue) {\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length;\\n\\n // Ensure the loop is entered when path is empty.\\n if (!length) {\\n length = 1;\\n object = undefined;\\n }\\n while (++index < length) {\\n var value = object == null ? undefined : object[toKey(path[index])];\\n if (value === undefined) {\\n index = length;\\n value = defaultValue;\\n }\\n object = isFunction(value) ? value.call(object) : value;\\n }\\n return object;\\n }\\n\\n /**\\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\\n * it's created. Arrays are created for missing index properties while objects\\n * are created for all other missing properties. Use `_.setWith` to customize\\n * `path` creation.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.7.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.set(object, 'a[0].b.c', 4);\\n * console.log(object.a[0].b.c);\\n * // => 4\\n *\\n * _.set(object, ['x', '0', 'y', 'z'], 5);\\n * console.log(object.x[0].y.z);\\n * // => 5\\n */\\n function set(object, path, value) {\\n return object == null ? object : baseSet(object, path, value);\\n }\\n\\n /**\\n * This method is like `_.set` except that it accepts `customizer` which is\\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\\n * path creation is handled by the method instead. The `customizer` is invoked\\n * with three arguments: (nsValue, key, nsObject).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {};\\n *\\n * _.setWith(object, '[0][1]', 'a', Object);\\n * // => { '0': { '1': 'a' } }\\n */\\n function setWith(object, path, value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return object == null ? object : baseSet(object, path, value, customizer);\\n }\\n\\n /**\\n * Creates an array of own enumerable string keyed-value pairs for `object`\\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\\n * entries are returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias entries\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the key-value pairs.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.toPairs(new Foo);\\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\\n */\\n var toPairs = createToPairs(keys);\\n\\n /**\\n * Creates an array of own and inherited enumerable string keyed-value pairs\\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\\n * or set, its entries are returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias entriesIn\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the key-value pairs.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.toPairsIn(new Foo);\\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\\n */\\n var toPairsIn = createToPairs(keysIn);\\n\\n /**\\n * An alternative to `_.reduce`; this method transforms `object` to a new\\n * `accumulator` object which is the result of running each of its own\\n * enumerable string keyed properties thru `iteratee`, with each invocation\\n * potentially mutating the `accumulator` object. If `accumulator` is not\\n * provided, a new object with the same `[[Prototype]]` will be used. The\\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The custom accumulator value.\\n * @returns {*} Returns the accumulated value.\\n * @example\\n *\\n * _.transform([2, 3, 4], function(result, n) {\\n * result.push(n *= n);\\n * return n % 2 == 0;\\n * }, []);\\n * // => [4, 9]\\n *\\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\\n * (result[value] || (result[value] = [])).push(key);\\n * }, {});\\n * // => { '1': ['a', 'c'], '2': ['b'] }\\n */\\n function transform(object, iteratee, accumulator) {\\n var isArr = isArray(object),\\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\\n\\n iteratee = getIteratee(iteratee, 4);\\n if (accumulator == null) {\\n var Ctor = object && object.constructor;\\n if (isArrLike) {\\n accumulator = isArr ? new Ctor : [];\\n }\\n else if (isObject(object)) {\\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\\n }\\n else {\\n accumulator = {};\\n }\\n }\\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\\n return iteratee(accumulator, value, index, object);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * Removes the property at `path` of `object`.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to unset.\\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\\n * _.unset(object, 'a[0].b.c');\\n * // => true\\n *\\n * console.log(object);\\n * // => { 'a': [{ 'b': {} }] };\\n *\\n * _.unset(object, ['a', '0', 'b', 'c']);\\n * // => true\\n *\\n * console.log(object);\\n * // => { 'a': [{ 'b': {} }] };\\n */\\n function unset(object, path) {\\n return object == null ? true : baseUnset(object, path);\\n }\\n\\n /**\\n * This method is like `_.set` except that accepts `updater` to produce the\\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\\n * is invoked with one argument: (value).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {Function} updater The function to produce the updated value.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\\n * console.log(object.a[0].b.c);\\n * // => 9\\n *\\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\\n * console.log(object.x[0].y.z);\\n * // => 0\\n */\\n function update(object, path, updater) {\\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\\n }\\n\\n /**\\n * This method is like `_.update` except that it accepts `customizer` which is\\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\\n * path creation is handled by the method instead. The `customizer` is invoked\\n * with three arguments: (nsValue, key, nsObject).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {Function} updater The function to produce the updated value.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {};\\n *\\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\\n * // => { '0': { '1': 'a' } }\\n */\\n function updateWith(object, path, updater, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\\n }\\n\\n /**\\n * Creates an array of the own enumerable string keyed property values of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property values.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.values(new Foo);\\n * // => [1, 2] (iteration order is not guaranteed)\\n *\\n * _.values('hi');\\n * // => ['h', 'i']\\n */\\n function values(object) {\\n return object == null ? [] : baseValues(object, keys(object));\\n }\\n\\n /**\\n * Creates an array of the own and inherited enumerable string keyed property\\n * values of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property values.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.valuesIn(new Foo);\\n * // => [1, 2, 3] (iteration order is not guaranteed)\\n */\\n function valuesIn(object) {\\n return object == null ? [] : baseValues(object, keysIn(object));\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Number\\n * @param {number} number The number to clamp.\\n * @param {number} [lower] The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the clamped number.\\n * @example\\n *\\n * _.clamp(-10, -5, 5);\\n * // => -5\\n *\\n * _.clamp(10, -5, 5);\\n * // => 5\\n */\\n function clamp(number, lower, upper) {\\n if (upper === undefined) {\\n upper = lower;\\n lower = undefined;\\n }\\n if (upper !== undefined) {\\n upper = toNumber(upper);\\n upper = upper === upper ? upper : 0;\\n }\\n if (lower !== undefined) {\\n lower = toNumber(lower);\\n lower = lower === lower ? lower : 0;\\n }\\n return baseClamp(toNumber(number), lower, upper);\\n }\\n\\n /**\\n * Checks if `n` is between `start` and up to, but not including, `end`. If\\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\\n * If `start` is greater than `end` the params are swapped to support\\n * negative ranges.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.3.0\\n * @category Number\\n * @param {number} number The number to check.\\n * @param {number} [start=0] The start of the range.\\n * @param {number} end The end of the range.\\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\\n * @see _.range, _.rangeRight\\n * @example\\n *\\n * _.inRange(3, 2, 4);\\n * // => true\\n *\\n * _.inRange(4, 8);\\n * // => true\\n *\\n * _.inRange(4, 2);\\n * // => false\\n *\\n * _.inRange(2, 2);\\n * // => false\\n *\\n * _.inRange(1.2, 2);\\n * // => true\\n *\\n * _.inRange(5.2, 4);\\n * // => false\\n *\\n * _.inRange(-3, -2, -6);\\n * // => true\\n */\\n function inRange(number, start, end) {\\n start = toFinite(start);\\n if (end === undefined) {\\n end = start;\\n start = 0;\\n } else {\\n end = toFinite(end);\\n }\\n number = toNumber(number);\\n return baseInRange(number, start, end);\\n }\\n\\n /**\\n * Produces a random number between the inclusive `lower` and `upper` bounds.\\n * If only one argument is provided a number between `0` and the given number\\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\\n * floats, a floating-point number is returned instead of an integer.\\n *\\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\\n * floating-point values which can produce unexpected results.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.7.0\\n * @category Number\\n * @param {number} [lower=0] The lower bound.\\n * @param {number} [upper=1] The upper bound.\\n * @param {boolean} [floating] Specify returning a floating-point number.\\n * @returns {number} Returns the random number.\\n * @example\\n *\\n * _.random(0, 5);\\n * // => an integer between 0 and 5\\n *\\n * _.random(5);\\n * // => also an integer between 0 and 5\\n *\\n * _.random(5, true);\\n * // => a floating-point number between 0 and 5\\n *\\n * _.random(1.2, 5.2);\\n * // => a floating-point number between 1.2 and 5.2\\n */\\n function random(lower, upper, floating) {\\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\\n upper = floating = undefined;\\n }\\n if (floating === undefined) {\\n if (typeof upper == 'boolean') {\\n floating = upper;\\n upper = undefined;\\n }\\n else if (typeof lower == 'boolean') {\\n floating = lower;\\n lower = undefined;\\n }\\n }\\n if (lower === undefined && upper === undefined) {\\n lower = 0;\\n upper = 1;\\n }\\n else {\\n lower = toFinite(lower);\\n if (upper === undefined) {\\n upper = lower;\\n lower = 0;\\n } else {\\n upper = toFinite(upper);\\n }\\n }\\n if (lower > upper) {\\n var temp = lower;\\n lower = upper;\\n upper = temp;\\n }\\n if (floating || lower % 1 || upper % 1) {\\n var rand = nativeRandom();\\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\\n }\\n return baseRandom(lower, upper);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the camel cased string.\\n * @example\\n *\\n * _.camelCase('Foo Bar');\\n * // => 'fooBar'\\n *\\n * _.camelCase('--foo-bar--');\\n * // => 'fooBar'\\n *\\n * _.camelCase('__FOO_BAR__');\\n * // => 'fooBar'\\n */\\n var camelCase = createCompounder(function(result, word, index) {\\n word = word.toLowerCase();\\n return result + (index ? capitalize(word) : word);\\n });\\n\\n /**\\n * Converts the first character of `string` to upper case and the remaining\\n * to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to capitalize.\\n * @returns {string} Returns the capitalized string.\\n * @example\\n *\\n * _.capitalize('FRED');\\n * // => 'Fred'\\n */\\n function capitalize(string) {\\n return upperFirst(toString(string).toLowerCase());\\n }\\n\\n /**\\n * Deburrs `string` by converting\\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\\n * letters to basic Latin letters and removing\\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to deburr.\\n * @returns {string} Returns the deburred string.\\n * @example\\n *\\n * _.deburr('déjà vu');\\n * // => 'deja vu'\\n */\\n function deburr(string) {\\n string = toString(string);\\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\\n }\\n\\n /**\\n * Checks if `string` ends with the given target string.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to inspect.\\n * @param {string} [target] The string to search for.\\n * @param {number} [position=string.length] The position to search up to.\\n * @returns {boolean} Returns `true` if `string` ends with `target`,\\n * else `false`.\\n * @example\\n *\\n * _.endsWith('abc', 'c');\\n * // => true\\n *\\n * _.endsWith('abc', 'b');\\n * // => false\\n *\\n * _.endsWith('abc', 'b', 2);\\n * // => true\\n */\\n function endsWith(string, target, position) {\\n string = toString(string);\\n target = baseToString(target);\\n\\n var length = string.length;\\n position = position === undefined\\n ? length\\n : baseClamp(toInteger(position), 0, length);\\n\\n var end = position;\\n position -= target.length;\\n return position >= 0 && string.slice(position, end) == target;\\n }\\n\\n /**\\n * Converts the characters \\\"&\\\", \\\"<\\\", \\\">\\\", '\\\"', and \\\"'\\\" in `string` to their\\n * corresponding HTML entities.\\n *\\n * **Note:** No other characters are escaped. To escape additional\\n * characters use a third-party library like [_he_](https://mths.be/he).\\n *\\n * Though the \\\">\\\" character is escaped for symmetry, characters like\\n * \\\">\\\" and \\\"/\\\" don't need escaping in HTML and have no special meaning\\n * unless they're part of a tag or unquoted attribute value. See\\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\\n * (under \\\"semi-related fun fact\\\") for more details.\\n *\\n * When working with HTML you should always\\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\\n * XSS vectors.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category String\\n * @param {string} [string=''] The string to escape.\\n * @returns {string} Returns the escaped string.\\n * @example\\n *\\n * _.escape('fred, barney, & pebbles');\\n * // => 'fred, barney, & pebbles'\\n */\\n function escape(string) {\\n string = toString(string);\\n return (string && reHasUnescapedHtml.test(string))\\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\\n : string;\\n }\\n\\n /**\\n * Escapes the `RegExp` special characters \\\"^\\\", \\\"$\\\", \\\"\\\\\\\", \\\".\\\", \\\"*\\\", \\\"+\\\",\\n * \\\"?\\\", \\\"(\\\", \\\")\\\", \\\"[\\\", \\\"]\\\", \\\"{\\\", \\\"}\\\", and \\\"|\\\" in `string`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to escape.\\n * @returns {string} Returns the escaped string.\\n * @example\\n *\\n * _.escapeRegExp('[lodash](https://lodash.com/)');\\n * // => '\\\\[lodash\\\\]\\\\(https://lodash\\\\.com/\\\\)'\\n */\\n function escapeRegExp(string) {\\n string = toString(string);\\n return (string && reHasRegExpChar.test(string))\\n ? string.replace(reRegExpChar, '\\\\\\\\$&')\\n : string;\\n }\\n\\n /**\\n * Converts `string` to\\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the kebab cased string.\\n * @example\\n *\\n * _.kebabCase('Foo Bar');\\n * // => 'foo-bar'\\n *\\n * _.kebabCase('fooBar');\\n * // => 'foo-bar'\\n *\\n * _.kebabCase('__FOO_BAR__');\\n * // => 'foo-bar'\\n */\\n var kebabCase = createCompounder(function(result, word, index) {\\n return result + (index ? '-' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Converts `string`, as space separated words, to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the lower cased string.\\n * @example\\n *\\n * _.lowerCase('--Foo-Bar--');\\n * // => 'foo bar'\\n *\\n * _.lowerCase('fooBar');\\n * // => 'foo bar'\\n *\\n * _.lowerCase('__FOO_BAR__');\\n * // => 'foo bar'\\n */\\n var lowerCase = createCompounder(function(result, word, index) {\\n return result + (index ? ' ' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Converts the first character of `string` to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the converted string.\\n * @example\\n *\\n * _.lowerFirst('Fred');\\n * // => 'fred'\\n *\\n * _.lowerFirst('FRED');\\n * // => 'fRED'\\n */\\n var lowerFirst = createCaseFirst('toLowerCase');\\n\\n /**\\n * Pads `string` on the left and right sides if it's shorter than `length`.\\n * Padding characters are truncated if they can't be evenly divided by `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.pad('abc', 8);\\n * // => ' abc '\\n *\\n * _.pad('abc', 8, '_-');\\n * // => '_-abc_-_'\\n *\\n * _.pad('abc', 3);\\n * // => 'abc'\\n */\\n function pad(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n if (!length || strLength >= length) {\\n return string;\\n }\\n var mid = (length - strLength) / 2;\\n return (\\n createPadding(nativeFloor(mid), chars) +\\n string +\\n createPadding(nativeCeil(mid), chars)\\n );\\n }\\n\\n /**\\n * Pads `string` on the right side if it's shorter than `length`. Padding\\n * characters are truncated if they exceed `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.padEnd('abc', 6);\\n * // => 'abc '\\n *\\n * _.padEnd('abc', 6, '_-');\\n * // => 'abc_-_'\\n *\\n * _.padEnd('abc', 3);\\n * // => 'abc'\\n */\\n function padEnd(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n return (length && strLength < length)\\n ? (string + createPadding(length - strLength, chars))\\n : string;\\n }\\n\\n /**\\n * Pads `string` on the left side if it's shorter than `length`. Padding\\n * characters are truncated if they exceed `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.padStart('abc', 6);\\n * // => ' abc'\\n *\\n * _.padStart('abc', 6, '_-');\\n * // => '_-_abc'\\n *\\n * _.padStart('abc', 3);\\n * // => 'abc'\\n */\\n function padStart(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n return (length && strLength < length)\\n ? (createPadding(length - strLength, chars) + string)\\n : string;\\n }\\n\\n /**\\n * Converts `string` to an integer of the specified radix. If `radix` is\\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\\n * hexadecimal, in which case a `radix` of `16` is used.\\n *\\n * **Note:** This method aligns with the\\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category String\\n * @param {string} string The string to convert.\\n * @param {number} [radix=10] The radix to interpret `value` by.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.parseInt('08');\\n * // => 8\\n *\\n * _.map(['6', '08', '10'], _.parseInt);\\n * // => [6, 8, 10]\\n */\\n function parseInt(string, radix, guard) {\\n if (guard || radix == null) {\\n radix = 0;\\n } else if (radix) {\\n radix = +radix;\\n }\\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\\n }\\n\\n /**\\n * Repeats the given string `n` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to repeat.\\n * @param {number} [n=1] The number of times to repeat the string.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {string} Returns the repeated string.\\n * @example\\n *\\n * _.repeat('*', 3);\\n * // => '***'\\n *\\n * _.repeat('abc', 2);\\n * // => 'abcabc'\\n *\\n * _.repeat('abc', 0);\\n * // => ''\\n */\\n function repeat(string, n, guard) {\\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\\n n = 1;\\n } else {\\n n = toInteger(n);\\n }\\n return baseRepeat(toString(string), n);\\n }\\n\\n /**\\n * Replaces matches for `pattern` in `string` with `replacement`.\\n *\\n * **Note:** This method is based on\\n * [`String#replace`](https://mdn.io/String/replace).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to modify.\\n * @param {RegExp|string} pattern The pattern to replace.\\n * @param {Function|string} replacement The match replacement.\\n * @returns {string} Returns the modified string.\\n * @example\\n *\\n * _.replace('Hi Fred', 'Fred', 'Barney');\\n * // => 'Hi Barney'\\n */\\n function replace() {\\n var args = arguments,\\n string = toString(args[0]);\\n\\n return args.length < 3 ? string : string.replace(args[1], args[2]);\\n }\\n\\n /**\\n * Converts `string` to\\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the snake cased string.\\n * @example\\n *\\n * _.snakeCase('Foo Bar');\\n * // => 'foo_bar'\\n *\\n * _.snakeCase('fooBar');\\n * // => 'foo_bar'\\n *\\n * _.snakeCase('--FOO-BAR--');\\n * // => 'foo_bar'\\n */\\n var snakeCase = createCompounder(function(result, word, index) {\\n return result + (index ? '_' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Splits `string` by `separator`.\\n *\\n * **Note:** This method is based on\\n * [`String#split`](https://mdn.io/String/split).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to split.\\n * @param {RegExp|string} separator The separator pattern to split by.\\n * @param {number} [limit] The length to truncate results to.\\n * @returns {Array} Returns the string segments.\\n * @example\\n *\\n * _.split('a-b-c', '-', 2);\\n * // => ['a', 'b']\\n */\\n function split(string, separator, limit) {\\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\\n separator = limit = undefined;\\n }\\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\\n if (!limit) {\\n return [];\\n }\\n string = toString(string);\\n if (string && (\\n typeof separator == 'string' ||\\n (separator != null && !isRegExp(separator))\\n )) {\\n separator = baseToString(separator);\\n if (!separator && hasUnicode(string)) {\\n return castSlice(stringToArray(string), 0, limit);\\n }\\n }\\n return string.split(separator, limit);\\n }\\n\\n /**\\n * Converts `string` to\\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.1.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the start cased string.\\n * @example\\n *\\n * _.startCase('--foo-bar--');\\n * // => 'Foo Bar'\\n *\\n * _.startCase('fooBar');\\n * // => 'Foo Bar'\\n *\\n * _.startCase('__FOO_BAR__');\\n * // => 'FOO BAR'\\n */\\n var startCase = createCompounder(function(result, word, index) {\\n return result + (index ? ' ' : '') + upperFirst(word);\\n });\\n\\n /**\\n * Checks if `string` starts with the given target string.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to inspect.\\n * @param {string} [target] The string to search for.\\n * @param {number} [position=0] The position to search from.\\n * @returns {boolean} Returns `true` if `string` starts with `target`,\\n * else `false`.\\n * @example\\n *\\n * _.startsWith('abc', 'a');\\n * // => true\\n *\\n * _.startsWith('abc', 'b');\\n * // => false\\n *\\n * _.startsWith('abc', 'b', 1);\\n * // => true\\n */\\n function startsWith(string, target, position) {\\n string = toString(string);\\n position = position == null\\n ? 0\\n : baseClamp(toInteger(position), 0, string.length);\\n\\n target = baseToString(target);\\n return string.slice(position, position + target.length) == target;\\n }\\n\\n /**\\n * Creates a compiled template function that can interpolate data properties\\n * in \\\"interpolate\\\" delimiters, HTML-escape interpolated data properties in\\n * \\\"escape\\\" delimiters, and execute JavaScript in \\\"evaluate\\\" delimiters. Data\\n * properties may be accessed as free variables in the template. If a setting\\n * object is given, it takes precedence over `_.templateSettings` values.\\n *\\n * **Note:** In the development build `_.template` utilizes\\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\\n * for easier debugging.\\n *\\n * For more information on precompiling templates see\\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\\n *\\n * For more information on Chrome extension sandboxes see\\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category String\\n * @param {string} [string=''] The template string.\\n * @param {Object} [options={}] The options object.\\n * @param {RegExp} [options.escape=_.templateSettings.escape]\\n * The HTML \\\"escape\\\" delimiter.\\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\\n * The \\\"evaluate\\\" delimiter.\\n * @param {Object} [options.imports=_.templateSettings.imports]\\n * An object to import into the template as free variables.\\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\\n * The \\\"interpolate\\\" delimiter.\\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\\n * The sourceURL of the compiled template.\\n * @param {string} [options.variable='obj']\\n * The data object variable name.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the compiled template function.\\n * @example\\n *\\n * // Use the \\\"interpolate\\\" delimiter to create a compiled template.\\n * var compiled = _.template('hello <%= user %>!');\\n * compiled({ 'user': 'fred' });\\n * // => 'hello fred!'\\n *\\n * // Use the HTML \\\"escape\\\" delimiter to escape data property values.\\n * var compiled = _.template('<%- value %>');\\n * compiled({ 'value': '\\\\r\\\\n\\\\r\\\\n\\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 78 */\\n/***/ function(module, exports) {\\n\\n\\t/*\\r\\n\\t\\tMIT License http://www.opensource.org/licenses/mit-license.php\\r\\n\\t\\tAuthor Tobias Koppers @sokra\\r\\n\\t*/\\r\\n\\t// css base code, injected by the css-loader\\r\\n\\tmodule.exports = function() {\\r\\n\\t\\tvar list = [];\\r\\n\\t\\r\\n\\t\\t// return the list of modules as css string\\r\\n\\t\\tlist.toString = function toString() {\\r\\n\\t\\t\\tvar result = [];\\r\\n\\t\\t\\tfor(var i = 0; i < this.length; i++) {\\r\\n\\t\\t\\t\\tvar item = this[i];\\r\\n\\t\\t\\t\\tif(item[2]) {\\r\\n\\t\\t\\t\\t\\tresult.push(\\\"@media \\\" + item[2] + \\\"{\\\" + item[1] + \\\"}\\\");\\r\\n\\t\\t\\t\\t} else {\\r\\n\\t\\t\\t\\t\\tresult.push(item[1]);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\treturn result.join(\\\"\\\");\\r\\n\\t\\t};\\r\\n\\t\\r\\n\\t\\t// import a list of modules into the list\\r\\n\\t\\tlist.i = function(modules, mediaQuery) {\\r\\n\\t\\t\\tif(typeof modules === \\\"string\\\")\\r\\n\\t\\t\\t\\tmodules = [[null, modules, \\\"\\\"]];\\r\\n\\t\\t\\tvar alreadyImportedModules = {};\\r\\n\\t\\t\\tfor(var i = 0; i < this.length; i++) {\\r\\n\\t\\t\\t\\tvar id = this[i][0];\\r\\n\\t\\t\\t\\tif(typeof id === \\\"number\\\")\\r\\n\\t\\t\\t\\t\\talreadyImportedModules[id] = true;\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tfor(i = 0; i < modules.length; i++) {\\r\\n\\t\\t\\t\\tvar item = modules[i];\\r\\n\\t\\t\\t\\t// skip already imported module\\r\\n\\t\\t\\t\\t// this implementation is not 100% perfect for weird media query combinations\\r\\n\\t\\t\\t\\t// when a module is imported multiple times with different media queries.\\r\\n\\t\\t\\t\\t// I hope this will never occur (Hey this way we have smaller bundles)\\r\\n\\t\\t\\t\\tif(typeof item[0] !== \\\"number\\\" || !alreadyImportedModules[item[0]]) {\\r\\n\\t\\t\\t\\t\\tif(mediaQuery && !item[2]) {\\r\\n\\t\\t\\t\\t\\t\\titem[2] = mediaQuery;\\r\\n\\t\\t\\t\\t\\t} else if(mediaQuery) {\\r\\n\\t\\t\\t\\t\\t\\titem[2] = \\\"(\\\" + item[2] + \\\") and (\\\" + mediaQuery + \\\")\\\";\\r\\n\\t\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t\\tlist.push(item);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t};\\r\\n\\t\\treturn list;\\r\\n\\t};\\r\\n\\n\\n/***/ },\\n/* 79 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t/*\\n\\t\\tMIT License http://www.opensource.org/licenses/mit-license.php\\n\\t\\tAuthor Tobias Koppers @sokra\\n\\t*/\\n\\tvar stylesInDom = {},\\n\\t\\tmemoize = function(fn) {\\n\\t\\t\\tvar memo;\\n\\t\\t\\treturn function () {\\n\\t\\t\\t\\tif (typeof memo === \\\"undefined\\\") memo = fn.apply(this, arguments);\\n\\t\\t\\t\\treturn memo;\\n\\t\\t\\t};\\n\\t\\t},\\n\\t\\tisOldIE = memoize(function() {\\n\\t\\t\\treturn /msie [6-9]\\\\b/.test(window.navigator.userAgent.toLowerCase());\\n\\t\\t}),\\n\\t\\tgetHeadElement = memoize(function () {\\n\\t\\t\\treturn document.head || document.getElementsByTagName(\\\"head\\\")[0];\\n\\t\\t}),\\n\\t\\tsingletonElement = null,\\n\\t\\tsingletonCounter = 0,\\n\\t\\tstyleElementsInsertedAtTop = [];\\n\\t\\n\\tmodule.exports = function(list, options) {\\n\\t\\tif(false) {\\n\\t\\t\\tif(typeof document !== \\\"object\\\") throw new Error(\\\"The style-loader cannot be used in a non-browser environment\\\");\\n\\t\\t}\\n\\t\\n\\t\\toptions = options || {};\\n\\t\\t// Force single-tag solution on IE6-9, which has a hard limit on the # of \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 85 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t header: { type: String },\\n\\t placement: { type: String, default: 'right' },\\n\\t show: { type: Boolean, required: true },\\n\\t width: { type: Number, default: 320 }\\n\\t },\\n\\t watch: {\\n\\t show: function show(val, old) {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('input', val);\\n\\t this.$emit(this.show ? 'open' : 'close');\\n\\t var body = document.body;\\n\\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\\n\\t if (val) {\\n\\t if (!this._backdrop) {\\n\\t this._backdrop = document.createElement('div');\\n\\t }\\n\\t this._backdrop.className = 'aside-backdrop';\\n\\t body.appendChild(this._backdrop);\\n\\t body.classList.add('modal-open');\\n\\t if (scrollBarWidth !== 0) {\\n\\t body.style.paddingRight = scrollBarWidth + 'px';\\n\\t }\\n\\t // request property that requires layout to force a layout\\n\\t var x = this._backdrop.clientHeight;\\n\\t this._backdrop.classList.add('in');\\n\\t (0, _NodeList2.default)(this._backdrop).on('click', function () {\\n\\t return _this.trigger_close();\\n\\t });\\n\\t } else {\\n\\t (0, _NodeList2.default)(this._backdrop).on('transitionend', function () {\\n\\t (0, _NodeList2.default)(_this._backdrop).off();\\n\\t try {\\n\\t body.classList.remove('modal-open');\\n\\t body.style.paddingRight = '0';\\n\\t body.removeChild(_this._backdrop);\\n\\t _this._backdrop = null;\\n\\t } catch (e) {}\\n\\t });\\n\\t this._backdrop.className = 'aside-backdrop';\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t trigger: function trigger() {\\n\\t var _this2 = this;\\n\\t\\n\\t return {\\n\\t close: function close() {\\n\\t return _this2.trigger_close();\\n\\t },\\n\\t open: function open() {\\n\\t return _this2.trigger_open();\\n\\t }\\n\\t };\\n\\t },\\n\\t trigger_close: function trigger_close() {\\n\\t this.$emit('close');\\n\\t },\\n\\t trigger_open: function trigger_open() {\\n\\t this.$emit('open');\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this3 = this;\\n\\t\\n\\t this.$emit('trigger', function () {\\n\\t return _this3.trigger;\\n\\t });\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 86 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": 'slide' + _vm.placement\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t staticClass: \\\"aside\\\",\\n\\t class: _vm.placement,\\n\\t style: ({\\n\\t width: _vm.width + 'px'\\n\\t })\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-dialog\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-content\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-header\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.trigger_close\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]), _vm._v(\\\" \\\"), _vm._c('h4', {\\n\\t staticClass: \\\"aside-title\\\"\\n\\t }, [_vm._t(\\\"header\\\", [_vm._v(_vm._s(_vm.header))])], 2)]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"aside-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])])]) : _vm._e()])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-3a4bde27\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 87 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(88)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(89)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\ButtonGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-125eb0c8\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-125eb0c8\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] ButtonGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 88 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t buttons: { type: Boolean, default: true },\\n\\t disabled: { type: Boolean, default: false },\\n\\t justified: { type: Boolean, default: false },\\n\\t type: { type: String, default: 'default' },\\n\\t value: { default: null },\\n\\t vertical: { type: Boolean, default: false }\\n\\t },\\n\\t computed: {\\n\\t btnGroup: function btnGroup() {\\n\\t return !this.disabled;\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t // this will update EXTERNAL v-model when our val changes\\n\\t val: function val(_val) {\\n\\t this.$emit('input', _val);\\n\\t },\\n\\t\\n\\t // this will update our INTERNAL val, when something external changes our v-model\\n\\t value: function value(val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 89 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: {\\n\\t 'btn-group': _vm.buttons, 'btn-group-justified': _vm.justified, 'btn-group-vertical': _vm.vertical\\n\\t },\\n\\t attrs: {\\n\\t \\\"data-toggle\\\": _vm.buttons && 'buttons'\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-125eb0c8\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 90 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(91)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(93)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(94)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Carousel.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-322dee41\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-322dee41\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-322dee41\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Carousel.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 91 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 93 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t// let coerce = {\\n\\t// interval: 'number'\\n\\t// }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t indicators: {\\n\\t type: Boolean,\\n\\t default: true\\n\\t },\\n\\t controls: {\\n\\t type: Boolean,\\n\\t default: true\\n\\t },\\n\\t interval: {\\n\\t type: Number,\\n\\t default: 5000\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t indicator_list: [],\\n\\t index: 0,\\n\\t isAnimating: false\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t index: function index(newVal, oldVal) {\\n\\t this.slide(newVal > oldVal ? 'left' : 'right', newVal, oldVal);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t indicatorClick: function indicatorClick(index) {\\n\\t if (this.isAnimating || this.index === index) return false;\\n\\t this.isAnimating = true;\\n\\t this.index = index;\\n\\t },\\n\\t slide: function slide(direction, next, prev) {\\n\\t var _this = this;\\n\\t\\n\\t if (!this.$el) {\\n\\t return;\\n\\t }\\n\\t var $slider = (0, _NodeList2.default)('.item', this.$el);\\n\\t if (!$slider.length) {\\n\\t return;\\n\\t }\\n\\t var selected = $slider[next] || $slider[0];\\n\\t (0, _NodeList2.default)(selected).addClass(direction === 'left' ? 'next' : 'prev');\\n\\t // request property that requires layout to force a layout\\n\\t var x = selected.clientHeight;\\n\\t (0, _NodeList2.default)([$slider[prev], selected]).addClass(direction).on('transitionend', function () {\\n\\t $slider.off('transitionend').className = 'item';\\n\\t (0, _NodeList2.default)(selected).addClass('active');\\n\\t _this.isAnimating = false;\\n\\t });\\n\\t },\\n\\t next: function next() {\\n\\t if (!this.$el || this.isAnimating) {\\n\\t return false;\\n\\t }\\n\\t this.isAnimating = true;\\n\\t this.index + 1 < (0, _NodeList2.default)('.item', this.$el).length ? this.index += 1 : this.index = 0;\\n\\t },\\n\\t prev: function prev() {\\n\\t if (!this.$el || this.isAnimating) {\\n\\t return false;\\n\\t }\\n\\t this.isAnimating = true;\\n\\t this.index === 0 ? this.index = (0, _NodeList2.default)('.item', this.$el).length - 1 : this.index -= 1;\\n\\t },\\n\\t toggleInterval: function toggleInterval(val) {\\n\\t if (val === undefined) {\\n\\t val = this._intervalID;\\n\\t }\\n\\t if (this._intervalID) {\\n\\t clearInterval(this._intervalID);\\n\\t delete this._intervalID;\\n\\t }\\n\\t if (val && this.interval > 0) {\\n\\t this._intervalID = setInterval(this.next, this.interval);\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this2 = this;\\n\\t\\n\\t this.toggleInterval(true);\\n\\t (0, _NodeList2.default)(this.$el).on('mouseenter', function () {\\n\\t return _this2.toggleInterval(false);\\n\\t }).on('mouseleave', function () {\\n\\t return _this2.toggleInterval(true);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t this.toggleInterval(false);\\n\\t (0, _NodeList2.default)(this.$el).off('mouseenter mouseleave');\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 94 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"carousel slide\\\",\\n\\t attrs: {\\n\\t \\\"data-ride\\\": \\\"carousel\\\"\\n\\t }\\n\\t }, [_vm._c('ol', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.indicators),\\n\\t expression: \\\"indicators\\\"\\n\\t }],\\n\\t staticClass: \\\"carousel-indicators\\\"\\n\\t }, _vm._l((_vm.indicator_list), function(indicator, i) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t active: i === _vm.index\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.indicatorClick(i)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span')])\\n\\t })), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"carousel-inner\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"listbox\\\"\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.controls),\\n\\t expression: \\\"controls\\\"\\n\\t }],\\n\\t staticClass: \\\"carousel-controls hidden-xs\\\"\\n\\t }, [_vm._c('a', {\\n\\t staticClass: \\\"left carousel-control\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.prev\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"glyphicon glyphicon-chevron-left\\\",\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t })]), _vm._v(\\\" \\\"), _vm._c('a', {\\n\\t staticClass: \\\"right carousel-control\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.next\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"glyphicon glyphicon-chevron-right\\\",\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t })])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-322dee41\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 95 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(96)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(98)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(99)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Checkbox.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-6922bf24\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-6922bf24\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-6922bf24\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Checkbox.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 96 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 98 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t button: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t falseValue: { default: false },\\n\\t name: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t trueValue: { default: true },\\n\\t type: { type: String, default: null },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t checked: this.value === this.trueValue\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t inGroup: function inGroup() {\\n\\t return this.$parent && this.$parent.btnGroup && !this.$parent._radioGroup;\\n\\t },\\n\\t isButton: function isButton() {\\n\\t return this.button || this.$parent && this.$parent.btnGroup && this.$parent.buttons;\\n\\t },\\n\\t isFalse: function isFalse() {\\n\\t return this.value === this.falseValue;\\n\\t },\\n\\t isTrue: function isTrue() {\\n\\t return this.value === this.trueValue;\\n\\t },\\n\\t parentValue: function parentValue() {\\n\\t return this.$parent.val;\\n\\t },\\n\\t typeColor: function typeColor() {\\n\\t return this.type || this.$parent && this.$parent.type || 'default';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t checked: function checked(val, old) {\\n\\t var value = val ? this.trueValue : this.falseValue;\\n\\t this.$emit('checked', val);\\n\\t this.$emit('input', value);\\n\\t this.updateParent();\\n\\t },\\n\\t parentValue: function parentValue(val) {\\n\\t this.updateFromParent();\\n\\t },\\n\\t value: function value(val, old) {\\n\\t var checked = val === this.trueValue;\\n\\t if (this.checked !== checked) {\\n\\t this.checked = checked;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.inGroup) {\\n\\t var parent = this.$parent;\\n\\t parent._checkboxGroup = true;\\n\\t if (!(parent.val instanceof Array)) {\\n\\t parent.val = [];\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.updateFromParent();\\n\\t },\\n\\t\\n\\t methods: {\\n\\t // called @ mounted(), or whenever $parent.val changes\\n\\t // sync our state with the $parent.val\\n\\t updateFromParent: function updateFromParent() {\\n\\t if (this.inGroup) {\\n\\t var index = this.$parent.val.indexOf(this.trueValue);\\n\\t this.checked = ~index;\\n\\t }\\n\\t },\\n\\t\\n\\t // called when our checked state changes\\n\\t updateParent: function updateParent() {\\n\\t if (this.inGroup) {\\n\\t var index = this.$parent.val.indexOf(this.trueValue);\\n\\t if (this.checked && !~index) this.$parent.val.push(this.trueValue);\\n\\t if (!this.checked && ~index) this.$parent.val.splice(index, 1);\\n\\t }\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled || this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.checked = !this.checked;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 99 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.isButton ? 'a' : 'label', {\\n\\t tag: \\\"a\\\",\\n\\t class: [_vm.isButton ? 'btn btn-' + _vm.typeColor : 'open checkbox ' + _vm.typeColor, {\\n\\t active: _vm.checked,\\n\\t disabled: _vm.disabled,\\n\\t readonly: _vm.readonly\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggle\\n\\t }\\n\\t }, [(_vm.name) ? _vm._c('input', {\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"hidden\\\",\\n\\t \\\"name\\\": _vm.name\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.checked ? _vm.trueValue : _vm.falseValue\\n\\t }\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), (!_vm.isButton) ? _vm._c('span', {\\n\\t staticClass: \\\"icon dropdown-toggle\\\",\\n\\t class: [_vm.checked ? 'btn-' + _vm.typeColor : '', {\\n\\t bg: _vm.typeColor === 'default'\\n\\t }]\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), (!_vm.isButton && _vm.checked && _vm.typeColor === 'default') ? _vm._c('span', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-6922bf24\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 100 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(101)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(103)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(104)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Datepicker.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-477b8e5d\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-477b8e5d\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Datepicker.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 101 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 103 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\t// import $ from './utils/NodeList.js'\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t value: { type: String },\\n\\t format: { default: 'MM/dd/yyyy' },\\n\\t disabledDaysOfWeek: { type: Array, default: function _default() {\\n\\t return [];\\n\\t }\\n\\t },\\n\\t width: { type: String },\\n\\t clearButton: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t placeholder: { type: String },\\n\\t iconsFont: { type: String, default: 'glyphicon' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t currDate: new Date(),\\n\\t dateRange: [],\\n\\t decadeRange: [],\\n\\t displayDayView: false,\\n\\t displayMonthView: false,\\n\\t displayYearView: false,\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t currDate: function currDate() {\\n\\t this.getDateRange();\\n\\t },\\n\\t format: function format() {\\n\\t this.val = this.stringify(this.currDate);\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t preBtnClasses: function preBtnClasses() {\\n\\t return 'datepicker-preBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-left';\\n\\t },\\n\\t nextBtnClasses: function nextBtnClasses() {\\n\\t return 'datepicker-nextBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-right';\\n\\t },\\n\\t disabledDaysArray: function disabledDaysArray() {\\n\\t return this.disabledDaysOfWeek.map(function (d) {\\n\\t return parseInt(d, 10);\\n\\t });\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t close: function close() {\\n\\t this.displayDayView = this.displayMonthView = this.displayYearView = false;\\n\\t },\\n\\t inputClick: function inputClick() {\\n\\t this.currDate = this.parse(this.val) || this.parse(new Date());\\n\\t if (this.displayMonthView || this.displayYearView) {\\n\\t this.displayDayView = false;\\n\\t } else {\\n\\t this.displayDayView = !this.displayDayView;\\n\\t }\\n\\t },\\n\\t preNextDecadeClick: function preNextDecadeClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var months = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t this.currDate = new Date(year - 10, months, date);\\n\\t } else {\\n\\t this.currDate = new Date(year + 10, months, date);\\n\\t }\\n\\t },\\n\\t preNextMonthClick: function preNextMonthClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var month = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t var preMonth = this.getYearMonth(year, month - 1);\\n\\t this.currDate = new Date(preMonth.year, preMonth.month, date);\\n\\t } else {\\n\\t var nextMonth = this.getYearMonth(year, month + 1);\\n\\t this.currDate = new Date(nextMonth.year, nextMonth.month, date);\\n\\t }\\n\\t },\\n\\t preNextYearClick: function preNextYearClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var months = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t this.currDate = new Date(year - 1, months, date);\\n\\t } else {\\n\\t this.currDate = new Date(year + 1, months, date);\\n\\t }\\n\\t },\\n\\t yearSelect: function yearSelect(year) {\\n\\t this.displayYearView = false;\\n\\t this.displayMonthView = true;\\n\\t this.currDate = new Date(year, this.currDate.getMonth(), this.currDate.getDate());\\n\\t },\\n\\t daySelect: function daySelect(day) {\\n\\t if (day.sclass === 'datepicker-item-disable') {\\n\\t return false;\\n\\t } else {\\n\\t this.currDate = day.date;\\n\\t this.val = this.stringify(this.currDate);\\n\\t this.displayDayView = false;\\n\\t }\\n\\t },\\n\\t switchMonthView: function switchMonthView() {\\n\\t this.displayDayView = false;\\n\\t this.displayMonthView = true;\\n\\t },\\n\\t switchDecadeView: function switchDecadeView() {\\n\\t this.displayMonthView = false;\\n\\t this.displayYearView = true;\\n\\t },\\n\\t monthSelect: function monthSelect(index) {\\n\\t this.displayMonthView = false;\\n\\t this.displayDayView = true;\\n\\t this.currDate = new Date(this.currDate.getFullYear(), index, this.currDate.getDate());\\n\\t },\\n\\t getYearMonth: function getYearMonth(year, month) {\\n\\t if (month > 11) {\\n\\t year++;\\n\\t month = 0;\\n\\t } else if (month < 0) {\\n\\t year--;\\n\\t month = 11;\\n\\t }\\n\\t return { year: year, month: month };\\n\\t },\\n\\t stringifyDecadeHeader: function stringifyDecadeHeader(date) {\\n\\t var yearStr = date.getFullYear().toString();\\n\\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0;\\n\\t var lastYearOfDecade = parseInt(firstYearOfDecade, 10) + 10;\\n\\t return firstYearOfDecade + '-' + lastYearOfDecade;\\n\\t },\\n\\t stringifyDayHeader: function stringifyDayHeader(date) {\\n\\t return this.text.months[date.getMonth()] + ' ' + date.getFullYear();\\n\\t },\\n\\t parseMonth: function parseMonth(date) {\\n\\t return this.text.months[date.getMonth()];\\n\\t },\\n\\t stringifyYearHeader: function stringifyYearHeader(date) {\\n\\t return date.getFullYear();\\n\\t },\\n\\t stringify: function stringify(date) {\\n\\t var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.format;\\n\\t\\n\\t if (!date) date = this.parse();\\n\\t if (!date) return '';\\n\\t var year = date.getFullYear();\\n\\t var month = date.getMonth() + 1;\\n\\t var day = date.getDate();\\n\\t var monthName = this.parseMonth(date);\\n\\t return format.replace(/yyyy/g, year).replace(/yy/g, year).replace(/MMMM/g, monthName).replace(/MMM/g, monthName.substring(0, 3)).replace(/MM/g, ('0' + month).slice(-2)).replace(/M(?!a)/g, month).replace(/dd/g, ('0' + day).slice(-2)).replace(/d/g, day);\\n\\t },\\n\\t parse: function parse(str) {\\n\\t if (str === undefined || str === null) {\\n\\t str = this.val;\\n\\t }\\n\\t var date = str.length === 10 && (this.format === 'dd-MM-yyyy' || this.format === 'dd/MM/yyyy') ? new Date(str.substring(6, 10), str.substring(3, 5) - 1, str.substring(0, 2)) : new Date(str);\\n\\t return isNaN(date.getFullYear()) ? new Date() : date;\\n\\t },\\n\\t getDayCount: function getDayCount(year, month) {\\n\\t var dict = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\\n\\t if (month === 1) {\\n\\t if (year % 400 === 0 || year % 4 === 0 && year % 100 !== 0) {\\n\\t return 29;\\n\\t }\\n\\t }\\n\\t return dict[month];\\n\\t },\\n\\t getDateRange: function getDateRange() {\\n\\t this.dateRange = [];\\n\\t this.decadeRange = [];\\n\\t var time = {\\n\\t year: this.currDate.getFullYear(),\\n\\t month: this.currDate.getMonth(),\\n\\t day: this.currDate.getDate()\\n\\t };\\n\\t var yearStr = time.year.toString();\\n\\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0 - 1;\\n\\t for (var i = 0; i < 12; i++) {\\n\\t this.decadeRange.push({\\n\\t text: firstYearOfDecade + i\\n\\t });\\n\\t }\\n\\t\\n\\t var currMonthFirstDay = new Date(time.year, time.month, 1);\\n\\t var firstDayWeek = currMonthFirstDay.getDay() + 1;\\n\\t if (firstDayWeek === 0) {\\n\\t firstDayWeek = 7;\\n\\t }\\n\\t var dayCount = this.getDayCount(time.year, time.month);\\n\\t if (firstDayWeek > 1) {\\n\\t var preMonth = this.getYearMonth(time.year, time.month - 1);\\n\\t var prevMonthDayCount = this.getDayCount(preMonth.year, preMonth.month);\\n\\t for (var _i = 1; _i < firstDayWeek; _i++) {\\n\\t var dayText = prevMonthDayCount - firstDayWeek + _i + 1;\\n\\t var date = new Date(preMonth.year, preMonth.month, dayText);\\n\\t var sclass = 'datepicker-item-gray';\\n\\t if (this.disabledDaysArray.indexOf(date.getDay()) > -1) {\\n\\t sclass = 'datepicker-item-disable';\\n\\t }\\n\\t this.dateRange.push({ text: dayText, date: date, sclass: sclass });\\n\\t }\\n\\t }\\n\\t\\n\\t for (var _i2 = 1; _i2 <= dayCount; _i2++) {\\n\\t var _date = new Date(time.year, time.month, _i2);\\n\\t var _sclass = '';\\n\\t if (this.disabledDaysArray.indexOf(_date.getDay()) > -1) {\\n\\t _sclass = 'datepicker-item-disable';\\n\\t }\\n\\t if (_i2 == time.day && _date.getFullYear() == time.year && _date.getMonth() == time.month) {\\n\\t _sclass = 'datepicker-dateRange-item-active';\\n\\t }\\n\\t this.dateRange.push({ text: _i2, date: _date, sclass: _sclass });\\n\\t }\\n\\t\\n\\t if (this.dateRange.length < 42) {\\n\\t var nextMonthNeed = 42 - this.dateRange.length;\\n\\t var nextMonth = this.getYearMonth(time.year, time.month + 1);\\n\\t\\n\\t for (var _i3 = 1; _i3 <= nextMonthNeed; _i3++) {\\n\\t var _date2 = new Date(nextMonth.year, nextMonth.month, _i3);\\n\\t var _sclass2 = 'datepicker-item-gray';\\n\\t if (this.disabledDaysArray.indexOf(_date2.getDay()) > -1) {\\n\\t _sclass2 = 'datepicker-item-disable';\\n\\t }\\n\\t this.dateRange.push({ text: _i3, date: _date2, sclass: _sclass2 });\\n\\t }\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('child-created', this);\\n\\t this.currDate = this.parse(this.val) || this.parse(new Date());\\n\\t this._blur = function (e) {\\n\\t if (!_this.$el.contains(e.target)) _this.close();\\n\\t };\\n\\t window.addEventListener('click', this._blur);\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t window.removeEventListener('click', this._blur);\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 104 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"datepicker\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t staticClass: \\\"form-control datepicker-input\\\",\\n\\t class: {\\n\\t 'with-reset-button': _vm.clearButton\\n\\t },\\n\\t style: ({\\n\\t width: _vm.width\\n\\t }),\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"placeholder\\\": _vm.placeholder\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.inputClick,\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.val) ? _vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.val = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayDayView),\\n\\t expression: \\\"displayDayView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextMonthClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextMonthClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', {\\n\\t on: {\\n\\t \\\"click\\\": _vm.switchMonthView\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.stringifyDayHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-weekRange\\\"\\n\\t }, _vm._l((_vm.text.daysOfWeek), function(w) {\\n\\t return _vm._c('span', [_vm._v(_vm._s(w))])\\n\\t })), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-dateRange\\\"\\n\\t }, _vm._l((_vm.dateRange), function(d) {\\n\\t return _vm._c('span', {\\n\\t class: d.sclass,\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.daySelect(d)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(d.text))])\\n\\t }))])])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayMonthView),\\n\\t expression: \\\"displayMonthView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextYearClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextYearClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', {\\n\\t on: {\\n\\t \\\"click\\\": _vm.switchDecadeView\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.stringifyYearHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-monthRange\\\"\\n\\t }, [_vm._l((_vm.text.months), function(m, index) {\\n\\t return [_vm._c('span', {\\n\\t class: {\\n\\t 'datepicker-dateRange-item-active':\\n\\t (_vm.text.months[_vm.parse(_vm.val).getMonth()] === m) &&\\n\\t _vm.currDate.getFullYear() === _vm.parse(_vm.val).getFullYear()\\n\\t },\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(m.substr(0, 3))\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.monthSelect(index)\\n\\t }\\n\\t }\\n\\t })]\\n\\t })], 2)])])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayYearView),\\n\\t expression: \\\"displayYearView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextDecadeClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextDecadeClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', [_vm._v(_vm._s(_vm.stringifyDecadeHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-monthRange decadeRange\\\"\\n\\t }, [_vm._l((_vm.decadeRange), function(decade) {\\n\\t return [_vm._c('span', {\\n\\t class: {\\n\\t 'datepicker-dateRange-item-active': _vm.parse(_vm.val).getFullYear() === decade.text\\n\\t },\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(decade.text)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.stopPropagation();\\n\\t _vm.yearSelect(decade.text)\\n\\t }\\n\\t }\\n\\t })]\\n\\t })], 2)])])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-477b8e5d\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 105 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(106)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(107)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Dropdown.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-39be1072\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-39be1072\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Dropdown.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 106 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tvar _ClickOutside = __webpack_require__(66);\\n\\t\\n\\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t directives: {\\n\\t ClickOutside: _ClickOutside2.default\\n\\t },\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t size: { type: String, default: null },\\n\\t text: { type: String, default: null },\\n\\t type: { type: String, default: 'default' },\\n\\t value: { type: Boolean, default: false }\\n\\t },\\n\\t data: function data() {\\n\\t var show = this.value;\\n\\t return { show: show };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t show: function show(val) {\\n\\t this.$emit('input', val);\\n\\t },\\n\\t value: function value(val) {\\n\\t this.show = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t buttonSize: function buttonSize() {\\n\\t return ~['lg', 'sm', 'xs'].indexOf(this.size) ? 'btn-' + this.size : '';\\n\\t },\\n\\t inInput: function inInput() {\\n\\t return this.$parent._input;\\n\\t },\\n\\t isLi: function isLi() {\\n\\t return this.$parent._isTabs || this.$parent._navbar || this.$parent.menu;\\n\\t },\\n\\t menu: function menu() {\\n\\t return !this.$parent || this.$parent.navbar;\\n\\t },\\n\\t slots: function slots() {\\n\\t return this._slotContents;\\n\\t },\\n\\t submenu: function submenu() {\\n\\t return this.$parent && (this.$parent.menu || this.$parent.submenu);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t blur: function blur() {\\n\\t this.show = false;\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (!this.disabled) {\\n\\t this.show = !this.show;\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t (0, _NodeList2.default)('ul', this.$el).on('click', 'li>a', function (e) {\\n\\t _this.show = false;\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t (0, _NodeList2.default)('ul', this.$el).off();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 107 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.isLi ? 'li' : 'div', {\\n\\t directives: [{\\n\\t name: \\\"click-outside\\\",\\n\\t rawName: \\\"v-click-outside\\\",\\n\\t value: (_vm.blur),\\n\\t expression: \\\"blur\\\"\\n\\t }],\\n\\t tag: \\\"div\\\",\\n\\t class: [{\\n\\t open: _vm.show,\\n\\t disabled: _vm.disabled,\\n\\t dropdown: _vm.isLi,\\n\\t 'input-group-btn': _vm.inInput,\\n\\t 'btn-group': !_vm.isLi && !_vm.inInput\\n\\t }]\\n\\t }, [_vm._t(\\\"before\\\"), _vm._v(\\\" \\\"), (_vm.isLi) ? _vm._c('a', {\\n\\t class: ['dropdown-toggle', _vm.buttonSize, {\\n\\t disabled: _vm.disabled\\n\\t }],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.show = false\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"button\\\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"caret\\\"\\n\\t })], 2) : _vm._c('button', {\\n\\t class: ['btn btn-' + _vm.type, _vm.buttonSize, 'dropdown-toggle'],\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\",\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.show = false\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"button\\\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"caret\\\"\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._t(\\\"dropdown-menu\\\", [_vm._c('ul', {\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-39be1072\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 108 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(109)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(110)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\FormGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-79eb400a\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-79eb400a\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] FormGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 109 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t// let coerce = {\\n\\t// enterSubmit: 'boolean',\\n\\t// icon: 'boolean'\\n\\t// }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t enterSubmit: {\\n\\t type: Boolean,\\n\\t default: false\\n\\t },\\n\\t icon: {\\n\\t type: Boolean,\\n\\t default: false\\n\\t },\\n\\t lang: {\\n\\t type: String,\\n\\t default: navigator.language\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t children: [],\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t validate: function validate() {\\n\\t var valid = true;\\n\\t this.children.some(function (el) {\\n\\t var v = el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\\n\\t if (!v) valid = false;\\n\\t return !valid;\\n\\t });\\n\\t this.valid = valid;\\n\\t return valid === true;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._formGroup = true;\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formGroup) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formGroup) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.validate();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\n/***/ },\\n/* 110 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-79eb400a\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 111 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(112)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(113)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\FormValidator.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-b9f57c46\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-b9f57c46\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] FormValidator.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 112 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t enterSubmit: { type: Boolean, default: false },\\n\\t icon: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t value: null\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t children: [],\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit('input', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t validate: function validate() {\\n\\t var invalid = !this.children.every(function (el) {\\n\\t return el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\\n\\t });\\n\\t this.valid = !invalid;\\n\\t return !invalid;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._formValidator = true;\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.validate();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\n/***/ },\\n/* 113 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-b9f57c46\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 114 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(115)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(117)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(118)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Input.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-652ad7b9\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-652ad7b9\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-652ad7b9\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Input.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 115 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 117 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\tvar DELAY = 300;\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t clearButton: { type: Boolean, default: false },\\n\\t cols: { type: Number, default: null },\\n\\t datalist: { type: Array, default: null },\\n\\t disabled: { type: Boolean, default: false },\\n\\t enterSubmit: { type: Boolean, default: false },\\n\\t error: { type: String, default: null },\\n\\t help: { type: String, default: null },\\n\\t hideHelp: { type: Boolean, default: true },\\n\\t icon: { type: Boolean, default: false },\\n\\t label: { type: String, default: null },\\n\\t lang: { type: String, default: navigator.language },\\n\\t mask: null,\\n\\t maskDelay: { type: Number, default: 100 },\\n\\t match: { type: String, default: null },\\n\\t max: { type: String, default: null },\\n\\t maxlength: { type: Number, default: null },\\n\\t min: { type: String, default: null },\\n\\t minlength: { type: Number, default: 0 },\\n\\t name: { type: String, default: null },\\n\\t pattern: { default: null },\\n\\t placeholder: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t required: { type: Boolean, default: false },\\n\\t rows: { type: Number, default: 3 },\\n\\t step: { type: Number, default: null },\\n\\t type: { type: String, default: 'text' },\\n\\t url: { type: String, default: null },\\n\\t urlMap: { type: Function, default: null },\\n\\t validationDelay: { type: Number, default: 250 },\\n\\t value: { default: null }\\n\\t },\\n\\t data: function data() {\\n\\t var val = this.value;\\n\\t return {\\n\\t options: this.datalist,\\n\\t val: val,\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t canValidate: function canValidate() {\\n\\t return !this.disabled && !this.readonly && (this.required || this.regex || this.nativeValidate || this.match !== null);\\n\\t },\\n\\t errorText: function errorText() {\\n\\t var value = this.value;\\n\\t var error = [this.error];\\n\\t if (!value && this.required) error.push('(' + this.text.required.toLowerCase() + ')');\\n\\t if (value && value.length < this.minlength) error.push('(' + this.text.minLength.toLowerCase() + ': ' + this.minlength + ')');\\n\\t return error.join(' ');\\n\\t },\\n\\t id_datalist: function id_datalist() {\\n\\t if (this.type !== 'textarea' && this.datalist instanceof Array) {\\n\\t if (!this._id_datalist) {\\n\\t if (!this.$root.id_datalist) {\\n\\t this.$root.id_datalist = 0;\\n\\t }\\n\\t this._id_datalist = 'input-datalist' + this.$root.id_datalist++;\\n\\t }\\n\\t return this._id_datalist;\\n\\t }\\n\\t return null;\\n\\t },\\n\\t input: function input() {\\n\\t return this.$refs.input;\\n\\t },\\n\\t nativeValidate: function nativeValidate() {\\n\\t return (this.input || {}).checkValidity && (~['url', 'email'].indexOf(this.type.toLowerCase()) || this.min || this.max);\\n\\t },\\n\\t regex: function regex() {\\n\\t return _utils.coerce.pattern(this.pattern);\\n\\t },\\n\\t showError: function showError() {\\n\\t return this.error && this.valid === false;\\n\\t },\\n\\t showHelp: function showHelp() {\\n\\t return this.help && (!this.showError || !this.hideHelp);\\n\\t },\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t title: function title() {\\n\\t return this.errorText || this.help || '';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t datalist: function datalist(val, old) {\\n\\t if (val !== old && val instanceof Array) {\\n\\t this.options = val;\\n\\t }\\n\\t },\\n\\t match: function match(val) {\\n\\t this.eval();\\n\\t },\\n\\t options: function options(val, old) {\\n\\t if (val !== old) this.$emit('options', val);\\n\\t },\\n\\t url: function url(val) {\\n\\t this._url();\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('input', _val);\\n\\t if (_val !== old) {\\n\\t if (this.mask instanceof Function) {\\n\\t _val = this.mask(_val || '');\\n\\t if (this.val !== _val) {\\n\\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\\n\\t this._timeout.mask = setTimeout(function () {\\n\\t _this.val = _val;\\n\\t }, isNaN(this.maskDelay) ? 0 : this.maskDelay);\\n\\t }\\n\\t }\\n\\t this.eval();\\n\\t }\\n\\t },\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (this._parent) this._parent.validate();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t attr: function attr(value) {\\n\\t return ~['', null, undefined].indexOf(value) || value instanceof Function ? null : value;\\n\\t },\\n\\t emit: function emit(e) {\\n\\t this.$emit(e.type, e.type == 'input' ? e.target.value : e);\\n\\t if (e.type === 'blur' && this.canValidate) {\\n\\t this.valid = this.validate();\\n\\t }\\n\\t },\\n\\t eval: function _eval() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\\n\\t if (!this.canValidate) {\\n\\t this.valid = true;\\n\\t } else {\\n\\t this._timeout.eval = setTimeout(function () {\\n\\t _this2.valid = _this2.validate();\\n\\t _this2._timeout.eval = null;\\n\\t }, this.validationDelay);\\n\\t }\\n\\t },\\n\\t focus: function focus() {\\n\\t this.input.focus();\\n\\t },\\n\\t submit: function submit() {\\n\\t if (this.$parent._formValidator) {\\n\\t return this.$parent.validate();\\n\\t }\\n\\t if (this.input.form) {\\n\\t var invalids = (0, _NodeList2.default)('.form-group.validate:not(.has-success)', this.input.form);\\n\\t if (invalids.length) {\\n\\t invalids.find('input,textarea,select')[0].focus();\\n\\t } else {\\n\\t this.input.form.submit();\\n\\t }\\n\\t }\\n\\t },\\n\\t validate: function validate() {\\n\\t if (!this.canValidate) {\\n\\t return true;\\n\\t }\\n\\t var value = (this.val || '').trim();\\n\\t if (!value) {\\n\\t return !this.required;\\n\\t }\\n\\t if (this.match !== null) {\\n\\t return this.match === value;\\n\\t }\\n\\t if (value.length < this.minlength) {\\n\\t return false;\\n\\t }\\n\\t if (this.nativeValidate && !this.input.checkValidity()) {\\n\\t return false;\\n\\t }\\n\\t if (this.regex) {\\n\\t if (!(this.regex instanceof Function ? this.regex(this.val) : this.regex.test(this.val))) {\\n\\t return false;\\n\\t }\\n\\t }\\n\\t return true;\\n\\t },\\n\\t reset: function reset() {\\n\\t this.value = '';\\n\\t this.valid = null;\\n\\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\\n\\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._input = true;\\n\\t this._timeout = {};\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t this._url = (0, _utils.delayer)(function () {\\n\\t var _this3 = this;\\n\\t\\n\\t if (!this.url || !this.$http || this._loading) {\\n\\t return;\\n\\t }\\n\\t this._loading = true;\\n\\t this.$http.get(this.url).then(function (response) {\\n\\t var data = response.data instanceof Array ? response.data : [];\\n\\t try {\\n\\t data = JSON.parse(data);\\n\\t } catch (e) {}\\n\\t if (_this3.urlMap) {\\n\\t data = data.map(_this3.urlMap);\\n\\t }\\n\\t _this3.options = data;\\n\\t _this3.loading = false;\\n\\t }, function (response) {\\n\\t _this3.loading = false;\\n\\t });\\n\\t }, DELAY);\\n\\t if (this.url) this._url();\\n\\t },\\n\\t mounted: function mounted() {\\n\\t // $(this.input).on('focus', e => { this.$emit('focus', e) }).on('blur', e => {\\n\\t // if (this.canValidate) { this.valid = this.validate() }\\n\\t // this.$emit('blur', e)\\n\\t // })\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t // $(this.input).off()\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 118 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"form-group\\\",\\n\\t class: {\\n\\t validate: _vm.canValidate, 'has-feedback': _vm.icon, 'has-error': _vm.canValidate && _vm.valid === false, 'has-success': _vm.canValidate && _vm.valid\\n\\t }\\n\\t }, [_vm._t(\\\"label\\\", [(_vm.label) ? _vm._c('label', {\\n\\t staticClass: \\\"control-label\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.label))]) : _vm._e()]), _vm._v(\\\" \\\"), (_vm.$slots.before || _vm.$slots.after) ? _vm._c('div', {\\n\\t staticClass: \\\"input-group\\\"\\n\\t }, [_vm._t(\\\"before\\\"), _vm._v(\\\" \\\"), _vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t tag: \\\"textarea\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"cols\\\": _vm.cols,\\n\\t \\\"disabled\\\": _vm.disabled,\\n\\t \\\"list\\\": _vm.id_datalist,\\n\\t \\\"max\\\": _vm.attr(_vm.max),\\n\\t \\\"maxlength\\\": _vm.maxlength,\\n\\t \\\"min\\\": _vm.attr(_vm.min),\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"rows\\\": _vm.rows,\\n\\t \\\"step\\\": _vm.step,\\n\\t \\\"title\\\": _vm.attr(_vm.title),\\n\\t \\\"type\\\": _vm.type == 'textarea' ? null : _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": _vm.emit,\\n\\t \\\"focus\\\": _vm.emit,\\n\\t \\\"input\\\": [function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }, _vm.emit],\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.value) ? _vm._c('div', {\\n\\t class: {\\n\\t icon: _vm.icon\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.value = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.icon) ? _vm._c('div', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }, [(_vm.icon && _vm.valid !== null) ? _vm._c('span', {\\n\\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t }) : _vm._e()]) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"after\\\")], 2) : [_vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t tag: \\\"textarea\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"cols\\\": _vm.cols,\\n\\t \\\"disabled\\\": _vm.disabled,\\n\\t \\\"list\\\": _vm.id_datalist,\\n\\t \\\"max\\\": _vm.attr(_vm.max),\\n\\t \\\"maxlength\\\": _vm.maxlength,\\n\\t \\\"min\\\": _vm.attr(_vm.min),\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"rows\\\": _vm.rows,\\n\\t \\\"step\\\": _vm.step,\\n\\t \\\"title\\\": _vm.attr(_vm.title),\\n\\t \\\"type\\\": _vm.type == 'textarea' ? null : _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": _vm.emit,\\n\\t \\\"focus\\\": _vm.emit,\\n\\t \\\"input\\\": [function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }, _vm.emit],\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.val) ? _vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.val = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.icon && _vm.valid !== null) ? _vm._c('span', {\\n\\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t }) : _vm._e()], _vm._v(\\\" \\\"), (_vm.id_datalist) ? _vm._c('datalist', {\\n\\t attrs: {\\n\\t \\\"id\\\": _vm.id_datalist\\n\\t }\\n\\t }, _vm._l((_vm.options), function(opc) {\\n\\t return _vm._c('option', {\\n\\t domProps: {\\n\\t \\\"value\\\": opc\\n\\t }\\n\\t })\\n\\t })) : _vm._e(), _vm._v(\\\" \\\"), (_vm.showHelp) ? _vm._c('div', {\\n\\t staticClass: \\\"help-block\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.help))]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.showError) ? _vm._c('div', {\\n\\t staticClass: \\\"help-block with-errors\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.errorText))]) : _vm._e()], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-652ad7b9\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 119 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(120)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(122)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(127)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Modal.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-fe7d5dc8\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-fe7d5dc8\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Modal.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 120 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 122 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _isInteger = __webpack_require__(123);\\n\\t\\n\\tvar _isInteger2 = _interopRequireDefault(_isInteger);\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t backdrop: { type: Boolean, default: true },\\n\\t callback: { type: Function, default: null },\\n\\t cancelText: { type: String, default: 'Close' },\\n\\t effect: { type: String, default: null },\\n\\t large: { type: Boolean, default: false },\\n\\t okText: { type: String, default: 'Save changes' },\\n\\t small: { type: Boolean, default: false },\\n\\t title: { type: String, default: '' },\\n\\t value: { type: Boolean, required: true },\\n\\t width: { default: null }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t transition: false,\\n\\t val: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t optionalWidth: function optionalWidth() {\\n\\t if (this.width === null) {\\n\\t return null;\\n\\t } else if ((0, _isInteger2.default)(this.width)) {\\n\\t return this.width + 'px';\\n\\t }\\n\\t return this.width;\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t transition: function transition(val, old) {\\n\\t if (val === old) {\\n\\t return;\\n\\t }\\n\\t var el = this.$el;\\n\\t var body = document.body;\\n\\t if (val) {\\n\\t //starting\\n\\t if (this.val) {\\n\\t el.querySelector('.modal-content').focus();\\n\\t el.style.display = 'block';\\n\\t setTimeout(function () {\\n\\t return el.classList.add('in');\\n\\t }, 0);\\n\\t body.classList.add('modal-open');\\n\\t if ((0, _utils.getScrollBarWidth)() !== 0) {\\n\\t body.style.paddingRight = (0, _utils.getScrollBarWidth)() + 'px';\\n\\t }\\n\\t } else {\\n\\t el.classList.remove('in');\\n\\t }\\n\\t } else {\\n\\t //ending\\n\\t this.$emit(this.val ? 'opened' : 'closed');\\n\\t if (!this.val) {\\n\\t el.style.display = 'none';\\n\\t body.style.paddingRight = null;\\n\\t body.classList.remove('modal-open');\\n\\t }\\n\\t }\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t if (old === null ? _val === true : _val !== old) this.transition = true;\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) this.val = val;\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t action: function action(val, p) {\\n\\t if (val === null) {\\n\\t return;\\n\\t }\\n\\t if (val && this.callback instanceof Function) this.callback();\\n\\t this.$emit(val ? 'ok' : 'cancel', p);\\n\\t this.val = val || false;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.val = this.value;\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 123 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports = { \\\"default\\\": __webpack_require__(124), __esModule: true };\\n\\n/***/ },\\n/* 124 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(125);\\n\\tmodule.exports = __webpack_require__(7).Number.isInteger;\\n\\n/***/ },\\n/* 125 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 20.1.2.3 Number.isInteger(number)\\n\\tvar $export = __webpack_require__(5);\\n\\t\\n\\t$export($export.S, 'Number', {isInteger: __webpack_require__(126)});\\n\\n/***/ },\\n/* 126 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 20.1.2.3 Number.isInteger(number)\\n\\tvar isObject = __webpack_require__(13)\\n\\t , floor = Math.floor;\\n\\tmodule.exports = function isInteger(it){\\n\\t return !isObject(it) && isFinite(it) && floor(it) === it;\\n\\t};\\n\\n/***/ },\\n/* 127 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['modal', _vm.effect],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"dialog\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.backdrop && _vm.action(false, 1)\\n\\t },\\n\\t \\\"transitionend\\\": function($event) {\\n\\t _vm.transition = false\\n\\t }\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t class: ['modal-dialog', {\\n\\t 'modal-lg': _vm.large,\\n\\t 'modal-sm': _vm.small\\n\\t }],\\n\\t style: ({\\n\\t width: _vm.optionalWidth\\n\\t }),\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"document\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.stopPropagation();\\n\\t _vm.action(null)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"modal-content\\\"\\n\\t }, [_vm._t(\\\"modal-header\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-header\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.action(false, 2)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]), _vm._v(\\\" \\\"), _vm._c('h4', {\\n\\t staticClass: \\\"modal-title\\\"\\n\\t }, [_vm._t(\\\"title\\\", [_vm._v(_vm._s(_vm.title))])], 2)])]), _vm._v(\\\" \\\"), _vm._t(\\\"modal-body\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)]), _vm._v(\\\" \\\"), _vm._t(\\\"modal-footer\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-footer\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"btn btn-default\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.action(false, 3)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.cancelText))]), _vm._v(\\\" \\\"), _vm._c('button', {\\n\\t staticClass: \\\"btn btn-primary\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.action(true, 4)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.okText))])])])], 2)])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-fe7d5dc8\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 128 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(129)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(130)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Navbar.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-38f0619e\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-38f0619e\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Navbar.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 129 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t type: { type: String, default: 'default' },\\n\\t placement: { type: String, default: '' },\\n\\t container: { type: String, default: '' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t id: 'bs-example-navbar-collapse-1',\\n\\t collapsed: true,\\n\\t styles: {}\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t slots: function slots() {\\n\\t return this._slotContents;\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggleCollapse: function toggleCollapse(e) {\\n\\t e && e.preventDefault();\\n\\t this.collapsed = !this.collapsed;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._navbar = true;\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t try {\\n\\t (function () {\\n\\t var $dropdown = (0, _NodeList2.default)('.dropdown>[data-toggle=\\\"dropdown\\\"]', _this.$el).parent();\\n\\t if ($dropdown) {\\n\\t $dropdown.on('click', '.dropdown-toggle', function (e) {\\n\\t e.preventDefault();\\n\\t $dropdown.each(function (content) {\\n\\t if (content.contains(e.target)) content.classList.toggle('open');\\n\\t });\\n\\t }).on('click', '.dropdown-menu>li>a', function (e) {\\n\\t $dropdown.each(function (content) {\\n\\t if (content.contains(e.target)) content.classList.remove('open');\\n\\t });\\n\\t }).onBlur(function (e) {\\n\\t $dropdown.each(function (content) {\\n\\t if (!content.contains(e.target)) content.classList.remove('open');\\n\\t });\\n\\t });\\n\\t }\\n\\t })();\\n\\t } catch (ex) {\\n\\t console.log('error finding dropdown');\\n\\t }\\n\\t\\n\\t (0, _NodeList2.default)(this.$el).on('click touchstart', 'li:not(.dropdown)>a', function (e) {\\n\\t setTimeout(function () {\\n\\t _this.collapsed = true;\\n\\t }, 200);\\n\\t }).onBlur(function (e) {\\n\\t if (!_this.$el.contains(e.target)) {\\n\\t _this.collapsed = true;\\n\\t }\\n\\t });\\n\\t var height = this.$el.offsetHeight;\\n\\t if (this.placement === 'top') {\\n\\t document.body.style.paddingTop = height + 'px';\\n\\t }\\n\\t if (this.placement === 'bottom') {\\n\\t document.body.style.paddingBottom = height + 'px';\\n\\t }\\n\\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\\\"collapse\\\"]', this.$el).on('click', function (e) {\\n\\t return _this.toggleCollapse(e);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t (0, _NodeList2.default)('.dropdown', this.$el).off('click').offBlur();\\n\\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\\\"collapse\\\"]', this.$el).off('click');\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 130 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('nav', {\\n\\t class: ['navbar', 'navbar-' + _vm.type, _vm.placement === 'static' ? 'navbar-static-top' : 'navbar-fixed-' + _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t class: _vm.container === 'fluid' ? 'container-fluid' : 'container'\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"navbar-header\\\"\\n\\t }, [(!_vm.$slots.collapse) ? _vm._c('button', {\\n\\t staticClass: \\\"navbar-toggle collapsed\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\",\\n\\t \\\"aria-expanded\\\": \\\"false\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggleCollapse\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"sr-only\\\"\\n\\t }, [_vm._v(\\\"Toggle navigation\\\")]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t })]) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"collapse\\\"), _vm._v(\\\" \\\"), _vm._t(\\\"brand\\\")], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t class: ['navbar-collapse', {\\n\\t collapse: _vm.collapsed\\n\\t }]\\n\\t }, [_vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2), _vm._v(\\\" \\\"), (_vm.$slots.left) ? _vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav navbar-left\\\"\\n\\t }, [_vm._t(\\\"left\\\")], 2) : _vm._e(), _vm._v(\\\" \\\"), (_vm.$slots.right) ? _vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav navbar-right\\\"\\n\\t }, [_vm._t(\\\"right\\\")], 2) : _vm._e()])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-38f0619e\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 131 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(132)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(133)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Option.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-42088116\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-42088116\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Option.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 132 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: { value: null },\\n\\t data: function data() {\\n\\t return { loading: true };\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this.$parent._select) {\\n\\t if (!this.$parent.options) {\\n\\t this.$parent.options = [];\\n\\t }\\n\\t var el = {};\\n\\t el[this.$parent.optionsLabel] = this.$el.innerHTML;\\n\\t el[this.$parent.optionsValue] = this.value;\\n\\t this.$parent.options.push(el);\\n\\t this.loading = false;\\n\\t } else {\\n\\t console.warn('options only work inside a select component');\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 133 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return (_vm.loading) ? _vm._c('li', [_vm._t(\\\"default\\\")], 2) : _vm._e()\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-42088116\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 134 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(135)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(137)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(138)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Panel.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-b1e0461a\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-b1e0461a\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Panel.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 135 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 137 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t header: { type: String },\\n\\t isOpen: { type: Boolean, default: null },\\n\\t type: { type: String, default: null }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t open: this.isOpen\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t isOpen: function isOpen(val) {\\n\\t this.open = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t inAccordion: function inAccordion() {\\n\\t return this.$parent && this.$parent._isAccordion;\\n\\t },\\n\\t panelType: function panelType() {\\n\\t return 'panel-' + (this.type || this.$parent && this.$parent.type || 'default');\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggle: function toggle() {\\n\\t this.open = !this.open;\\n\\t if (this.inAccordion) {\\n\\t this.$parent.openChild(this);\\n\\t }\\n\\t },\\n\\t enter: function enter(el) {\\n\\t el.style.height = 'auto';\\n\\t var endWidth = getComputedStyle(el).height;\\n\\t el.style.height = '0px';\\n\\t el.offsetHeight; // force repaint\\n\\t el.style.height = endWidth;\\n\\t },\\n\\t afterEnter: function afterEnter(el) {\\n\\t el.style.height = 'auto';\\n\\t },\\n\\t beforeLeave: function beforeLeave(el) {\\n\\t el.style.height = getComputedStyle(el).height;\\n\\t el.offsetHeight; // force repaint\\n\\t el.style.height = '0px';\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.isOpen === null) {\\n\\t this.open = !this.inAccordion;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 138 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['panel', _vm.panelType]\\n\\t }, [_vm._c('div', {\\n\\t class: ['panel-heading', {\\n\\t 'accordion-toggle': _vm.inAccordion\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.inAccordion && _vm.toggle()\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"header\\\", [_vm._c('h4', {\\n\\t staticClass: \\\"panel-title\\\"\\n\\t }, [_vm._v(_vm._s(_vm.header))])])], 2), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"collapse\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"enter\\\": _vm.enter,\\n\\t \\\"after-enter\\\": _vm.afterEnter,\\n\\t \\\"before-leave\\\": _vm.beforeLeave\\n\\t }\\n\\t }, [(_vm.open) ? _vm._c('div', {\\n\\t staticClass: \\\"panel-collapse\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"panel-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)]) : _vm._e()])], 1)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-b1e0461a\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 139 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(140)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(142)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(144)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Popover.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-2465bf54\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-2465bf54\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Popover.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 140 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 142 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _popoverMixins = __webpack_require__(143);\\n\\t\\n\\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t mixins: [_popoverMixins2.default],\\n\\t props: {\\n\\t trigger: { type: String, default: 'click' }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 143 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t content: { type: String },\\n\\t effect: { type: String, default: 'fade' },\\n\\t header: { type: Boolean, default: true },\\n\\t placement: { type: String, default: 'top' },\\n\\t title: { type: String },\\n\\t trigger: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t top: 0,\\n\\t left: 0,\\n\\t show: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t events: function events() {\\n\\t return { contextmenu: ['contextmenu'], hover: ['mouseleave', 'mouseenter'], focus: ['blur', 'focus'] }[this.trigger] || ['click'];\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t beforeEnter: function beforeEnter() {\\n\\t var _this = this;\\n\\t\\n\\t this.position();\\n\\t setTimeout(function () {\\n\\t return _this.position();\\n\\t }, 30);\\n\\t },\\n\\t position: function position() {\\n\\t var _this2 = this;\\n\\t\\n\\t this.$nextTick(function () {\\n\\t var popover = _this2.$refs.popover;\\n\\t var trigger = _this2.$refs.trigger.children[0];\\n\\t switch (_this2.placement) {\\n\\t case 'top':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\\n\\t _this2.top = trigger.offsetTop - popover.offsetHeight;\\n\\t break;\\n\\t case 'left':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\\n\\t break;\\n\\t case 'right':\\n\\t _this2.left = trigger.offsetLeft + trigger.offsetWidth;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\\n\\t break;\\n\\t case 'bottom':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight;\\n\\t break;\\n\\t default:\\n\\t console.warn('Wrong placement prop');\\n\\t }\\n\\t popover.style.top = _this2.top + 'px';\\n\\t popover.style.left = _this2.left + 'px';\\n\\t });\\n\\t },\\n\\t toggle: function toggle(e) {\\n\\t if (e && this.trigger === 'contextmenu') e.preventDefault();\\n\\t this.show = !this.show;\\n\\t if (this.show) this.beforeEnter();\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this3 = this;\\n\\t\\n\\t var trigger = this.$refs.trigger.children[0];\\n\\t if (!trigger) return console.error('Could not find trigger v-el in your component that uses popoverMixin.');\\n\\t\\n\\t if (this.trigger === 'focus' && !~trigger.tabIndex) {\\n\\t trigger = (0, _NodeList2.default)('a,input,select,textarea,button', trigger);\\n\\t if (!trigger.length) {\\n\\t return;\\n\\t }\\n\\t }\\n\\t this.events.forEach(function (event) {\\n\\t (0, _NodeList2.default)(trigger).on(event, _this3.toggle);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._trigger) (0, _NodeList2.default)(this._trigger).off();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 144 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', {\\n\\t ref: \\\"trigger\\\"\\n\\t }, [_vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.effect\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t ref: \\\"popover\\\",\\n\\t class: ['popover', _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"arrow\\\"\\n\\t }), _vm._v(\\\" \\\"), (_vm.title) ? _vm._c('h3', {\\n\\t staticClass: \\\"popover-title\\\"\\n\\t }, [_vm._t(\\\"title\\\", [_vm._v(_vm._s(_vm.title))])], 2) : _vm._e(), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"popover-content\\\"\\n\\t }, [_vm._t(\\\"content\\\", [_vm._c('span', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.content)\\n\\t }\\n\\t })])], 2)]) : _vm._e()])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-2465bf54\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 145 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(146)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(147)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Progressbar.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-68aa3375\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-68aa3375\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Progressbar.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 146 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t animated: { type: Boolean, default: false },\\n\\t label: { default: false },\\n\\t now: { required: true },\\n\\t striped: { type: Boolean, default: false },\\n\\t type: { type: String }\\n\\t },\\n\\t computed: {\\n\\t labelBool: function labelBool() {\\n\\t return _utils.coerce.boolean(this.label);\\n\\t },\\n\\t nowNum: function nowNum() {\\n\\t return _utils.coerce.number(this.now);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 147 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['progress-bar', 'progress-bar-' + _vm.type, {\\n\\t active: _vm.animated,\\n\\t 'progress-bar-striped': _vm.striped\\n\\t }],\\n\\t style: ({\\n\\t width: _vm.nowNum + '%'\\n\\t }),\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(_vm.labelBool ? _vm.nowNum + '%' : null)\\n\\t }\\n\\t })\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-68aa3375\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 148 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(149)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(151)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(152)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Radio.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-74cfd92c\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-74cfd92c\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Radio.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 149 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 151 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t button: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t name: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t selectedValue: { default: true },\\n\\t type: { type: String, default: null },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t check: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t return this.check === this.selectedValue;\\n\\t },\\n\\t inGroup: function inGroup() {\\n\\t return this.$parent && this.$parent.btnGroup && !this.$parent._checkboxGroup;\\n\\t },\\n\\t parentValue: function parentValue() {\\n\\t return this.$parent.val;\\n\\t },\\n\\t buttonStyle: function buttonStyle() {\\n\\t return this.button || this.$parent && this.$parent.btnGroup && this.$parent.buttons;\\n\\t },\\n\\t typeColor: function typeColor() {\\n\\t return this.type || this.$parent && this.$parent.type || 'default';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t check: function check(val) {\\n\\t if (this.selectedValue === val) {\\n\\t this.$emit('input', val);\\n\\t this.$emit('checked', true);\\n\\t this.updateParent();\\n\\t }\\n\\t },\\n\\t parentValue: function parentValue(val) {\\n\\t this.updateFromParent();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.selectedValue == val) {\\n\\t this.check = val;\\n\\t } else {\\n\\t this.check = false;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.inGroup) {\\n\\t var parent = this.$parent;\\n\\t parent._radioGroup = true;\\n\\t this.updateFromParent();\\n\\t }\\n\\t },\\n\\t\\n\\t methods: {\\n\\t updateFromParent: function updateFromParent() {\\n\\t if (this.inGroup) {\\n\\t if (this.selectedValue == this.$parent.val) {\\n\\t this.check = this.selectedValue;\\n\\t } else {\\n\\t this.check = false;\\n\\t }\\n\\t }\\n\\t },\\n\\t updateParent: function updateParent() {\\n\\t if (this.inGroup) {\\n\\t if (this.selectedValue === this.check) {\\n\\t this.$parent.val = this.selectedValue;\\n\\t }\\n\\t }\\n\\t },\\n\\t focus: function focus() {\\n\\t this.$refs.input.focus();\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled) {\\n\\t return;\\n\\t }\\n\\t this.focus();\\n\\t if (this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.check = this.selectedValue;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 152 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.buttonStyle ? 'label' : 'div', {\\n\\t tag: \\\"div\\\",\\n\\t class: [(_vm.buttonStyle ? 'btn btn-' + _vm.typeColor : 'radio ' + _vm.typeColor), {\\n\\t active: _vm.active,\\n\\t disabled: _vm.disabled,\\n\\t readonly: _vm.readonly\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [(_vm.buttonStyle) ? [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (!_vm.readonly),\\n\\t expression: \\\"!readonly\\\"\\n\\t }, {\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.check),\\n\\t expression: \\\"check\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"radio\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.selectedValue,\\n\\t \\\"checked\\\": _vm._q(_vm.check, _vm.selectedValue)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.check = _vm.selectedValue\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")] : _vm._c('label', {\\n\\t staticClass: \\\"open\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.check),\\n\\t expression: \\\"check\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"radio\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.selectedValue,\\n\\t \\\"checked\\\": _vm._q(_vm.check, _vm.selectedValue)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.check = _vm.selectedValue\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon dropdown-toggle\\\",\\n\\t class: [_vm.active ? 'btn-' + _vm.typeColor : '', {\\n\\t bg: _vm.typeColor === 'default'\\n\\t }]\\n\\t }), _vm._v(\\\" \\\"), (_vm.active && _vm.typeColor === 'default') ? _vm._c('span', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")], 2)], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-74cfd92c\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 153 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(154)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(156)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(157)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Select.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-e514dbc6\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-e514dbc6\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-e514dbc6\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Select.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 154 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 156 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _ClickOutside = __webpack_require__(66);\\n\\t\\n\\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\tvar timeout = {};\\n\\texports.default = {\\n\\t directives: {\\n\\t ClickOutside: _ClickOutside2.default\\n\\t },\\n\\t props: {\\n\\t clearButton: { type: Boolean, default: false },\\n\\t closeOnSelect: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t limit: { type: Number, default: 1024 },\\n\\t minSearch: { type: Number, default: 0 },\\n\\t multiple: { type: Boolean, default: false },\\n\\t name: { type: String, default: null },\\n\\t options: { type: Array, default: function _default() {\\n\\t return [];\\n\\t }\\n\\t },\\n\\t optionsLabel: { type: String, default: 'label' },\\n\\t optionsValue: { type: String, default: 'value' },\\n\\t parent: { default: true },\\n\\t placeholder: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: null },\\n\\t required: { type: Boolean, default: null },\\n\\t search: { type: Boolean, default: false },\\n\\t searchText: { type: String, default: null },\\n\\t countText: { type: String, default: null },\\n\\t showCount: { type: Boolean, default: false },\\n\\t url: { type: String, default: null },\\n\\t value: null\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t list: [],\\n\\t loading: null,\\n\\t searchValue: null,\\n\\t show: false,\\n\\t notify: false,\\n\\t val: null,\\n\\t valid: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t canSearch: function canSearch() {\\n\\t return this.minSearch ? this.list.length >= this.minSearch : this.search;\\n\\t },\\n\\t classes: function classes() {\\n\\t return [{ open: this.show, disabled: this.disabled }, this.class, this.isLi ? 'dropdown' : this.inInput ? 'input-group-btn' : 'btn-group'];\\n\\t },\\n\\t filteredOptions: function filteredOptions() {\\n\\t var _this = this;\\n\\t\\n\\t var search = (this.searchValue || '').toLowerCase();\\n\\t return !search ? this.list : this.list.filter(function (el) {\\n\\t return ~el[_this.optionsLabel].toLowerCase().search(search);\\n\\t });\\n\\t },\\n\\t hasParent: function hasParent() {\\n\\t return this.parent instanceof Array ? this.parent.length : this.parent;\\n\\t },\\n\\t inInput: function inInput() {\\n\\t return this.$parent._input;\\n\\t },\\n\\t isLi: function isLi() {\\n\\t return this.$parent._navbar || this.$parent.menu || this.$parent._tabset;\\n\\t },\\n\\t limitText: function limitText() {\\n\\t return this.text.limit.replace('{{limit}}', this.limit);\\n\\t },\\n\\t selected: function selected() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this.list.length === 0) {\\n\\t return '';\\n\\t }\\n\\t var sel = this.values.map(function (val) {\\n\\t return (_this2.list.find(function (o) {\\n\\t return o[_this2.optionsValue] === val;\\n\\t }) || {})[_this2.optionsLabel];\\n\\t }).filter(function (val) {\\n\\t return val !== undefined;\\n\\t });\\n\\t this.$emit('selected', sel);\\n\\t return sel.join(', ');\\n\\t },\\n\\t selectedText: function selectedText() {\\n\\t return this.countText || this.text.selected.replace('{{count}}', this.values.length);\\n\\t },\\n\\t showPlaceholder: function showPlaceholder() {\\n\\t return this.values.length === 0 || !this.hasParent ? this.placeholder || this.text.notSelected : null;\\n\\t },\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t values: function values() {\\n\\t return this.val instanceof Array ? this.val : ~[null, undefined].indexOf(this.val) ? [] : [this.val];\\n\\t },\\n\\t valOptions: function valOptions() {\\n\\t var _this3 = this;\\n\\t\\n\\t return this.list.map(function (el) {\\n\\t return el[_this3.optionsValue];\\n\\t });\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t options: function options(_options) {\\n\\t if (_options instanceof Array) this.setOptions(_options);\\n\\t },\\n\\t show: function show(val) {\\n\\t if (val) {\\n\\t this.$refs.search ? this.$refs.search.focus() : this.$refs.btn.focus();\\n\\t // onBlur(this.$refs.select, e => { this.show = false })\\n\\t } else {\\n\\t // offBlur(this.$refs.select)\\n\\t }\\n\\t },\\n\\t url: function url() {\\n\\t this.urlChanged();\\n\\t },\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this.val = val;\\n\\t }\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t var _this4 = this;\\n\\t\\n\\t if (_val === undefined) {\\n\\t this.val = _val = null;\\n\\t }\\n\\t if (_val !== old) {\\n\\t this.$emit('change', _val);\\n\\t this.$emit('input', _val);\\n\\t }\\n\\t if (_val instanceof Array && _val.length > this.limit) {\\n\\t this.val = _val.slice(0, this.limit);\\n\\t this.notify = true;\\n\\t if (timeout.limit) clearTimeout(timeout.limit);\\n\\t timeout.limit = setTimeout(function () {\\n\\t timeout.limit = false;\\n\\t _this4.notify = false;\\n\\t }, 1500);\\n\\t }\\n\\t this.valid = this.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t close: function close() {\\n\\t this.show = false;\\n\\t },\\n\\t checkData: function checkData() {\\n\\t if (this.multiple) {\\n\\t if (this.limit < 1) {\\n\\t this.limit = 1;\\n\\t }\\n\\t if (!(this.val instanceof Array)) {\\n\\t this.val = this.val === null || this.val === undefined ? [] : [this.val];\\n\\t }\\n\\t var values = this.valOptions;\\n\\t this.val = this.val.filter(function (el) {\\n\\t return ~values.indexOf(el);\\n\\t });\\n\\t if (this.values.length > this.limit) {\\n\\t this.val = this.val.slice(0, this.limit);\\n\\t }\\n\\t } else {\\n\\t if (!~this.valOptions.indexOf(this.val)) {\\n\\t this.val = null;\\n\\t }\\n\\t }\\n\\t },\\n\\t clear: function clear() {\\n\\t if (this.disabled || this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.val = this.val instanceof Array ? [] : null;\\n\\t this.toggle();\\n\\t },\\n\\t clearSearch: function clearSearch() {\\n\\t this.searchValue = '';\\n\\t this.$refs.search.focus();\\n\\t },\\n\\t isSelected: function isSelected(v) {\\n\\t return this.values.indexOf(v) > -1;\\n\\t },\\n\\t select: function select(v) {\\n\\t if (this.val instanceof Array) {\\n\\t var newVal = this.val.slice(0);\\n\\t if (~newVal.indexOf(v)) {\\n\\t newVal.splice(newVal.indexOf(v), 1);\\n\\t } else {\\n\\t newVal.push(v);\\n\\t }\\n\\t this.val = newVal;\\n\\t if (this.closeOnSelect) {\\n\\t this.toggle();\\n\\t }\\n\\t } else {\\n\\t this.val = v;\\n\\t this.toggle();\\n\\t }\\n\\t },\\n\\t setOptions: function setOptions(options) {\\n\\t var _this5 = this;\\n\\t\\n\\t this.list = options.map(function (el) {\\n\\t if (el instanceof Object) {\\n\\t return el;\\n\\t }\\n\\t var obj = {};\\n\\t obj[_this5.optionsLabel] = el;\\n\\t obj[_this5.optionsValue] = el;\\n\\t return obj;\\n\\t });\\n\\t this.$emit('options', this.list);\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled && !this.show) return;\\n\\t this.show = !this.show;\\n\\t if (!this.show) this.$refs.btn.focus();\\n\\t },\\n\\t urlChanged: function urlChanged() {\\n\\t var _this6 = this;\\n\\t\\n\\t if (!this.url || !this.$http) {\\n\\t return;\\n\\t }\\n\\t this.loading = true;\\n\\t this.$http.get(this.url).then(function (response) {\\n\\t var data = response.data instanceof Array ? response.data : [];\\n\\t try {\\n\\t data = JSON.parse(data);\\n\\t } catch (e) {}\\n\\t _this6.setOptions(data);\\n\\t _this6.loading = false;\\n\\t _this6.checkData();\\n\\t }, function (response) {\\n\\t _this6.loading = false;\\n\\t });\\n\\t },\\n\\t validate: function validate() {\\n\\t return !this.required ? true : this.val instanceof Array ? this.val.length > 0 : this.val !== null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this.setOptions(this.options);\\n\\t this.val = this.value;\\n\\t this._select = true;\\n\\t if (this.val === undefined || !this.parent) {\\n\\t this.val = null;\\n\\t }\\n\\t if (!this.multiple && this.val instanceof Array) {\\n\\t this.val = this.val[0];\\n\\t }\\n\\t this.checkData();\\n\\t if (this.url) this.urlChanged();\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this._parent) this._parent.children.push(this);\\n\\t this.setOptions(this.options);\\n\\t this.val = this.value;\\n\\t this.checkData();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 157 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"click-outside\\\",\\n\\t rawName: \\\"v-click-outside\\\",\\n\\t value: (_vm.close),\\n\\t expression: \\\"close\\\"\\n\\t }],\\n\\t ref: \\\"select\\\",\\n\\t class: _vm.classes\\n\\t }, [_vm._c('div', {\\n\\t ref: \\\"btn\\\",\\n\\t staticClass: \\\"form-control dropdown-toggle\\\",\\n\\t attrs: {\\n\\t \\\"tabindex\\\": \\\"1\\\",\\n\\t \\\"disabled\\\": _vm.disabled || !_vm.hasParent,\\n\\t \\\"readonly\\\": _vm.readonly\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": function($event) {\\n\\t _vm.canSearch ? null : _vm.close()\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.toggle()\\n\\t },\\n\\t \\\"keydown\\\": [function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.close($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"space\\\", 32)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }]\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"btn-content\\\",\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.loading ? _vm.text.loading : _vm.showPlaceholder || (_vm.multiple && _vm.showCount ? _vm.selectedText : _vm.selected))\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.values.length) ? _vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.clear()\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")]) : _vm._e()]), _vm._v(\\\" \\\"), _vm._c('select', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"sel\\\",\\n\\t staticClass: \\\"secret\\\",\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"multiple\\\": _vm.multiple,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"change\\\": function($event) {\\n\\t _vm.val = Array.prototype.filter.call($event.target.options, function(o) {\\n\\t return o.selected\\n\\t }).map(function(o) {\\n\\t var val = \\\"_value\\\" in o ? o._value : o.value;\\n\\t return val\\n\\t })[0]\\n\\t }\\n\\t }\\n\\t }, [(_vm.required) ? _vm._c('option', {\\n\\t attrs: {\\n\\t \\\"value\\\": \\\"\\\"\\n\\t }\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._l((_vm.list), function(option) {\\n\\t return _vm._c('option', {\\n\\t domProps: {\\n\\t \\\"value\\\": option[_vm.optionsValue]\\n\\t }\\n\\t }, [_vm._v(_vm._s(option[_vm.optionsLabel]))])\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._c('ul', {\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, [(_vm.list.length) ? [(_vm.canSearch) ? _vm._c('li', {\\n\\t staticClass: \\\"bs-searchbox\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.searchValue),\\n\\t expression: \\\"searchValue\\\"\\n\\t }],\\n\\t ref: \\\"search\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"placeholder\\\": _vm.searchText || _vm.text.search,\\n\\t \\\"autocomplete\\\": \\\"off\\\"\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.searchValue)\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.close($event)\\n\\t },\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.searchValue = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.searchValue),\\n\\t expression: \\\"searchValue\\\"\\n\\t }],\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.clearSearch\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.required && !_vm.clearButton) ? _vm._c('li', [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.clear() && _vm.close()\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.placeholder || _vm.text.notSelected))])]) : _vm._e(), _vm._v(\\\" \\\"), _vm._l((_vm.filteredOptions), function(option) {\\n\\t return _vm._c('li', {\\n\\t attrs: {\\n\\t \\\"id\\\": option[_vm.optionsValue]\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(option[_vm.optionsValue])\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(option[_vm.optionsLabel])\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.isSelected(option[_vm.optionsValue])),\\n\\t expression: \\\"isSelected(option[optionsValue])\\\"\\n\\t }],\\n\\t staticClass: \\\"glyphicon glyphicon-ok check-mark\\\"\\n\\t })])])\\n\\t })] : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), (_vm.notify && !_vm.closeOnSelect) ? _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"fadein\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"notify in\\\"\\n\\t }, [_vm._v(_vm._s(_vm.limitText))])]) : _vm._e()], 2), _vm._v(\\\" \\\"), (_vm.notify && _vm.closeOnSelect) ? _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"fadein\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"notify out\\\"\\n\\t }, [_vm._c('div', [_vm._v(_vm._s(_vm.limitText))])])]) : _vm._e()], 1)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-e514dbc6\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 158 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(159)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(160)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Slider.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-32185b82\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-32185b82\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Slider.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 159 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t computed: {\\n\\t index: function index() {\\n\\t return this.$parent.$children.indexOf(this);\\n\\t },\\n\\t show: function show() {\\n\\t return this.$parent.index === this.index;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this.$parent.indicator_list) {\\n\\t this.$parent.indicator_list.push(this.index);\\n\\t }\\n\\t\\n\\t if (this.index === 0) {\\n\\t this.$el.classList.add('active');\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 160 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"item\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-32185b82\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 161 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(162)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(164)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(165)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Spinner.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-8b298e70\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-8b298e70\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Spinner.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 162 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 164 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar MIN_WAIT = 500; // in ms\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t fixed: { type: Boolean, default: false },\\n\\t global: { type: Boolean, default: false },\\n\\t size: { type: String, default: 'md' },\\n\\t text: { type: String, default: '' },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t active: this.value,\\n\\t locked: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t spinnerSize: function spinnerSize() {\\n\\t return 'spinner-' + (this.size ? this.size : 'sm');\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t active: function active(val, old) {\\n\\t if (val !== old) this.$emit('input', val);\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this[val ? 'show' : 'hide']();\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t hide: function hide() {\\n\\t var delay = 0;\\n\\t this.active = false;\\n\\t },\\n\\t show: function show(options) {\\n\\t if (options) {\\n\\t if (options.text) {\\n\\t this.text = options.text;\\n\\t }\\n\\t if (options.size) {\\n\\t this.size = options.size;\\n\\t }\\n\\t if (options.fixed) {\\n\\t this.fixed = options.fixed;\\n\\t }\\n\\t }\\n\\t // block scrolling when spinner is on\\n\\t this._body.style.overflowY = 'hidden';\\n\\t // activate spinner\\n\\t this._started = new Date();\\n\\t this.active = true;\\n\\t this.locked = true;\\n\\t this._unlock();\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._body = document.body;\\n\\t this._bodyOverflow = document.body.style.overflowY;\\n\\t this._unlock = (0, _utils.delayer)(function () {\\n\\t this.locked = false;\\n\\t this._body.style.overflowY = this._bodyOverflow;\\n\\t }, MIN_WAIT);\\n\\t if (this.global) {\\n\\t if (!this.$root._globalSpinner) {\\n\\t this.$root._globalSpinner = true;\\n\\t var self = this;\\n\\t this._global = {\\n\\t hide: function hide() {\\n\\t self.hide();\\n\\t },\\n\\t show: function show() {\\n\\t self.show();\\n\\t }\\n\\t };\\n\\t this.$root.$on('spinner::show', this._global.show);\\n\\t this.$root.$on('spinner::hide', this._global.hide);\\n\\t }\\n\\t }\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._global) {\\n\\t this.$root.$off('spinner::show', this._global.show);\\n\\t this.$root.$off('spinner::hide', this._global.hide);\\n\\t delete this.$root._globalSpinner;\\n\\t }\\n\\t clearTimeout(this._spinnerAnimation);\\n\\t this._body.style.overflowY = this._bodyOverflow;\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 165 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.active || _vm.locked),\\n\\t expression: \\\"active||locked\\\"\\n\\t }],\\n\\t class: ['spinner spinner-gritcode', _vm.spinnerSize, {\\n\\t 'spinner-fixed': _vm.fixed\\n\\t }]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"spinner-wrapper\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"spinner-circle\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"spinner-text\\\"\\n\\t }, [_vm._v(_vm._s(_vm.text))])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-8b298e70\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 166 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(167)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(168)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tab.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-0985e878\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-0985e878\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tab.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 167 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t header: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t fadein: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t var _this = this;\\n\\t\\n\\t var active = !this._tabs || this._tabs.show === this;\\n\\t this.fadein = false;\\n\\t if (active) {\\n\\t setTimeout(function () {\\n\\t _this.fadein = true;\\n\\t }, 0);\\n\\t }\\n\\t return active;\\n\\t },\\n\\t index: function index() {\\n\\t return this._tabs.tabs.indexOf(this);\\n\\t },\\n\\t transition: function transition() {\\n\\t return this._tabs ? this._tabs.effect : null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTab = true;\\n\\t var tabs = this;\\n\\t while (!this._tabs && tabs.$parent) {\\n\\t if (tabs._isTabGroup) {\\n\\t tabs.tabs.push(this);\\n\\t this._tabGroup = tabs;\\n\\t }\\n\\t if (tabs._isTabs) {\\n\\t tabs.tabs.push(this);\\n\\t this._tabs = tabs;\\n\\t if (!this._tabGroup) tabs.headers.push(this);\\n\\t }\\n\\t tabs = tabs.$parent;\\n\\t }\\n\\t if (!this._tabs) throw Error('tab depend on tabs.');\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this._tabGroup) {\\n\\t this._tabGroup.tabs = this._tabGroup.tabs.filter(function (el) {\\n\\t return el !== _this2;\\n\\t });\\n\\t }\\n\\t if (this._tabs) {\\n\\t this._tabs.tabs = this._tabs.tabs.filter(function (el) {\\n\\t return el !== _this2;\\n\\t });\\n\\t }\\n\\t if (this._tabs) {\\n\\t if (this._tabs.active === this.index) {\\n\\t this._tabs.index = 0;\\n\\t }\\n\\t if (this._ingroup) {\\n\\t var id = this.$parent.tabs.indexOf(this);\\n\\t if (~id) this.$parent.tabs.splice(id, 1);\\n\\t }\\n\\t }\\n\\t if (this._tabs) {\\n\\t var _id = this._tabs.tabs.indexOf(this);\\n\\t if (~_id) this._tabs.tabs.splice(_id, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 168 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t ref: \\\"panel\\\",\\n\\t class: ['tab-pane', {\\n\\t 'active fade': _vm.active,\\n\\t 'in': _vm.fadein\\n\\t }],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"tabpanel\\\"\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-0985e878\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 169 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(170)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(172)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(173)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\TabGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-55faf3cb\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-55faf3cb\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] TabGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 170 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 172 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t header: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t show: false,\\n\\t tabs: []\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t return ~this.tabs.indexOf(this._tabs.show);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t blur: function blur() {\\n\\t this.show = false;\\n\\t },\\n\\t toggle: function toggle() {\\n\\t this.show = !this.show;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTabGroup = true;\\n\\t if (this.$parent) {\\n\\t if (this.$parent._isTabGroup) throw Error('Can\\\\'t nest tab-groups.');\\n\\t if (!this.$parent._isTabs) throw Error('tab-group depend on tabs.');\\n\\t }\\n\\t this._tabs = this.$parent;\\n\\t this._tabs.headers.push(this);\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 173 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-55faf3cb\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 174 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(175)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(177)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(178)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tabs.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-70100ddf\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-70100ddf\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tabs.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 175 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 177 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _Dropdown = __webpack_require__(105);\\n\\t\\n\\tvar _Dropdown2 = _interopRequireDefault(_Dropdown);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t components: {\\n\\t dropdown: _Dropdown2.default\\n\\t },\\n\\t props: {\\n\\t // effect: {type: String, default: 'fadein'},\\n\\t justified: false,\\n\\t navStyle: { type: String, default: null },\\n\\t value: { type: Number, default: 0 }\\n\\t },\\n\\t data: function data() {\\n\\t var index = this.value || 0;\\n\\t return {\\n\\t index: index,\\n\\t headers: [],\\n\\t tabs: []\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t index: function index(val) {\\n\\t this.$emit('active', val);\\n\\t this.$emit('input', val);\\n\\t },\\n\\t value: function value(val) {\\n\\t this.index = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t navStyleClass: function navStyleClass() {\\n\\t return ['nav', ~['pills', 'stacked'].indexOf(this.navStyle) ? 'nav-' + this.navStyle : 'nav-tabs', {\\n\\t 'nav-justified': _utils.coerce.boolean(this.justified),\\n\\t 'nav-pills': this.navStyle === 'stacked'\\n\\t }];\\n\\t },\\n\\t show: function show() {\\n\\t return this.tabs[this.index] || this.tabs[0];\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t select: function select(tab) {\\n\\t if (!tab.disabled) {\\n\\t this.index = this.tabs.indexOf(tab);\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTabs = true;\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 178 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t attrs: {\\n\\t \\\"tabs\\\": \\\"\\\"\\n\\t }\\n\\t }, [_vm._c('ul', {\\n\\t class: _vm.navStyleClass,\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"tablist\\\"\\n\\t }\\n\\t }, [_vm._l((_vm.headers), function(header) {\\n\\t return [(header._isTab) ? _vm._c('li', {\\n\\t class: {\\n\\t active: header.active, disabled: header.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(header)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"header\\\", [_vm._c('a', {\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"#\\\"\\n\\t },\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(header.header)\\n\\t }\\n\\t })])], 2) : _vm._e(), _vm._v(\\\" \\\"), (header._isTabGroup) ? _vm._c('dropdown', {\\n\\t class: {\\n\\t active: header.active\\n\\t },\\n\\t attrs: {\\n\\t \\\"text\\\": header.header,\\n\\t \\\"disabled\\\": header.disabled\\n\\t }\\n\\t }, _vm._l((header.tabs), function(tab) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t disabled: tab.disabled\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"#\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(tab)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(tab.header))])])\\n\\t })) : _vm._e()]\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"tab-content\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-70100ddf\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 179 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(180)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(181)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\ToggleButton.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-f034a5f2\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-f034a5f2\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] ToggleButton.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 180 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { default: null },\\n\\t falseType: { default: null },\\n\\t name: null,\\n\\t readonly: { default: null },\\n\\t trueType: { default: 'primary' },\\n\\t value: false\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t active: _utils.coerce.boolean(this.value),\\n\\t types: {\\n\\t danger: 'btn-danger',\\n\\t info: 'btn-info',\\n\\t primary: 'btn-primary',\\n\\t success: 'btn-success',\\n\\t warning: 'btn-warning'\\n\\t }\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t active: function active(val, old) {\\n\\t if (val !== old) {\\n\\t this.$emit('changed', val);\\n\\t this.$emit(val ? 'enabled' : 'disabled');\\n\\t this.$emit('input', val);\\n\\t }\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this.active = _utils.coerce.boolean(this.value);\\n\\t }\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t boolDisabled: function boolDisabled() {\\n\\t return _utils.coerce.boolean(this.disabled);\\n\\t },\\n\\t boolReadonly: function boolReadonly() {\\n\\t return _utils.coerce.boolean(this.readonly);\\n\\t },\\n\\t type: function type() {\\n\\t return this.types[this.value ? this.trueType : this.falseType] || 'btn-default';\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggle: function toggle() {\\n\\t if (this.boolDisabled || this.boolReadonly) {\\n\\t return;\\n\\t }\\n\\t this.active = !this.active;\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 181 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('a', {\\n\\t class: ['btn', _vm.type, {\\n\\t readonly: _vm.boolReadonly\\n\\t }],\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"javascript:void(0)\\\",\\n\\t \\\"disabled\\\": _vm.boolDisabled\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggle\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t class: ['glyphicon', 'glyphicon-' + (_vm.value ? 'ok' : 'remove')]\\n\\t }), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), (_vm.name) ? _vm._c('input', {\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"hidden\\\",\\n\\t \\\"name\\\": _vm.name\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.active ? 1 : 0\\n\\t }\\n\\t }) : _vm._e()], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-f034a5f2\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 182 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(183)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(185)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(186)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tooltip.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-48fb51b2\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-48fb51b2\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tooltip.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 183 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 185 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _popoverMixins = __webpack_require__(143);\\n\\t\\n\\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t mixins: [_popoverMixins2.default],\\n\\t props: {\\n\\t effect: { type: String, default: 'scale' },\\n\\t trigger: { type: String, default: 'hover' }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 186 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', {\\n\\t ref: \\\"trigger\\\"\\n\\t }, [_vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.effect\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t ref: \\\"popover\\\",\\n\\t class: ['tooltip', _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"tooltip-arrow\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"tooltip-inner\\\"\\n\\t }, [_vm._t(\\\"content\\\", [_vm._c('div', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.content)\\n\\t }\\n\\t })])], 2)]) : _vm._e()])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-48fb51b2\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 187 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(188)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(190)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(206)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Typeahead.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-5b5f5e94\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-5b5f5e94\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Typeahead.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 188 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 190 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _typeof2 = __webpack_require__(191);\\n\\t\\n\\tvar _typeof3 = _interopRequireDefault(_typeof2);\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\tvar DELAY = 300; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t async: { type: String },\\n\\t data: { type: Array },\\n\\t delay: { type: Number, default: DELAY },\\n\\t asyncKey: { type: String, default: null },\\n\\t limit: { type: Number, default: 8 },\\n\\t matchCase: { type: Boolean, default: false },\\n\\t matchStart: { type: Boolean, default: false },\\n\\t onHit: {\\n\\t type: Function,\\n\\t default: function _default(item) {\\n\\t return item;\\n\\t }\\n\\t },\\n\\t placeholder: { type: String },\\n\\t template: { type: String },\\n\\t type: { type: String, default: 'text' },\\n\\t value: { type: String, default: '' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t asign: '',\\n\\t showDropdown: false,\\n\\t noResults: true,\\n\\t current: 0,\\n\\t items: [],\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t templateComp: function templateComp() {\\n\\t return {\\n\\t template: typeof this.template === 'string' ? '' + this.template + '' : '',\\n\\t props: { item: { default: null } }\\n\\t };\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t if (_val !== old && _val !== this.asign) this.__update();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t setItems: function setItems(data) {\\n\\t var _this = this;\\n\\t\\n\\t if (this.async) {\\n\\t this.items = this.asyncKey ? data[this.asyncKey] : data;\\n\\t this.items = this.items.slice(0, this.limit);\\n\\t } else {\\n\\t this.items = (data || []).filter(function (value) {\\n\\t if ((typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) === 'object') {\\n\\t return true;\\n\\t }\\n\\t value = _this.matchCase ? value : value.toLowerCase();\\n\\t var query = _this.matchCase ? _this.val : _this.val.toLowerCase();\\n\\t return _this.matchStart ? value.indexOf(query) === 0 : value.indexOf(query) !== -1;\\n\\t }).slice(0, this.limit);\\n\\t }\\n\\t this.showDropdown = this.items.length > 0;\\n\\t },\\n\\t setValue: function setValue(value) {\\n\\t this.asign = value;\\n\\t this.val = value;\\n\\t this.items = [];\\n\\t this.loading = false;\\n\\t this.showDropdown = false;\\n\\t },\\n\\t reset: function reset() {\\n\\t this.setValue(null);\\n\\t },\\n\\t setActive: function setActive(index) {\\n\\t this.current = index;\\n\\t },\\n\\t isActive: function isActive(index) {\\n\\t return this.current === index;\\n\\t },\\n\\t hit: function hit(e) {\\n\\t e.preventDefault();\\n\\t this.setValue(this.onHit(this.items[this.current], this));\\n\\t },\\n\\t up: function up() {\\n\\t if (this.current > 0) {\\n\\t this.current--;\\n\\t } else {\\n\\t this.current = this.items.length - 1;\\n\\t }\\n\\t },\\n\\t down: function down() {\\n\\t if (this.current < this.items.length - 1) {\\n\\t this.current++;\\n\\t } else {\\n\\t this.current = 0;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this.__update = (0, _utils.delayer)(function () {\\n\\t var _this2 = this;\\n\\t\\n\\t if (!this.val) {\\n\\t this.reset();\\n\\t return;\\n\\t }\\n\\t this.asign = '';\\n\\t if (this.async) {\\n\\t (0, _utils.getJSON)(this.async + this.val).then(function (data) {\\n\\t _this2.setItems(data);\\n\\t });\\n\\t } else if (this.data) {\\n\\t this.setItems(this.data);\\n\\t }\\n\\t }, 'delay', DELAY);\\n\\t this.__update();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 191 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t\\\"use strict\\\";\\n\\t\\n\\texports.__esModule = true;\\n\\t\\n\\tvar _iterator = __webpack_require__(20);\\n\\t\\n\\tvar _iterator2 = _interopRequireDefault(_iterator);\\n\\t\\n\\tvar _symbol = __webpack_require__(192);\\n\\t\\n\\tvar _symbol2 = _interopRequireDefault(_symbol);\\n\\t\\n\\tvar _typeof = typeof _symbol2.default === \\\"function\\\" && typeof _iterator2.default === \\\"symbol\\\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \\\"function\\\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \\\"symbol\\\" : typeof obj; };\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = typeof _symbol2.default === \\\"function\\\" && _typeof(_iterator2.default) === \\\"symbol\\\" ? function (obj) {\\n\\t return typeof obj === \\\"undefined\\\" ? \\\"undefined\\\" : _typeof(obj);\\n\\t} : function (obj) {\\n\\t return obj && typeof _symbol2.default === \\\"function\\\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \\\"symbol\\\" : typeof obj === \\\"undefined\\\" ? \\\"undefined\\\" : _typeof(obj);\\n\\t};\\n\\n/***/ },\\n/* 192 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports = { \\\"default\\\": __webpack_require__(193), __esModule: true };\\n\\n/***/ },\\n/* 193 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(194);\\n\\t__webpack_require__(203);\\n\\t__webpack_require__(204);\\n\\t__webpack_require__(205);\\n\\tmodule.exports = __webpack_require__(7).Symbol;\\n\\n/***/ },\\n/* 194 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t// ECMAScript 6 symbols shim\\n\\tvar global = __webpack_require__(6)\\n\\t , has = __webpack_require__(29)\\n\\t , DESCRIPTORS = __webpack_require__(15)\\n\\t , $export = __webpack_require__(5)\\n\\t , redefine = __webpack_require__(28)\\n\\t , META = __webpack_require__(195).KEY\\n\\t , $fails = __webpack_require__(16)\\n\\t , shared = __webpack_require__(43)\\n\\t , setToStringTag = __webpack_require__(47)\\n\\t , uid = __webpack_require__(44)\\n\\t , wks = __webpack_require__(48)\\n\\t , wksExt = __webpack_require__(55)\\n\\t , wksDefine = __webpack_require__(196)\\n\\t , keyOf = __webpack_require__(197)\\n\\t , enumKeys = __webpack_require__(198)\\n\\t , isArray = __webpack_require__(201)\\n\\t , anObject = __webpack_require__(12)\\n\\t , toIObject = __webpack_require__(36)\\n\\t , toPrimitive = __webpack_require__(18)\\n\\t , createDesc = __webpack_require__(19)\\n\\t , _create = __webpack_require__(32)\\n\\t , gOPNExt = __webpack_require__(60)\\n\\t , $GOPD = __webpack_require__(202)\\n\\t , $DP = __webpack_require__(11)\\n\\t , $keys = __webpack_require__(34)\\n\\t , gOPD = $GOPD.f\\n\\t , dP = $DP.f\\n\\t , gOPN = gOPNExt.f\\n\\t , $Symbol = global.Symbol\\n\\t , $JSON = global.JSON\\n\\t , _stringify = $JSON && $JSON.stringify\\n\\t , PROTOTYPE = 'prototype'\\n\\t , HIDDEN = wks('_hidden')\\n\\t , TO_PRIMITIVE = wks('toPrimitive')\\n\\t , isEnum = {}.propertyIsEnumerable\\n\\t , SymbolRegistry = shared('symbol-registry')\\n\\t , AllSymbols = shared('symbols')\\n\\t , OPSymbols = shared('op-symbols')\\n\\t , ObjectProto = Object[PROTOTYPE]\\n\\t , USE_NATIVE = typeof $Symbol == 'function'\\n\\t , QObject = global.QObject;\\n\\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\\n\\tvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\\n\\t\\n\\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\\n\\tvar setSymbolDesc = DESCRIPTORS && $fails(function(){\\n\\t return _create(dP({}, 'a', {\\n\\t get: function(){ return dP(this, 'a', {value: 7}).a; }\\n\\t })).a != 7;\\n\\t}) ? function(it, key, D){\\n\\t var protoDesc = gOPD(ObjectProto, key);\\n\\t if(protoDesc)delete ObjectProto[key];\\n\\t dP(it, key, D);\\n\\t if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\\n\\t} : dP;\\n\\t\\n\\tvar wrap = function(tag){\\n\\t var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\\n\\t sym._k = tag;\\n\\t return sym;\\n\\t};\\n\\t\\n\\tvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\\n\\t return typeof it == 'symbol';\\n\\t} : function(it){\\n\\t return it instanceof $Symbol;\\n\\t};\\n\\t\\n\\tvar $defineProperty = function defineProperty(it, key, D){\\n\\t if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\\n\\t anObject(it);\\n\\t key = toPrimitive(key, true);\\n\\t anObject(D);\\n\\t if(has(AllSymbols, key)){\\n\\t if(!D.enumerable){\\n\\t if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\\n\\t it[HIDDEN][key] = true;\\n\\t } else {\\n\\t if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\\n\\t D = _create(D, {enumerable: createDesc(0, false)});\\n\\t } return setSymbolDesc(it, key, D);\\n\\t } return dP(it, key, D);\\n\\t};\\n\\tvar $defineProperties = function defineProperties(it, P){\\n\\t anObject(it);\\n\\t var keys = enumKeys(P = toIObject(P))\\n\\t , i = 0\\n\\t , l = keys.length\\n\\t , key;\\n\\t while(l > i)$defineProperty(it, key = keys[i++], P[key]);\\n\\t return it;\\n\\t};\\n\\tvar $create = function create(it, P){\\n\\t return P === undefined ? _create(it) : $defineProperties(_create(it), P);\\n\\t};\\n\\tvar $propertyIsEnumerable = function propertyIsEnumerable(key){\\n\\t var E = isEnum.call(this, key = toPrimitive(key, true));\\n\\t if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\\n\\t return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\\n\\t};\\n\\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\\n\\t it = toIObject(it);\\n\\t key = toPrimitive(key, true);\\n\\t if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\\n\\t var D = gOPD(it, key);\\n\\t if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\\n\\t return D;\\n\\t};\\n\\tvar $getOwnPropertyNames = function getOwnPropertyNames(it){\\n\\t var names = gOPN(toIObject(it))\\n\\t , result = []\\n\\t , i = 0\\n\\t , key;\\n\\t while(names.length > i){\\n\\t if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\\n\\t } return result;\\n\\t};\\n\\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\\n\\t var IS_OP = it === ObjectProto\\n\\t , names = gOPN(IS_OP ? OPSymbols : toIObject(it))\\n\\t , result = []\\n\\t , i = 0\\n\\t , key;\\n\\t while(names.length > i){\\n\\t if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\\n\\t } return result;\\n\\t};\\n\\t\\n\\t// 19.4.1.1 Symbol([description])\\n\\tif(!USE_NATIVE){\\n\\t $Symbol = function Symbol(){\\n\\t if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\\n\\t var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\\n\\t var $set = function(value){\\n\\t if(this === ObjectProto)$set.call(OPSymbols, value);\\n\\t if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\\n\\t setSymbolDesc(this, tag, createDesc(1, value));\\n\\t };\\n\\t if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\\n\\t return wrap(tag);\\n\\t };\\n\\t redefine($Symbol[PROTOTYPE], 'toString', function toString(){\\n\\t return this._k;\\n\\t });\\n\\t\\n\\t $GOPD.f = $getOwnPropertyDescriptor;\\n\\t $DP.f = $defineProperty;\\n\\t __webpack_require__(61).f = gOPNExt.f = $getOwnPropertyNames;\\n\\t __webpack_require__(200).f = $propertyIsEnumerable;\\n\\t __webpack_require__(199).f = $getOwnPropertySymbols;\\n\\t\\n\\t if(DESCRIPTORS && !__webpack_require__(27)){\\n\\t redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\\n\\t }\\n\\t\\n\\t wksExt.f = function(name){\\n\\t return wrap(wks(name));\\n\\t }\\n\\t}\\n\\t\\n\\t$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\\n\\t\\n\\tfor(var symbols = (\\n\\t // 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\\t 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\\n\\t).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\\n\\t\\n\\tfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\\n\\t\\n\\t$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\\n\\t // 19.4.2.1 Symbol.for(key)\\n\\t 'for': function(key){\\n\\t return has(SymbolRegistry, key += '')\\n\\t ? SymbolRegistry[key]\\n\\t : SymbolRegistry[key] = $Symbol(key);\\n\\t },\\n\\t // 19.4.2.5 Symbol.keyFor(sym)\\n\\t keyFor: function keyFor(key){\\n\\t if(isSymbol(key))return keyOf(SymbolRegistry, key);\\n\\t throw TypeError(key + ' is not a symbol!');\\n\\t },\\n\\t useSetter: function(){ setter = true; },\\n\\t useSimple: function(){ setter = false; }\\n\\t});\\n\\t\\n\\t$export($export.S + $export.F * !USE_NATIVE, 'Object', {\\n\\t // 19.1.2.2 Object.create(O [, Properties])\\n\\t create: $create,\\n\\t // 19.1.2.4 Object.defineProperty(O, P, Attributes)\\n\\t defineProperty: $defineProperty,\\n\\t // 19.1.2.3 Object.defineProperties(O, Properties)\\n\\t defineProperties: $defineProperties,\\n\\t // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\\n\\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\\n\\t // 19.1.2.7 Object.getOwnPropertyNames(O)\\n\\t getOwnPropertyNames: $getOwnPropertyNames,\\n\\t // 19.1.2.8 Object.getOwnPropertySymbols(O)\\n\\t getOwnPropertySymbols: $getOwnPropertySymbols\\n\\t});\\n\\t\\n\\t// 24.3.2 JSON.stringify(value [, replacer [, space]])\\n\\t$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\\n\\t var S = $Symbol();\\n\\t // MS Edge converts symbol values to JSON as {}\\n\\t // WebKit converts symbol values to JSON as null\\n\\t // V8 throws on boxed symbols\\n\\t return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\\n\\t})), 'JSON', {\\n\\t stringify: function stringify(it){\\n\\t if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\\n\\t var args = [it]\\n\\t , i = 1\\n\\t , replacer, $replacer;\\n\\t while(arguments.length > i)args.push(arguments[i++]);\\n\\t replacer = args[1];\\n\\t if(typeof replacer == 'function')$replacer = replacer;\\n\\t if($replacer || !isArray(replacer))replacer = function(key, value){\\n\\t if($replacer)value = $replacer.call(this, key, value);\\n\\t if(!isSymbol(value))return value;\\n\\t };\\n\\t args[1] = replacer;\\n\\t return _stringify.apply($JSON, args);\\n\\t }\\n\\t});\\n\\t\\n\\t// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\\n\\t$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\\n\\t// 19.4.3.5 Symbol.prototype[@@toStringTag]\\n\\tsetToStringTag($Symbol, 'Symbol');\\n\\t// 20.2.1.9 Math[@@toStringTag]\\n\\tsetToStringTag(Math, 'Math', true);\\n\\t// 24.3.3 JSON[@@toStringTag]\\n\\tsetToStringTag(global.JSON, 'JSON', true);\\n\\n/***/ },\\n/* 195 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar META = __webpack_require__(44)('meta')\\n\\t , isObject = __webpack_require__(13)\\n\\t , has = __webpack_require__(29)\\n\\t , setDesc = __webpack_require__(11).f\\n\\t , id = 0;\\n\\tvar isExtensible = Object.isExtensible || function(){\\n\\t return true;\\n\\t};\\n\\tvar FREEZE = !__webpack_require__(16)(function(){\\n\\t return isExtensible(Object.preventExtensions({}));\\n\\t});\\n\\tvar setMeta = function(it){\\n\\t setDesc(it, META, {value: {\\n\\t i: 'O' + ++id, // object ID\\n\\t w: {} // weak collections IDs\\n\\t }});\\n\\t};\\n\\tvar fastKey = function(it, create){\\n\\t // return primitive with prefix\\n\\t if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\\n\\t if(!has(it, META)){\\n\\t // can't set metadata to uncaught frozen object\\n\\t if(!isExtensible(it))return 'F';\\n\\t // not necessary to add metadata\\n\\t if(!create)return 'E';\\n\\t // add missing metadata\\n\\t setMeta(it);\\n\\t // return object ID\\n\\t } return it[META].i;\\n\\t};\\n\\tvar getWeak = function(it, create){\\n\\t if(!has(it, META)){\\n\\t // can't set metadata to uncaught frozen object\\n\\t if(!isExtensible(it))return true;\\n\\t // not necessary to add metadata\\n\\t if(!create)return false;\\n\\t // add missing metadata\\n\\t setMeta(it);\\n\\t // return hash weak collections IDs\\n\\t } return it[META].w;\\n\\t};\\n\\t// add metadata on freeze-family methods calling\\n\\tvar onFreeze = function(it){\\n\\t if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);\\n\\t return it;\\n\\t};\\n\\tvar meta = module.exports = {\\n\\t KEY: META,\\n\\t NEED: false,\\n\\t fastKey: fastKey,\\n\\t getWeak: getWeak,\\n\\t onFreeze: onFreeze\\n\\t};\\n\\n/***/ },\\n/* 196 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar global = __webpack_require__(6)\\n\\t , core = __webpack_require__(7)\\n\\t , LIBRARY = __webpack_require__(27)\\n\\t , wksExt = __webpack_require__(55)\\n\\t , defineProperty = __webpack_require__(11).f;\\n\\tmodule.exports = function(name){\\n\\t var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\\n\\t if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\\n\\t};\\n\\n/***/ },\\n/* 197 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar getKeys = __webpack_require__(34)\\n\\t , toIObject = __webpack_require__(36);\\n\\tmodule.exports = function(object, el){\\n\\t var O = toIObject(object)\\n\\t , keys = getKeys(O)\\n\\t , length = keys.length\\n\\t , index = 0\\n\\t , key;\\n\\t while(length > index)if(O[key = keys[index++]] === el)return key;\\n\\t};\\n\\n/***/ },\\n/* 198 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// all enumerable object keys, includes symbols\\n\\tvar getKeys = __webpack_require__(34)\\n\\t , gOPS = __webpack_require__(199)\\n\\t , pIE = __webpack_require__(200);\\n\\tmodule.exports = function(it){\\n\\t var result = getKeys(it)\\n\\t , getSymbols = gOPS.f;\\n\\t if(getSymbols){\\n\\t var symbols = getSymbols(it)\\n\\t , isEnum = pIE.f\\n\\t , i = 0\\n\\t , key;\\n\\t while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\\n\\t } return result;\\n\\t};\\n\\n/***/ },\\n/* 199 */\\n/***/ function(module, exports) {\\n\\n\\texports.f = Object.getOwnPropertySymbols;\\n\\n/***/ },\\n/* 200 */\\n/***/ function(module, exports) {\\n\\n\\texports.f = {}.propertyIsEnumerable;\\n\\n/***/ },\\n/* 201 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 7.2.2 IsArray(argument)\\n\\tvar cof = __webpack_require__(38);\\n\\tmodule.exports = Array.isArray || function isArray(arg){\\n\\t return cof(arg) == 'Array';\\n\\t};\\n\\n/***/ },\\n/* 202 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar pIE = __webpack_require__(200)\\n\\t , createDesc = __webpack_require__(19)\\n\\t , toIObject = __webpack_require__(36)\\n\\t , toPrimitive = __webpack_require__(18)\\n\\t , has = __webpack_require__(29)\\n\\t , IE8_DOM_DEFINE = __webpack_require__(14)\\n\\t , gOPD = Object.getOwnPropertyDescriptor;\\n\\t\\n\\texports.f = __webpack_require__(15) ? gOPD : function getOwnPropertyDescriptor(O, P){\\n\\t O = toIObject(O);\\n\\t P = toPrimitive(P, true);\\n\\t if(IE8_DOM_DEFINE)try {\\n\\t return gOPD(O, P);\\n\\t } catch(e){ /* empty */ }\\n\\t if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\\n\\t};\\n\\n/***/ },\\n/* 203 */\\n/***/ function(module, exports) {\\n\\n\\n\\n/***/ },\\n/* 204 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(196)('asyncIterator');\\n\\n/***/ },\\n/* 205 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(196)('observable');\\n\\n/***/ },\\n/* 206 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: {\\n\\t open: _vm.showDropdown\\n\\t },\\n\\t staticStyle: {\\n\\t \\\"position\\\": \\\"relative\\\"\\n\\t }\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"type\\\": _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": function($event) {\\n\\t _vm.showDropdown = false\\n\\t },\\n\\t \\\"keydown\\\": [function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"down\\\", 40)) { return; }\\n\\t $event.preventDefault();\\n\\t _vm.down($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.hit($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.reset($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"up\\\", 38)) { return; }\\n\\t $event.preventDefault();\\n\\t _vm.up($event)\\n\\t }],\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('ul', {\\n\\t ref: \\\"dropdown\\\",\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, _vm._l((_vm.items), function(item, i) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t active: _vm.isActive(i)\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.hit($event)\\n\\t },\\n\\t \\\"mousemove\\\": function($event) {\\n\\t _vm.setActive(i)\\n\\t }\\n\\t }\\n\\t }, [_vm._c(_vm.templateComp, {\\n\\t tag: \\\"component\\\",\\n\\t attrs: {\\n\\t \\\"item\\\": item\\n\\t }\\n\\t })], 1)])\\n\\t }))])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-5b5f5e94\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ }\\n/******/ ])\\n});\\n;\\n//# sourceMappingURL=vue-strap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3Z1ZS1zdHJhcC9kaXN0L3Z1ZS1zdHJhcC5qcz9lMTQ3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogdnVlLXN0cmFwIDIuMC4yXG4gKiBodHRwOi8vd2ZmcmFuY28uZ2l0aHViLmlvL3Z1ZS1zdHJhcC9cbiAqIENvbXBpbGVkIHVzaW5nIFZ1ZSAyLjEuMTBcbiAqL1xuKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiVnVlU3RyYXBcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiVnVlU3RyYXBcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdHZhciBfU2Nyb2xsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OCk7XG5cdFxuXHR2YXIgX1Njcm9sbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TY3JvbGwpO1xuXHRcblx0dmFyIF9BY2NvcmRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5KTtcblx0XG5cdHZhciBfQWNjb3JkaW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FjY29yZGlvbik7XG5cdFxuXHR2YXIgX0FmZml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Mik7XG5cdFxuXHR2YXIgX0FmZml4MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FmZml4KTtcblx0XG5cdHZhciBfQWxlcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1KTtcblx0XG5cdHZhciBfQWxlcnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQWxlcnQpO1xuXHRcblx0dmFyIF9Bc2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oODIpO1xuXHRcblx0dmFyIF9Bc2lkZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Bc2lkZSk7XG5cdFxuXHR2YXIgX0J1dHRvbkdyb3VwID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4Nyk7XG5cdFxuXHR2YXIgX0J1dHRvbkdyb3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0J1dHRvbkdyb3VwKTtcblx0XG5cdHZhciBfQ2Fyb3VzZWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwKTtcblx0XG5cdHZhciBfQ2Fyb3VzZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2Fyb3VzZWwpO1xuXHRcblx0dmFyIF9DaGVja2JveCA9IF9fd2VicGFja19yZXF1aXJlX18oOTUpO1xuXHRcblx0dmFyIF9DaGVja2JveDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DaGVja2JveCk7XG5cdFxuXHR2YXIgX0RhdGVwaWNrZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMCk7XG5cdFxuXHR2YXIgX0RhdGVwaWNrZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRGF0ZXBpY2tlcik7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDUpO1xuXHRcblx0dmFyIF9Ecm9wZG93bjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ecm9wZG93bik7XG5cdFxuXHR2YXIgX0Zvcm1Hcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTA4KTtcblx0XG5cdHZhciBfRm9ybUdyb3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1Hcm91cCk7XG5cdFxuXHR2YXIgX0Zvcm1WYWxpZGF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMSk7XG5cdFxuXHR2YXIgX0Zvcm1WYWxpZGF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRm9ybVZhbGlkYXRvcik7XG5cdFxuXHR2YXIgX0lucHV0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTQpO1xuXHRcblx0dmFyIF9JbnB1dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9JbnB1dCk7XG5cdFxuXHR2YXIgX01vZGFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTkpO1xuXHRcblx0dmFyIF9Nb2RhbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbCk7XG5cdFxuXHR2YXIgX05hdmJhciA9IF9fd2VicGFja19yZXF1aXJlX18oMTI4KTtcblx0XG5cdHZhciBfTmF2YmFyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdmJhcik7XG5cdFxuXHR2YXIgX09wdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTMxKTtcblx0XG5cdHZhciBfT3B0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX09wdGlvbik7XG5cdFxuXHR2YXIgX1BhbmVsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzQpO1xuXHRcblx0dmFyIF9QYW5lbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QYW5lbCk7XG5cdFxuXHR2YXIgX1BvcG92ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzOSk7XG5cdFxuXHR2YXIgX1BvcG92ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUG9wb3Zlcik7XG5cdFxuXHR2YXIgX1Byb2dyZXNzYmFyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDUpO1xuXHRcblx0dmFyIF9Qcm9ncmVzc2JhcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qcm9ncmVzc2Jhcik7XG5cdFxuXHR2YXIgX1JhZGlvID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDgpO1xuXHRcblx0dmFyIF9SYWRpbzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9SYWRpbyk7XG5cdFxuXHR2YXIgX1NlbGVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUzKTtcblx0XG5cdHZhciBfU2VsZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NlbGVjdCk7XG5cdFxuXHR2YXIgX1NsaWRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTU4KTtcblx0XG5cdHZhciBfU2xpZGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NsaWRlcik7XG5cdFxuXHR2YXIgX1NwaW5uZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2MSk7XG5cdFxuXHR2YXIgX1NwaW5uZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU3Bpbm5lcik7XG5cdFxuXHR2YXIgX1RhYiA9IF9fd2VicGFja19yZXF1aXJlX18oMTY2KTtcblx0XG5cdHZhciBfVGFiMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYik7XG5cdFxuXHR2YXIgX1RhYkdyb3VwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjkpO1xuXHRcblx0dmFyIF9UYWJHcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJHcm91cCk7XG5cdFxuXHR2YXIgX1RhYnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NCk7XG5cdFxuXHR2YXIgX1RhYnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFicyk7XG5cdFxuXHR2YXIgX1RvZ2dsZUJ1dHRvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTc5KTtcblx0XG5cdHZhciBfVG9nZ2xlQnV0dG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RvZ2dsZUJ1dHRvbik7XG5cdFxuXHR2YXIgX1Rvb2x0aXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4Mik7XG5cdFxuXHR2YXIgX1Rvb2x0aXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVG9vbHRpcCk7XG5cdFxuXHR2YXIgX1R5cGVhaGVhZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTg3KTtcblx0XG5cdHZhciBfVHlwZWFoZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1R5cGVhaGVhZCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly8gQ29tcG9uZW50c1xuXHRcblx0Ly8gRGlyZWN0aXZlc1xuXHQvLyBVdGlsc1xuXHR2YXIgVnVlU3RyYXAgPSB7XG5cdCAgZGlyZWN0aXZlczoge1xuXHQgICAgQ2xpY2tPdXRzaWRlOiBfQ2xpY2tPdXRzaWRlMi5kZWZhdWx0LFxuXHQgICAgU2Nyb2xsOiBfU2Nyb2xsMi5kZWZhdWx0XG5cdCAgfSxcblx0ICB1dGlsczoge1xuXHQgICAgJDogX05vZGVMaXN0Mi5kZWZhdWx0LFxuXHQgICAgY29lcmNlOiBfdXRpbHMuY29lcmNlXG5cdCAgfSxcblx0ICAvL2NvbXBvbmVudHNcblx0ICBhY2NvcmRpb246IF9BY2NvcmRpb24yLmRlZmF1bHQsXG5cdCAgYWZmaXg6IF9BZmZpeDIuZGVmYXVsdCxcblx0ICBhbGVydDogX0FsZXJ0Mi5kZWZhdWx0LFxuXHQgIGFzaWRlOiBfQXNpZGUyLmRlZmF1bHQsXG5cdCAgYnV0dG9uR3JvdXA6IF9CdXR0b25Hcm91cDIuZGVmYXVsdCxcblx0ICBjYXJvdXNlbDogX0Nhcm91c2VsMi5kZWZhdWx0LFxuXHQgIGNoZWNrYm94OiBfQ2hlY2tib3gyLmRlZmF1bHQsXG5cdCAgZGF0ZXBpY2tlcjogX0RhdGVwaWNrZXIyLmRlZmF1bHQsXG5cdCAgZHJvcGRvd246IF9Ecm9wZG93bjIuZGVmYXVsdCxcblx0ICBmb3JtR3JvdXA6IF9Gb3JtR3JvdXAyLmRlZmF1bHQsXG5cdCAgZm9ybVZhbGlkYXRvcjogX0Zvcm1WYWxpZGF0b3IyLmRlZmF1bHQsXG5cdCAgaW5wdXQ6IF9JbnB1dDIuZGVmYXVsdCxcblx0ICBtb2RhbDogX01vZGFsMi5kZWZhdWx0LFxuXHQgIG5hdmJhcjogX05hdmJhcjIuZGVmYXVsdCxcblx0ICBvcHRpb246IF9PcHRpb24yLmRlZmF1bHQsXG5cdCAgcGFuZWw6IF9QYW5lbDIuZGVmYXVsdCxcblx0ICBwb3BvdmVyOiBfUG9wb3ZlcjIuZGVmYXVsdCxcblx0ICBwcm9ncmVzc2JhcjogX1Byb2dyZXNzYmFyMi5kZWZhdWx0LFxuXHQgIHJhZGlvOiBfUmFkaW8yLmRlZmF1bHQsXG5cdCAgc2VsZWN0OiBfU2VsZWN0Mi5kZWZhdWx0LFxuXHQgIHNsaWRlcjogX1NsaWRlcjIuZGVmYXVsdCxcblx0ICBzcGlubmVyOiBfU3Bpbm5lcjIuZGVmYXVsdCxcblx0ICB0YWI6IF9UYWIyLmRlZmF1bHQsXG5cdCAgdGFiR3JvdXA6IF9UYWJHcm91cDIuZGVmYXVsdCxcblx0ICB0YWJzOiBfVGFiczIuZGVmYXVsdCxcblx0ICB0b2dnbGVCdXR0b246IF9Ub2dnbGVCdXR0b24yLmRlZmF1bHQsXG5cdCAgdG9vbHRpcDogX1Rvb2x0aXAyLmRlZmF1bHQsXG5cdCAgdHlwZWFoZWFkOiBfVHlwZWFoZWFkMi5kZWZhdWx0XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IFZ1ZVN0cmFwO1xuXG4vKioqLyB9LFxuLyogMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXHRcblx0dmFyIF9pdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xuXHRcblx0dmFyIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvcik7XG5cdFxuXHR2YXIgX2dldE93blByb3BlcnR5TmFtZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2KTtcblx0XG5cdHZhciBfZ2V0T3duUHJvcGVydHlOYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRPd25Qcm9wZXJ0eU5hbWVzKTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Mik7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzMiA9IF9fd2VicGFja19yZXF1aXJlX18oNjMpO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdF9fd2VicGFja19yZXF1aXJlX18oNjQpO1xuXHRcblx0dmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cdHZhciBub2RlRXJyb3IgPSBuZXcgRXJyb3IoJ1Bhc3NlZCBhcmd1bWVudHMgbXVzdCBiZSBvZiBOb2RlJyk7XG5cdHZhciBibHVyRXZlbnQ7XG5cdHZhciBibHVyTGlzdCA9IFtdO1xuXHR2YXIgRXZlbnRzID0gW107XG5cdFxuXHRmdW5jdGlvbiBpc05vZGUodmFsKSB7XG5cdCAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHdpbmRvdy5Ob2RlO1xuXHR9XG5cdGZ1bmN0aW9uIGlzTm9kZUxpc3QodmFsKSB7XG5cdCAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHdpbmRvdy5Ob2RlTGlzdCB8fCB2YWwgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENvbGxlY3Rpb24gfHwgdmFsIGluc3RhbmNlb2YgQXJyYXk7XG5cdH1cblx0XG5cdHZhciBOb2RlTGlzdCA9IGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBOb2RlTGlzdChhcmdzKSB7XG5cdCAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBOb2RlTGlzdCk7XG5cdFxuXHQgICAgdmFyIG5vZGVzID0gYXJncztcblx0ICAgIGlmIChhcmdzWzBdID09PSB3aW5kb3cpIHtcblx0ICAgICAgbm9kZXMgPSBbd2luZG93XTtcblx0ICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgIG5vZGVzID0gKGFyZ3NbMV0gfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoYXJnc1swXSk7XG5cdCAgICAgIGlmIChhcmdzWzFdKSB7XG5cdCAgICAgICAgdGhpcy5vd25lciA9IGFyZ3NbMV07XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAoMCBpbiBhcmdzICYmICFpc05vZGUoYXJnc1swXSkgJiYgYXJnc1swXSAmJiAnbGVuZ3RoJyBpbiBhcmdzWzBdKSB7XG5cdCAgICAgIG5vZGVzID0gYXJnc1swXTtcblx0ICAgICAgaWYgKGFyZ3NbMV0pIHtcblx0ICAgICAgICB0aGlzLm93bmVyID0gYXJnc1sxXTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaWYgKG5vZGVzKSB7XG5cdCAgICAgIGZvciAodmFyIGkgaW4gbm9kZXMpIHtcblx0ICAgICAgICB0aGlzW2ldID0gbm9kZXNbaV07XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5sZW5ndGggPSBub2Rlcy5sZW5ndGg7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmxlbmd0aCA9IDA7XG5cdCAgICB9XG5cdCAgICB3aW5kb3cucHJ1ZWJhID0gdGhpcztcblx0ICB9XG5cdFxuXHQgICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKE5vZGVMaXN0LCBbe1xuXHQgICAga2V5OiAnY29uY2F0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjb25jYXQoKSB7XG5cdCAgICAgIHZhciBub2RlcyA9IEFycmF5UHJvdG8uc2xpY2UuY2FsbCh0aGlzKTtcblx0ICAgICAgZnVuY3Rpb24gZmxhdHRlbihhcnIpIHtcblx0ICAgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcnIsIGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGlzTm9kZShlbCkpIHtcblx0ICAgICAgICAgICAgaWYgKCF+bm9kZXMuaW5kZXhPZihlbCkpIG5vZGVzLnB1c2goZWwpO1xuXHQgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGVsKSkge1xuXHQgICAgICAgICAgICBmbGF0dGVuKGVsKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcblx0ICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcmdzLCBmdW5jdGlvbiAoYXJnKSB7XG5cdCAgICAgICAgaWYgKGlzTm9kZShhcmcpKSB7XG5cdCAgICAgICAgICBpZiAoIX5ub2Rlcy5pbmRleE9mKGFyZykpIG5vZGVzLnB1c2goYXJnKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZUxpc3QoYXJnKSkge1xuXHQgICAgICAgICAgZmxhdHRlbihhcmcpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aHJvdyBFcnJvcignQ29uY2F0IGFyZ3VtZW50cyBtdXN0IGJlIG9mIGEgTm9kZSwgTm9kZUxpc3QsIEhUTUxDb2xsZWN0aW9uLCBvciBBcnJheSBvZiAoTm9kZSwgTm9kZUxpc3QsIEhUTUxDb2xsZWN0aW9uLCBBcnJheSknKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZGVsZXRlJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKCkge1xuXHQgICAgICB2YXIgbm90UmVtb3ZlZCA9IGZsYXR0ZW4odGhpcykuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbC5yZW1vdmUpIHtcblx0ICAgICAgICAgIGVsLnJlbW92ZSgpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoZWwucGFyZW50Tm9kZSkge1xuXHQgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmIChub3RSZW1vdmVkLmxlbmd0aCkgY29uc29sZS53YXJuKCdOb2RlTGlzdDogU29tZSBub2RlcyBjb3VsZCBub3QgYmUgZGVsZXRlZC4nKTtcblx0ICAgICAgcmV0dXJuIG5vdFJlbW92ZWQ7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZWFjaCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZWFjaCgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcblx0ICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZmlsdGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmaWx0ZXIoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhBcnJheVByb3RvLmZpbHRlci5hcHBseSh0aGlzLCBhcmdzKSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZmluZCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZmluZChlbGVtZW50KSB7XG5cdCAgICAgIHZhciBub2RlcyA9IFtdO1xuXHQgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICBub2Rlcy5wdXNoKG5vZGUucXVlcnlTZWxlY3RvckFsbChlbGVtZW50KSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICBpZiAoaXNOb2RlKGVsZW1lbnQpKSBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICBpZiAobm9kZSAhPT0gZWxlbWVudCAmJiBub2RlLmNvbnRhaW5zKGVsZW1lbnQpKSBub2Rlcy5wdXNoKGVsZW1lbnQpO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKGlzTm9kZUxpc3QoZWxlbWVudCkpIHtcblx0ICAgICAgICB2YXIgZWxzID0gZmxhdHRlbihlbGVtZW50KTtcblx0ICAgICAgICBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICAgIGVscy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgICBpZiAobm9kZSAhPT0gZWwgJiYgbm9kZS5jb250YWlucyhlbCkpIG5vZGVzLnB1c2goZWwpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZsYXR0ZW4obm9kZXMsIHRoaXMub3duZXIpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZvckVhY2gnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2luY2x1ZGVzJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBpbmNsdWRlcyhlbGVtZW50LCBpbmRleCkge1xuXHQgICAgICByZXR1cm4gfnRoaXMuaW5kZXhPZihlbGVtZW50LCBpbmRleCk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnbWFwJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW41ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW41KSwgX2tleTUgPSAwOyBfa2V5NSA8IF9sZW41OyBfa2V5NSsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5NV0gPSBhcmd1bWVudHNbX2tleTVdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgbWFwcGVkID0gQXJyYXlQcm90by5tYXAuYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiBtYXBwZWQuc29tZShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gaXNOb2RlKGVsKSB8fCBpc05vZGVMaXN0KGVsKTtcblx0ICAgICAgfSkgPyBmbGF0dGVuKG1hcHBlZCwgdGhpcykgOiBtYXBwZWQ7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncGFyZW50Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKHRoaXMubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbC5wYXJlbnROb2RlO1xuXHQgICAgICB9KSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncG9wJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwb3AoYW1vdW50KSB7XG5cdCAgICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGFtb3VudCA9IDE7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIG5vZGVzID0gW107XG5cdCAgICAgIHZhciBwb3AgPSBBcnJheVByb3RvLnBvcC5iaW5kKHRoaXMpO1xuXHQgICAgICB3aGlsZSAoYW1vdW50LS0pIHtcblx0ICAgICAgICBub2Rlcy5wdXNoKHBvcCgpKTtcblx0ICAgICAgfXJldHVybiBOb2RlTGlzdEpTKG5vZGVzLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdwdXNoJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjYpLCBfa2V5NiA9IDA7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk2XSA9IGFyZ3VtZW50c1tfa2V5Nl07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyZ3MsIGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmcpKSB0aHJvdyBub2RlRXJyb3I7XG5cdCAgICAgICAgaWYgKCF+X3RoaXMuaW5kZXhPZihhcmcpKSBBcnJheVByb3RvLnB1c2guY2FsbChfdGhpcywgYXJnKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3NoaWZ0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzaGlmdChhbW91bnQpIHtcblx0ICAgICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XG5cdCAgICAgICAgYW1vdW50ID0gMTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgbm9kZXMgPSBbXTtcblx0ICAgICAgd2hpbGUgKGFtb3VudC0tKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChBcnJheVByb3RvLnNoaWZ0LmNhbGwodGhpcykpO1xuXHQgICAgICB9cmV0dXJuIG5vZGVzLmxlbmd0aCA9PSAxID8gbm9kZXNbMF0gOiBOb2RlTGlzdEpTKG5vZGVzLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzbGljZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2xpY2UoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW43ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW43KSwgX2tleTcgPSAwOyBfa2V5NyA8IF9sZW43OyBfa2V5NysrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5N10gPSBhcmd1bWVudHNbX2tleTddO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhBcnJheVByb3RvLnNsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzcGxpY2UnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNwbGljZSgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjggPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjgpLCBfa2V5OCA9IDA7IF9rZXk4IDwgX2xlbjg7IF9rZXk4KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk4XSA9IGFyZ3VtZW50c1tfa2V5OF07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIGkgPSAyLCBsID0gYXJncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmdzW2ldKSkgdGhyb3cgbm9kZUVycm9yO1xuXHQgICAgICB9XG5cdCAgICAgIEFycmF5UHJvdG8uc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICd1bnNoaWZ0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIHZhciB1bnNoaWZ0ID0gQXJyYXlQcm90by51bnNoaWZ0LmJpbmQodGhpcyk7XG5cdFxuXHQgICAgICBmb3IgKHZhciBfbGVuOSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuOSksIF9rZXk5ID0gMDsgX2tleTkgPCBfbGVuOTsgX2tleTkrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTldID0gYXJndW1lbnRzW19rZXk5XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJncywgZnVuY3Rpb24gKGFyZykge1xuXHQgICAgICAgIGlmICghaXNOb2RlKGFyZykpIHRocm93IG5vZGVFcnJvcjtcblx0ICAgICAgICBpZiAoIX5fdGhpczIuaW5kZXhPZihhcmcpKSB1bnNoaWZ0KGFyZyk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdhZGRDbGFzcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQ2xhc3MoY2xhc3Nlcykge1xuXHQgICAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCB0cnVlKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdyZW1vdmVDbGFzcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoY2xhc3Nlcykge1xuXHQgICAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCBmYWxzZSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAndG9nZ2xlQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuXHRcblx0ICAgICAgdmFyIG1ldGhvZCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyAndG9nZ2xlJyA6IHZhbHVlID8gJ2FkZCcgOiAncmVtb3ZlJztcblx0ICAgICAgaWYgKHR5cGVvZiBjbGFzc2VzID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgcmV0dXJuIGNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuXHQgICAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdFttZXRob2RdKGMpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdnZXQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGdldChwcm9wKSB7XG5cdCAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgZWwgPSBlbFtwcm9wXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXJyLnB1c2goZWwpO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIGZsYXR0ZW4oYXJyLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzZXQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNldChwcm9wLCB2YWx1ZSkge1xuXHQgICAgICBpZiAocHJvcC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGVsKSB7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wKSB7XG5cdCAgICAgICAgICAgICAgaWYgKGtleSBpbiBlbCkge1xuXHQgICAgICAgICAgICAgICAgZWxba2V5XSA9IHByb3Bba2V5XTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgICBpZiAocHJvcCBpbiBlbCkge1xuXHQgICAgICAgICAgICBlbFtwcm9wXSA9IHZhbHVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2NhbGwnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbGwoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4xMCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMTApLCBfa2V5MTAgPSAwOyBfa2V5MTAgPCBfbGVuMTA7IF9rZXkxMCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5MTBdID0gYXJndW1lbnRzW19rZXkxMF07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvLnNoaWZ0LmNhbGwoYXJncyk7XG5cdCAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgdmFyIHJldHVyblRoaXMgPSB0cnVlO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgaWYgKGVsICYmIGVsW21ldGhvZF0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgZWwgPSBlbFttZXRob2RdLmFwcGx5KGVsLCBhcmdzKTtcblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICAgIGlmIChyZXR1cm5UaGlzICYmIGVsICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuVGhpcyA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBhcnIucHVzaCh1bmRlZmluZWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiByZXR1cm5UaGlzID8gdGhpcyA6IGZsYXR0ZW4oYXJyLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdpdGVtJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBpdGVtKGluZGV4KSB7XG5cdCAgICAgIHJldHVybiBOb2RlTGlzdEpTKFt0aGlzW2luZGV4XV0sIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uJyxcblx0XG5cdFxuXHQgICAgLy8gZXZlbnQgaGFuZGxlcnNcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuXHQgICAgICBpZiAodHlwZW9mIGV2ZW50cyA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBldmVudHMgPSBldmVudHMudHJpbSgpLnJlcGxhY2UoL1xccysvLCAnICcpLnNwbGl0KCcgJyk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cdCAgICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgY2FsbGJhY2sgPSBzZWxlY3Rvcjtcblx0ICAgICAgICBzZWxlY3RvciA9IG51bGw7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuIHRoaXM7XG5cdCAgICAgIHZhciBmbiA9IGNhbGxiYWNrO1xuXHQgICAgICBjYWxsYmFjayA9IHNlbGVjdG9yID8gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICB2YXIgZWxzID0gTm9kZUxpc3RKUyhzZWxlY3RvciwgdGhpcyk7XG5cdCAgICAgICAgaWYgKCFlbHMubGVuZ3RoKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVscy5zb21lKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgdmFyIHRhcmdldCA9IGVsLmNvbnRhaW5zKGUudGFyZ2V0KTtcblx0ICAgICAgICAgIGlmICh0YXJnZXQpIGZuLmNhbGwoZWwsIGUsIGVsKTtcblx0ICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gOiBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgIGZuLmFwcGx5KHRoaXMsIFtlLCB0aGlzXSk7XG5cdCAgICAgIH07XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgIGlmIChlbCA9PT0gd2luZG93IHx8IGlzTm9kZShlbCkpIHtcblx0ICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgY2FsbGJhY2ssIGZhbHNlKTtcblx0ICAgICAgICAgICAgRXZlbnRzLnB1c2goe1xuXHQgICAgICAgICAgICAgIGVsOiBlbCxcblx0ICAgICAgICAgICAgICBldmVudDogZXZlbnQsXG5cdCAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb2ZmJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYoZXZlbnRzLCBjYWxsYmFjaykge1xuXHQgICAgICBpZiAoZXZlbnRzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICBjYWxsYmFjayA9IGV2ZW50cztcblx0ICAgICAgICBldmVudHMgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGV2ZW50cyA9IGV2ZW50cyBpbnN0YW5jZW9mIEFycmF5ID8gZXZlbnRzIDogdHlwZW9mIGV2ZW50cyA9PT0gJ3N0cmluZycgPyBldmVudHMudHJpbSgpLnJlcGxhY2UoL1xccysvLCAnICcpLnNwbGl0KCcgJykgOiBudWxsO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgRXZlbnRzID0gRXZlbnRzLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgaWYgKGUgJiYgZS5lbCA9PT0gZWwgJiYgKCFjYWxsYmFjayB8fCBjYWxsYmFjayA9PT0gZS5jYWxsYmFjaykgJiYgKCFldmVudHMgfHwgfmV2ZW50cy5pbmRleE9mKGUuZXZlbnQpKSkge1xuXHQgICAgICAgICAgICBlLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS5ldmVudCwgZS5jYWxsYmFjayk7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25CbHVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkJsdXIoY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cdCAgICAgIGlmICghY2FsbGJhY2spIHJldHVybiB0aGlzO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgYmx1ckxpc3QucHVzaCh7IGVsOiBlbCwgY2FsbGJhY2s6IGNhbGxiYWNrIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKCFibHVyRXZlbnQpIHtcblx0ICAgICAgICBibHVyRXZlbnQgPSBmdW5jdGlvbiBibHVyRXZlbnQoZSkge1xuXHQgICAgICAgICAgYmx1ckxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gaXRlbS5lbC5jb250YWlucyhlLnRhcmdldCkgfHwgaXRlbS5lbCA9PT0gZS50YXJnZXQ7XG5cdCAgICAgICAgICAgIGlmICghdGFyZ2V0KSBpdGVtLmNhbGxiYWNrLmNhbGwoaXRlbS5lbCwgZSwgaXRlbS5lbCk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYmx1ckV2ZW50LCBmYWxzZSk7XG5cdCAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJsdXJFdmVudCwgZmFsc2UpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29mZkJsdXInLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9mZkJsdXIoY2FsbGJhY2spIHtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGJsdXJMaXN0ID0gYmx1ckxpc3QuZmlsdGVyKGZ1bmN0aW9uIChibHVyKSB7XG5cdCAgICAgICAgICBpZiAoYmx1ciAmJiBibHVyLmVsID09PSBlbCAmJiAoIWNhbGxiYWNrIHx8IGJsdXIuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICByZXR1cm4gZWw7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdhc0FycmF5Jyxcblx0ICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgICByZXR1cm4gQXJyYXlQcm90by5zbGljZS5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHQgIH1dKTtcblx0ICByZXR1cm4gTm9kZUxpc3Q7XG5cdH0oKTtcblx0XG5cdHZhciBOTCA9IE5vZGVMaXN0LnByb3RvdHlwZTtcblx0XG5cdGZ1bmN0aW9uIGZsYXR0ZW4oYXJyLCBvd25lcikge1xuXHQgIHZhciBsaXN0ID0gW107XG5cdCAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJyLCBmdW5jdGlvbiAoZWwpIHtcblx0ICAgIGlmIChpc05vZGUoZWwpKSB7XG5cdCAgICAgIGlmICghfmxpc3QuaW5kZXhPZihlbCkpIGxpc3QucHVzaChlbCk7XG5cdCAgICB9IGVsc2UgaWYgKGlzTm9kZUxpc3QoZWwpKSB7XG5cdCAgICAgIGZvciAodmFyIGlkIGluIGVsKSB7XG5cdCAgICAgICAgaWYgKCF+bGlzdC5pbmRleE9mKGVsW2lkXSkpIGxpc3QucHVzaChlbFtpZF0pO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2UgaWYgKGVsICE9PSBudWxsKSB7XG5cdCAgICAgIGFyci5nZXQgPSBOTC5nZXQ7XG5cdCAgICAgIGFyci5zZXQgPSBOTC5zZXQ7XG5cdCAgICAgIGFyci5jYWxsID0gTkwuY2FsbDtcblx0ICAgICAgYXJyLm93bmVyID0gb3duZXI7XG5cdCAgICAgIHJldHVybiBhcnI7XG5cdCAgICB9XG5cdCAgfSk7XG5cdCAgcmV0dXJuIE5vZGVMaXN0SlMobGlzdCwgb3duZXIpO1xuXHR9XG5cdFxuXHR2YXIgZXhjZXB0aW9ucyA9IFsnam9pbicsICdjb3B5V2l0aGluJywgJ2ZpbGwnLCAnZmluZCcsICdmb3JFYWNoJ107XG5cdCgwLCBfZ2V0T3duUHJvcGVydHlOYW1lczIuZGVmYXVsdCkoQXJyYXlQcm90bykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdCAgaWYgKCF+ZXhjZXB0aW9ucy5pbmRleE9mKGtleSkgJiYgTkxba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICBOTFtrZXldID0gQXJyYXlQcm90b1trZXldO1xuXHQgIH1cblx0fSk7XG5cdGlmICh3aW5kb3cuU3ltYm9sICYmIF9pdGVyYXRvcjIuZGVmYXVsdCkge1xuXHQgIE5MW19pdGVyYXRvcjIuZGVmYXVsdF0gPSBOTC52YWx1ZXMgPSBBcnJheVByb3RvW19pdGVyYXRvcjIuZGVmYXVsdF07XG5cdH1cblx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRmdW5jdGlvbiBzZXR0ZXJHZXR0ZXIocHJvcCkge1xuXHQgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICBpZiAoTkxbcHJvcF0pIHJldHVybjtcblx0ICBpZiAoZGl2W3Byb3BdIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgIE5MW3Byb3BdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMTEgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjExKSwgX2tleTExID0gMDsgX2tleTExIDwgX2xlbjExOyBfa2V5MTErKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTExXSA9IGFyZ3VtZW50c1tfa2V5MTFdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHZhciByZXR1cm5UaGlzID0gdHJ1ZTtcblx0ICAgICAgZm9yICh2YXIgaSBpbiBOTCkge1xuXHQgICAgICAgIHZhciBlbCA9IE5MW2ldO1xuXHQgICAgICAgIGlmIChlbCAmJiBlbFtwcm9wXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICAgICAgICBlbCA9IGVsW3Byb3BdLmFwcGx5KGVsLCBhcmdzKTtcblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICAgIGlmIChyZXR1cm5UaGlzICYmIGVsICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuVGhpcyA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBhcnIucHVzaCh1bmRlZmluZWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gcmV0dXJuVGhpcyA/IF90aGlzMyA6IGZsYXR0ZW4oYXJyLCBfdGhpczMpO1xuXHQgICAgfTtcblx0ICB9IGVsc2Uge1xuXHQgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoTkwsIHByb3AsIHtcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICAgICAgdmFyIGFyciA9IFtdO1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICBlbCA9IGVsW3Byb3BdO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgYXJyLnB1c2goZWwpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGVsICYmIHByb3AgaW4gZWwpIHtcblx0ICAgICAgICAgICAgZWxbcHJvcF0gPSB2YWx1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgfVxuXHR9XG5cdGZvciAodmFyIHByb3AgaW4gZGl2KSB7XG5cdCAgc2V0dGVyR2V0dGVyKHByb3ApO1xuXHR9ZnVuY3Rpb24gTm9kZUxpc3RKUygpIHtcblx0ICBmb3IgKHZhciBfbGVuMTIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjEyKSwgX2tleTEyID0gMDsgX2tleTEyIDwgX2xlbjEyOyBfa2V5MTIrKykge1xuXHQgICAgYXJnc1tfa2V5MTJdID0gYXJndW1lbnRzW19rZXkxMl07XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gbmV3IE5vZGVMaXN0KGFyZ3MpO1xuXHR9XG5cdHdpbmRvdy5OTCA9IE5vZGVMaXN0SlM7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSBOb2RlTGlzdEpTO1xuXG4vKioqLyB9LFxuLyogMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgJE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNykuT2JqZWN0O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2Mpe1xuXHQgIHJldHVybiAkT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHQvLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuXHQkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSwgJ09iamVjdCcsIHtkZWZpbmVQcm9wZXJ0eTogX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZn0pO1xuXG4vKioqLyB9LFxuLyogNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGdsb2JhbCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIGNvcmUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIGN0eCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oOClcblx0ICAsIGhpZGUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblx0XG5cdHZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcblx0ICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuXHQgICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG5cdCAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcblx0ICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuXHQgICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG5cdCAgICAsIElTX1dSQVAgICA9IHR5cGUgJiAkZXhwb3J0Lldcblx0ICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcblx0ICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdXG5cdCAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV1cblx0ICAgICwga2V5LCBvd24sIG91dDtcblx0ICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcblx0ICBmb3Ioa2V5IGluIHNvdXJjZSl7XG5cdCAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcblx0ICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG5cdCAgICBpZihvd24gJiYga2V5IGluIGV4cG9ydHMpY29udGludWU7XG5cdCAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuXHQgICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcblx0ICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuXHQgICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cblx0ICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG5cdCAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuXHQgICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcblx0ICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24oQyl7XG5cdCAgICAgIHZhciBGID0gZnVuY3Rpb24oYSwgYiwgYyl7XG5cdCAgICAgICAgaWYodGhpcyBpbnN0YW5jZW9mIEMpe1xuXHQgICAgICAgICAgc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe1xuXHQgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQztcblx0ICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEMoYSk7XG5cdCAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuXHQgICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG5cdCAgICAgICAgfSByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICB9O1xuXHQgICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG5cdCAgICAgIHJldHVybiBGO1xuXHQgICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG5cdCAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG5cdCAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSVcblx0ICAgIGlmKElTX1BST1RPKXtcblx0ICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuXHQgICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuXHQgICAgICBpZih0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKWhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cdC8vIHR5cGUgYml0bWFwXG5cdCRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG5cdCRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG5cdCRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG5cdCRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cblx0JGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG5cdCRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuXHQkZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcblx0JGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgIFxuXHRtb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG5cbi8qKiovIH0sXG4vKiA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxuXHR2YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcblx0ICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdGlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbi8qKiovIH0sXG4vKiA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHR2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuXHRpZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuLyoqKi8gfSxcbi8qIDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xuXHR2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcblx0ICBhRnVuY3Rpb24oZm4pO1xuXHQgIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG5cdCAgc3dpdGNoKGxlbmd0aCl7XG5cdCAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcblx0ICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG5cdCAgICB9O1xuXHQgICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG5cdCAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuXHQgICAgfTtcblx0ICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuXHQgICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcblx0ICAgIH07XG5cdCAgfVxuXHQgIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcblx0ICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuXHQgIH07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZFAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCBjcmVhdGVEZXNjID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSkgPyBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuXHQgIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG5cdH0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuXHQgIG9iamVjdFtrZXldID0gdmFsdWU7XG5cdCAgcmV0dXJuIG9iamVjdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDExICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgYW5PYmplY3QgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuXHQgICwgSUU4X0RPTV9ERUZJTkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KVxuXHQgICwgdG9QcmltaXRpdmUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KVxuXHQgICwgZFAgICAgICAgICAgICAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdFxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuXHQgIGFuT2JqZWN0KE8pO1xuXHQgIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcblx0ICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcblx0ICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuXHQgICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuXHQgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblx0ICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcblx0ICBpZigndmFsdWUnIGluIEF0dHJpYnV0ZXMpT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG5cdCAgcmV0dXJuIE87XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gIV9fd2VicGFja19yZXF1aXJlX18oMTUpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KShmdW5jdGlvbigpe1xuXHQgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX3JlcXVpcmVfXygxNykoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDE1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5cdG1vZHVsZS5leHBvcnRzID0gIV9fd2VicGFja19yZXF1aXJlX18oMTYpKGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcblx0fSk7XG5cbi8qKiovIH0sXG4vKiAxNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcblx0ICB0cnkge1xuXHQgICAgcmV0dXJuICEhZXhlYygpO1xuXHQgIH0gY2F0Y2goZSl7XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMylcblx0ICAsIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5kb2N1bWVudFxuXHQgIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuXHQgICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHQvLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuXHQvLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBTKXtcblx0ICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcblx0ICB2YXIgZm4sIHZhbDtcblx0ICBpZihTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG5cdCAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG5cdCAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG5cdCAgcmV0dXJuIHtcblx0ICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcblx0ICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcblx0ICAgIHdyaXRhYmxlICAgIDogIShiaXRtYXAgJiA0KSxcblx0ICAgIHZhbHVlICAgICAgIDogdmFsdWVcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX193ZWJwYWNrX3JlcXVpcmVfXygyMSksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1MSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSkuZignaXRlcmF0b3InKTtcblxuLyoqKi8gfSxcbi8qIDIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciAkYXQgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMykodHJ1ZSk7XG5cdFxuXHQvLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5cdF9fd2VicGFja19yZXF1aXJlX18oMjYpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcblx0ICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG5cdCAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcblx0Ly8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxuXHR9LCBmdW5jdGlvbigpe1xuXHQgIHZhciBPICAgICA9IHRoaXMuX3Rcblx0ICAgICwgaW5kZXggPSB0aGlzLl9pXG5cdCAgICAsIHBvaW50O1xuXHQgIGlmKGluZGV4ID49IE8ubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG5cdCAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuXHQgIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuXHQgIHJldHVybiB7dmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZX07XG5cdH0pO1xuXG4vKioqLyB9LFxuLyogMjMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgZGVmaW5lZCAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cdC8vIHRydWUgIC0+IFN0cmluZyNhdFxuXHQvLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuXHQgIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuXHQgICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcblx0ICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcblx0ICAgICAgLCBsID0gcy5sZW5ndGhcblx0ICAgICAgLCBhLCBiO1xuXHQgICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcblx0ICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG5cdCAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuXHQgICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuXHQgICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIDcuMS40IFRvSW50ZWdlclxuXHR2YXIgY2VpbCAgPSBNYXRoLmNlaWxcblx0ICAsIGZsb29yID0gTWF0aC5mbG9vcjtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYoaXQgPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgTElCUkFSWSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KVxuXHQgICwgJGV4cG9ydCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCByZWRlZmluZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpXG5cdCAgLCBoaWRlICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBJdGVyYXRvcnMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzApXG5cdCAgLCAkaXRlckNyZWF0ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpXG5cdCAgLCBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpXG5cdCAgLCBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oNDkpXG5cdCAgLCBJVEVSQVRPUiAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpKCdpdGVyYXRvcicpXG5cdCAgLCBCVUdHWSAgICAgICAgICA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKSAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG5cdCAgLCBGRl9JVEVSQVRPUiAgICA9ICdAQGl0ZXJhdG9yJ1xuXHQgICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcblx0ICAsIFZBTFVFUyAgICAgICAgID0gJ3ZhbHVlcyc7XG5cdFxuXHR2YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpe1xuXHQgICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblx0ICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG5cdCAgICBpZighQlVHR1kgJiYga2luZCBpbiBwcm90bylyZXR1cm4gcHJvdG9ba2luZF07XG5cdCAgICBzd2l0Y2goa2luZCl7XG5cdCAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICB9O1xuXHQgIHZhciBUQUcgICAgICAgID0gTkFNRSArICcgSXRlcmF0b3InXG5cdCAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuXHQgICAgLCBWQUxVRVNfQlVHID0gZmFsc2Vcblx0ICAgICwgcHJvdG8gICAgICA9IEJhc2UucHJvdG90eXBlXG5cdCAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cblx0ICAgICwgJGRlZmF1bHQgICA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpXG5cdCAgICAsICRlbnRyaWVzICAgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkXG5cdCAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG5cdCAgICAsIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG5cdCAgLy8gRml4IG5hdGl2ZVxuXHQgIGlmKCRhbnlOYXRpdmUpe1xuXHQgICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UpKTtcblx0ICAgIGlmKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKXtcblx0ICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuXHQgICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcblx0ICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG5cdCAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcblx0ICBpZihERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpe1xuXHQgICAgVkFMVUVTX0JVRyA9IHRydWU7XG5cdCAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuXHQgIH1cblx0ICAvLyBEZWZpbmUgaXRlcmF0b3Jcblx0ICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG5cdCAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuXHQgIH1cblx0ICAvLyBQbHVnIGZvciBsaWJyYXJ5XG5cdCAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG5cdCAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcblx0ICBpZihERUZBVUxUKXtcblx0ICAgIG1ldGhvZHMgPSB7XG5cdCAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuXHQgICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG5cdCAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG5cdCAgICB9O1xuXHQgICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG5cdCAgICAgIGlmKCEoa2V5IGluIHByb3RvKSlyZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuXHQgICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcblx0ICB9XG5cdCAgcmV0dXJuIG1ldGhvZHM7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB0cnVlO1xuXG4vKioqLyB9LFxuLyogMjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5cbi8qKiovIH0sXG4vKiAyOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG5cdCAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLyoqKi8gfSxcbi8qIDMxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciBjcmVhdGUgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpXG5cdCAgLCBkZXNjcmlwdG9yICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpXG5cdCAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXHRcblx0Ly8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMCkoSXRlcmF0b3JQcm90b3R5cGUsIF9fd2VicGFja19yZXF1aXJlX18oNDgpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KXtcblx0ICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG5cdCAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG5cdHZhciBhbk9iamVjdCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCBkUHMgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzMpXG5cdCAgLCBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpXG5cdCAgLCBJRV9QUk9UTyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpKCdJRV9QUk9UTycpXG5cdCAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cblx0ICAsIFBST1RPVFlQRSAgID0gJ3Byb3RvdHlwZSc7XG5cdFxuXHQvLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG5cdHZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24oKXtcblx0ICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuXHQgIHZhciBpZnJhbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KSgnaWZyYW1lJylcblx0ICAgICwgaSAgICAgID0gZW51bUJ1Z0tleXMubGVuZ3RoXG5cdCAgICAsIGx0ICAgICA9ICc8J1xuXHQgICAgLCBndCAgICAgPSAnPidcblx0ICAgICwgaWZyYW1lRG9jdW1lbnQ7XG5cdCAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXyg0NikuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblx0ICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG5cdCAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcblx0ICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG5cdCAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcblx0ICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG5cdCAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuXHQgIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG5cdCAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG5cdCAgd2hpbGUoaS0tKWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuXHQgIHJldHVybiBjcmVhdGVEaWN0KCk7XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuXHQgIHZhciByZXN1bHQ7XG5cdCAgaWYoTyAhPT0gbnVsbCl7XG5cdCAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG5cdCAgICByZXN1bHQgPSBuZXcgRW1wdHk7XG5cdCAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcblx0ICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcblx0ICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuXHQgIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG5cdCAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAzMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRQICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSlcblx0ICAsIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIGdldEtleXMgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpe1xuXHQgIGFuT2JqZWN0KE8pO1xuXHQgIHZhciBrZXlzICAgPSBnZXRLZXlzKFByb3BlcnRpZXMpXG5cdCAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG5cdCAgICAsIGkgPSAwXG5cdCAgICAsIFA7XG5cdCAgd2hpbGUobGVuZ3RoID4gaSlkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuXHQgIHJldHVybiBPO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxuXHR2YXIgJGtleXMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KVxuXHQgICwgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKXtcblx0ICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBoYXMgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgdG9JT2JqZWN0ICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIGFycmF5SW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMzkpKGZhbHNlKVxuXHQgICwgSUVfUFJPVE8gICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MikoJ0lFX1BST1RPJyk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgbmFtZXMpe1xuXHQgIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuXHQgICAgLCBpICAgICAgPSAwXG5cdCAgICAsIHJlc3VsdCA9IFtdXG5cdCAgICAsIGtleTtcblx0ICBmb3Ioa2V5IGluIE8paWYoa2V5ICE9IElFX1BST1RPKWhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG5cdCAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuXHQgIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKXtcblx0ICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfVxuXHQgIHJldHVybiByZXN1bHQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG5cdHZhciBJT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNylcblx0ICAsIGRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5cdHZhciBjb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcblx0Ly8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcblx0dmFyIHRvSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b0xlbmd0aCAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQwKVxuXHQgICwgdG9JbmRleCAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuXHQgIHJldHVybiBmdW5jdGlvbigkdGhpcywgZWwsIGZyb21JbmRleCl7XG5cdCAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuXHQgICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuXHQgICAgICAsIGluZGV4ICA9IHRvSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpXG5cdCAgICAgICwgdmFsdWU7XG5cdCAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG5cdCAgICBpZihJU19JTkNMVURFUyAmJiBlbCAhPSBlbCl3aGlsZShsZW5ndGggPiBpbmRleCl7XG5cdCAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcblx0ICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG5cdCAgICAvLyBBcnJheSN0b0luZGV4IGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG5cdCAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcblx0ICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuXHQgICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuXHQgIH07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjE1IFRvTGVuZ3RoXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgbWluICAgICAgID0gTWF0aC5taW47XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpXG5cdCAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuXHQgICwgbWluICAgICAgID0gTWF0aC5taW47XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG5cdCAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuXHQgIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKSgna2V5cycpXG5cdCAgLCB1aWQgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuXHQgIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG5cdCAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHR2YXIgaWQgPSAwXG5cdCAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcblx0bW9kdWxlLmV4cG9ydHMgPSAoXG5cdCAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcblx0KS5zcGxpdCgnLCcpO1xuXG4vKioqLyB9LFxuLyogNDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbi8qKiovIH0sXG4vKiA0NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRlZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpLmZcblx0ICAsIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBUQUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgndG9TdHJpbmdUYWcnKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIHRhZywgc3RhdCl7XG5cdCAgaWYoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSlkZWYoaXQsIFRBRywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZ30pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBzdG9yZSAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MykoJ3drcycpXG5cdCAgLCB1aWQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NClcblx0ICAsIFN5bWJvbCAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLlN5bWJvbFxuXHQgICwgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblx0XG5cdHZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XG5cdCAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG5cdCAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xuXHR9O1xuXHRcblx0JGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcblxuLyoqKi8gfSxcbi8qIDQ5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxuXHR2YXIgaGFzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgdG9PYmplY3QgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKVxuXHQgICwgSUVfUFJPVE8gICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKSgnSUVfUFJPVE8nKVxuXHQgICwgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oTyl7XG5cdCAgTyA9IHRvT2JqZWN0KE8pO1xuXHQgIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuXHQgIGlmKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3Ipe1xuXHQgICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuXHQgIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxuXHR2YXIgZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDUxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDUyKTtcblx0dmFyIGdsb2JhbCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBoaWRlICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMClcblx0ICAsIEl0ZXJhdG9ycyAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgVE9fU1RSSU5HX1RBRyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpKCd0b1N0cmluZ1RhZycpO1xuXHRcblx0Zm9yKHZhciBjb2xsZWN0aW9ucyA9IFsnTm9kZUxpc3QnLCAnRE9NVG9rZW5MaXN0JywgJ01lZGlhTGlzdCcsICdTdHlsZVNoZWV0TGlzdCcsICdDU1NSdWxlTGlzdCddLCBpID0gMDsgaSA8IDU7IGkrKyl7XG5cdCAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuXHQgICAgLCBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdXG5cdCAgICAsIHByb3RvICAgICAgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuXHQgIGlmKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSloaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcblx0ICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDUyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mylcblx0ICAsIHN0ZXAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0KVxuXHQgICwgSXRlcmF0b3JzICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzApXG5cdCAgLCB0b0lPYmplY3QgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7XG5cdFxuXHQvLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG5cdC8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG5cdC8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcblx0Ly8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNikoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcblx0ICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG5cdCAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcblx0ICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuXHQvLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcblx0fSwgZnVuY3Rpb24oKXtcblx0ICB2YXIgTyAgICAgPSB0aGlzLl90XG5cdCAgICAsIGtpbmQgID0gdGhpcy5fa1xuXHQgICAgLCBpbmRleCA9IHRoaXMuX2krKztcblx0ICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG5cdCAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuXHQgICAgcmV0dXJuIHN0ZXAoMSk7XG5cdCAgfVxuXHQgIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuXHQgIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuXHQgIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcblx0fSwgJ3ZhbHVlcycpO1xuXHRcblx0Ly8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuXHRJdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXHRcblx0YWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuXHRhZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcblx0YWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG4vKioqLyB9LFxuLyogNTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfTtcblxuLyoqKi8gfSxcbi8qIDU0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcblx0ICByZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDU1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KTtcblxuLyoqKi8gfSxcbi8qIDU2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oNTcpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiA1NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1OCk7XG5cdHZhciAkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5PYmplY3Q7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1OSkoJ2dldE93blByb3BlcnR5TmFtZXMnLCBmdW5jdGlvbigpe1xuXHQgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwKS5mO1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDU5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCBjb3JlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuXHQgICwgZmFpbHMgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG5cdCAgdmFyIGZuICA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXVxuXHQgICAgLCBleHAgPSB7fTtcblx0ICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuXHQgICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24oKXsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG5cdHZhciB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KVxuXHQgICwgZ09QTiAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MSkuZlxuXHQgICwgdG9TdHJpbmcgID0ge30udG9TdHJpbmc7XG5cdFxuXHR2YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuXHQgID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXHRcblx0dmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHRyeSB7XG5cdCAgICByZXR1cm4gZ09QTihpdCk7XG5cdCAgfSBjYXRjaChlKXtcblx0ICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuXHQgIH1cblx0fTtcblx0XG5cdG1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcblx0ICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiA2MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuXHR2YXIgJGtleXMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzUpXG5cdCAgLCBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSkuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cdFxuXHRleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pe1xuXHQgIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDYyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG5cdCAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcblx0ICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNjMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHRcblx0dmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZpbmVQcm9wZXJ0eSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuXHQgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuXHQgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG5cdCAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcblx0ICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcblx0ICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG5cdCAgICB9XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuXHQgICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcblx0ICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuXHQgICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuXHQgIH07XG5cdH0oKTtcblxuLyoqKi8gfSxcbi8qIDY0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHQvKipcclxuXHQgKiBBcnJheS5maW5kXHJcblx0ICovXG5cdGlmICghQXJyYXkucHJvdG90eXBlLmZpbmQpIHtcblx0ICBBcnJheS5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHtcblx0ICAgICd1c2Ugc3RyaWN0Jztcblx0XG5cdCAgICBpZiAodGhpcyA9PSBudWxsKSB7XG5cdCAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5maW5kIGNhbGxlZCBvbiBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHQgICAgfVxuXHQgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHQgICAgfVxuXHQgICAgdmFyIGxpc3QgPSBPYmplY3QodGhpcyk7XG5cdCAgICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGggPj4+IDA7XG5cdCAgICB2YXIgdGhpc0FyZyA9IGFyZ3VtZW50c1sxXTtcblx0ICAgIHZhciB2YWx1ZTtcblx0XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIHZhbHVlID0gbGlzdFtpXTtcblx0ICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpLCBsaXN0KSkge1xuXHQgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHVuZGVmaW5lZDtcblx0ICB9O1xuXHR9XG5cdFxuXHQvKlxyXG5cdCAqIGNsYXNzTGlzdC5qczogQ3Jvc3MtYnJvd3NlciBmdWxsIGVsZW1lbnQuY2xhc3NMaXN0IGltcGxlbWVudGF0aW9uLlxyXG5cdCAqIDEuMS4yMDE1MDMxMlxyXG5cdCAqXHJcblx0ICogQnkgRWxpIEdyZXksIGh0dHA6Ly9lbGlncmV5LmNvbVxyXG5cdCAqIExpY2Vuc2U6IERlZGljYXRlZCB0byB0aGUgcHVibGljIGRvbWFpbi5cclxuXHQgKiAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZFxyXG5cdCAqL1xuXHQvKmdsb2JhbCBzZWxmLCBkb2N1bWVudCwgRE9NRXhjZXB0aW9uICovXG5cdC8qISBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvY2xhc3NMaXN0LmpzICovXG5cdGlmIChcImRvY3VtZW50XCIgaW4gc2VsZikge1xuXHQgIC8vIEZ1bGwgcG9seWZpbGwgZm9yIGJyb3dzZXJzIHdpdGggbm8gY2xhc3NMaXN0IHN1cHBvcnRcblx0ICAvLyBJbmNsdWRpbmcgSUUgPCBFZGdlIG1pc3NpbmcgU1ZHRWxlbWVudC5jbGFzc0xpc3Rcblx0ICBpZiAoIShcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJfXCIpKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgJiYgIShcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKSkpIHtcblx0XG5cdCAgICAoZnVuY3Rpb24gKHZpZXcpIHtcblx0XG5cdCAgICAgIFwidXNlIHN0cmljdFwiO1xuXHRcblx0ICAgICAgaWYgKCEoJ0VsZW1lbnQnIGluIHZpZXcpKSByZXR1cm47XG5cdFxuXHQgICAgICB2YXIgY2xhc3NMaXN0UHJvcCA9IFwiY2xhc3NMaXN0XCIsXG5cdCAgICAgICAgICBwcm90b1Byb3AgPSBcInByb3RvdHlwZVwiLFxuXHQgICAgICAgICAgZWxlbUN0clByb3RvID0gdmlldy5FbGVtZW50W3Byb3RvUHJvcF0sXG5cdCAgICAgICAgICBvYmpDdHIgPSBPYmplY3QsXG5cdCAgICAgICAgICBzdHJUcmltID0gU3RyaW5nW3Byb3RvUHJvcF0udHJpbSB8fCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgXCJcIik7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBhcnJJbmRleE9mID0gQXJyYXlbcHJvdG9Qcm9wXS5pbmRleE9mIHx8IGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICAgICAgdmFyIGkgPSAwLFxuXHQgICAgICAgICAgICBsZW4gPSB0aGlzLmxlbmd0aDtcblx0ICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICBpZiAoaSBpbiB0aGlzICYmIHRoaXNbaV0gPT09IGl0ZW0pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgfVxuXHQgICAgICAvLyBWZW5kb3JzOiBwbGVhc2UgYWxsb3cgY29udGVudCBjb2RlIHRvIGluc3RhbnRpYXRlIERPTUV4Y2VwdGlvbnNcblx0ICAgICAgLFxuXHQgICAgICAgICAgRE9NRXggPSBmdW5jdGlvbiBET01FeCh0eXBlLCBtZXNzYWdlKSB7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gdHlwZTtcblx0ICAgICAgICB0aGlzLmNvZGUgPSBET01FeGNlcHRpb25bdHlwZV07XG5cdCAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0ICAgICAgfSxcblx0ICAgICAgICAgIGNoZWNrVG9rZW5BbmRHZXRJbmRleCA9IGZ1bmN0aW9uIGNoZWNrVG9rZW5BbmRHZXRJbmRleChjbGFzc0xpc3QsIHRva2VuKSB7XG5cdCAgICAgICAgaWYgKHRva2VuID09PSBcIlwiKSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXCJTWU5UQVhfRVJSXCIsIFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkXCIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoL1xccy8udGVzdCh0b2tlbikpIHtcblx0ICAgICAgICAgIHRocm93IG5ldyBET01FeChcIklOVkFMSURfQ0hBUkFDVEVSX0VSUlwiLCBcIlN0cmluZyBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3RlclwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGFyckluZGV4T2YuY2FsbChjbGFzc0xpc3QsIHRva2VuKTtcblx0ICAgICAgfSxcblx0ICAgICAgICAgIENsYXNzTGlzdCA9IGZ1bmN0aW9uIENsYXNzTGlzdChlbGVtKSB7XG5cdCAgICAgICAgdmFyIHRyaW1tZWRDbGFzc2VzID0gc3RyVHJpbS5jYWxsKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiksXG5cdCAgICAgICAgICAgIGNsYXNzZXMgPSB0cmltbWVkQ2xhc3NlcyA/IHRyaW1tZWRDbGFzc2VzLnNwbGl0KC9cXHMrLykgOiBbXSxcblx0ICAgICAgICAgICAgaSA9IDAsXG5cdCAgICAgICAgICAgIGxlbiA9IGNsYXNzZXMubGVuZ3RoO1xuXHQgICAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgIHRoaXMucHVzaChjbGFzc2VzW2ldKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLnRvU3RyaW5nKCkpO1xuXHQgICAgICAgIH07XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBjbGFzc0xpc3RQcm90byA9IENsYXNzTGlzdFtwcm90b1Byb3BdID0gW10sXG5cdCAgICAgICAgICBjbGFzc0xpc3RHZXR0ZXIgPSBmdW5jdGlvbiBjbGFzc0xpc3RHZXR0ZXIoKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0xpc3QodGhpcyk7XG5cdCAgICAgIH07XG5cdCAgICAgIC8vIE1vc3QgRE9NRXhjZXB0aW9uIGltcGxlbWVudGF0aW9ucyBkb24ndCBhbGxvdyBjYWxsaW5nIERPTUV4Y2VwdGlvbidzIHRvU3RyaW5nKClcblx0ICAgICAgLy8gb24gbm9uLURPTUV4Y2VwdGlvbnMuIEVycm9yJ3MgdG9TdHJpbmcoKSBpcyBzdWZmaWNpZW50IGhlcmUuXG5cdCAgICAgIERPTUV4W3Byb3RvUHJvcF0gPSBFcnJvcltwcm90b1Byb3BdO1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5pdGVtID0gZnVuY3Rpb24gKGkpIHtcblx0ICAgICAgICByZXR1cm4gdGhpc1tpXSB8fCBudWxsO1xuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5jb250YWlucyA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIHRva2VuICs9IFwiXCI7XG5cdCAgICAgICAgcmV0dXJuIGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbikgIT09IC0xO1xuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5hZGQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHRva2VucyA9IGFyZ3VtZW50cyxcblx0ICAgICAgICAgICAgaSA9IDAsXG5cdCAgICAgICAgICAgIGwgPSB0b2tlbnMubGVuZ3RoLFxuXHQgICAgICAgICAgICB0b2tlbixcblx0ICAgICAgICAgICAgdXBkYXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIGRvIHtcblx0ICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcblx0ICAgICAgICAgIGlmIChjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pID09PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IHdoaWxlICgrK2kgPCBsKTtcblx0XG5cdCAgICAgICAgaWYgKHVwZGF0ZWQpIHtcblx0ICAgICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbnMgPSBhcmd1bWVudHMsXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsID0gdG9rZW5zLmxlbmd0aCxcblx0ICAgICAgICAgICAgdG9rZW4sXG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcblx0ICAgICAgICAgICAgaW5kZXg7XG5cdCAgICAgICAgZG8ge1xuXHQgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV0gKyBcIlwiO1xuXHQgICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgd2hpbGUgKGluZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLnNwbGljZShpbmRleCwgMSk7XG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSB3aGlsZSAoKytpIDwgbCk7XG5cdFxuXHQgICAgICAgIGlmICh1cGRhdGVkKSB7XG5cdCAgICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIGNsYXNzTGlzdFByb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uICh0b2tlbiwgZm9yY2UpIHtcblx0ICAgICAgICB0b2tlbiArPSBcIlwiO1xuXHRcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jb250YWlucyh0b2tlbiksXG5cdCAgICAgICAgICAgIG1ldGhvZCA9IHJlc3VsdCA/IGZvcmNlICE9PSB0cnVlICYmIFwicmVtb3ZlXCIgOiBmb3JjZSAhPT0gZmFsc2UgJiYgXCJhZGRcIjtcblx0XG5cdCAgICAgICAgaWYgKG1ldGhvZCkge1xuXHQgICAgICAgICAgdGhpc1ttZXRob2RdKHRva2VuKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIGlmIChmb3JjZSA9PT0gdHJ1ZSB8fCBmb3JjZSA9PT0gZmFsc2UpIHtcblx0ICAgICAgICAgIHJldHVybiBmb3JjZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5qb2luKFwiIFwiKTtcblx0ICAgICAgfTtcblx0XG5cdCAgICAgIGlmIChvYmpDdHIuZGVmaW5lUHJvcGVydHkpIHtcblx0ICAgICAgICB2YXIgY2xhc3NMaXN0UHJvcERlc2MgPSB7XG5cdCAgICAgICAgICBnZXQ6IGNsYXNzTGlzdEdldHRlcixcblx0ICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBvYmpDdHIuZGVmaW5lUHJvcGVydHkoZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyk7XG5cdCAgICAgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgICAgIC8vIElFIDggZG9lc24ndCBzdXBwb3J0IGVudW1lcmFibGU6dHJ1ZVxuXHQgICAgICAgICAgaWYgKGV4Lm51bWJlciA9PT0gLTB4N0ZGNUVDNTQpIHtcblx0ICAgICAgICAgICAgY2xhc3NMaXN0UHJvcERlc2MuZW51bWVyYWJsZSA9IGZhbHNlO1xuXHQgICAgICAgICAgICBvYmpDdHIuZGVmaW5lUHJvcGVydHkoZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2UgaWYgKG9iakN0cltwcm90b1Byb3BdLl9fZGVmaW5lR2V0dGVyX18pIHtcblx0ICAgICAgICBlbGVtQ3RyUHJvdG8uX19kZWZpbmVHZXR0ZXJfXyhjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RHZXR0ZXIpO1xuXHQgICAgICB9XG5cdCAgICB9KShzZWxmKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgLy8gVGhlcmUgaXMgZnVsbCBvciBwYXJ0aWFsIG5hdGl2ZSBjbGFzc0xpc3Qgc3VwcG9ydCwgc28ganVzdCBjaGVjayBpZiB3ZSBuZWVkXG5cdCAgICAvLyB0byBub3JtYWxpemUgdGhlIGFkZC9yZW1vdmUgYW5kIHRvZ2dsZSBBUElzLlxuXHRcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgIFwidXNlIHN0cmljdFwiO1xuXHRcblx0ICAgICAgdmFyIHRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIl9cIik7XG5cdFxuXHQgICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYzFcIiwgXCJjMlwiKTtcblx0XG5cdCAgICAgIC8vIFBvbHlmaWxsIGZvciBJRSAxMC8xMSBhbmQgRmlyZWZveCA8MjYsIHdoZXJlIGNsYXNzTGlzdC5hZGQgYW5kXG5cdCAgICAgIC8vIGNsYXNzTGlzdC5yZW1vdmUgZXhpc3QgYnV0IHN1cHBvcnQgb25seSBvbmUgYXJndW1lbnQgYXQgYSB0aW1lLlxuXHQgICAgICBpZiAoIXRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImMyXCIpKSB7XG5cdCAgICAgICAgdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZChtZXRob2QpIHtcblx0ICAgICAgICAgIHZhciBvcmlnaW5hbCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGVbbWV0aG9kXTtcblx0XG5cdCAgICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgdmFyIGksXG5cdCAgICAgICAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcblx0ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgdG9rZW4gPSBhcmd1bWVudHNbaV07XG5cdCAgICAgICAgICAgICAgb3JpZ2luYWwuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBjcmVhdGVNZXRob2QoJ2FkZCcpO1xuXHQgICAgICAgIGNyZWF0ZU1ldGhvZCgncmVtb3ZlJyk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHRlc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoXCJjM1wiLCBmYWxzZSk7XG5cdFxuXHQgICAgICAvLyBQb2x5ZmlsbCBmb3IgSUUgMTAgYW5kIEZpcmVmb3ggPDI0LCB3aGVyZSBjbGFzc0xpc3QudG9nZ2xlIGRvZXMgbm90XG5cdCAgICAgIC8vIHN1cHBvcnQgdGhlIHNlY29uZCBhcmd1bWVudC5cblx0ICAgICAgaWYgKHRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImMzXCIpKSB7XG5cdCAgICAgICAgdmFyIF90b2dnbGUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZTtcblx0XG5cdCAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4sIGZvcmNlKSB7XG5cdCAgICAgICAgICBpZiAoMSBpbiBhcmd1bWVudHMgJiYgIXRoaXMuY29udGFpbnModG9rZW4pID09PSAhZm9yY2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZvcmNlO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIF90b2dnbGUuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdGVzdEVsZW1lbnQgPSBudWxsO1xuXHQgICAgfSkoKTtcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0ZXhwb3J0cy5nZXRKU09OID0gZ2V0SlNPTjtcblx0ZXhwb3J0cy5nZXRTY3JvbGxCYXJXaWR0aCA9IGdldFNjcm9sbEJhcldpZHRoO1xuXHRleHBvcnRzLnRyYW5zbGF0aW9ucyA9IHRyYW5zbGF0aW9ucztcblx0ZXhwb3J0cy5kZWxheWVyID0gZGVsYXllcjtcblx0ZXhwb3J0cy5WdWVGaXhlciA9IFZ1ZUZpeGVyO1xuXHQvLyBjb2VyY2UgY29udmVydCBzb20gdHlwZXMgb2YgZGF0YSBpbnRvIGFub3RoZXIgdHlwZVxuXHR2YXIgY29lcmNlID0gZXhwb3J0cy5jb2VyY2UgPSB7XG5cdCAgLy8gQ29udmVydCBhIHN0cmluZyB0byBib29sZWFtLiBPdGhlcndpc2UsIHJldHVybiB0aGUgdmFsdWUgd2l0aG91dCBtb2RpZmljYXRpb24sIHNvIGlmIGlzIG5vdCBib29sZWFuLCBWdWUgdGhyb3cgYSB3YXJuaW5nLlxuXHQgIGJvb2xlYW46IGZ1bmN0aW9uIGJvb2xlYW4odmFsKSB7XG5cdCAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwgPT09ICcnIHx8IHZhbCA9PT0gJ3RydWUnID8gdHJ1ZSA6IHZhbCA9PT0gJ2ZhbHNlJyB8fCB2YWwgPT09ICdudWxsJyB8fCB2YWwgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiB2YWwgOiB2YWw7XG5cdCAgfSxcblx0ICAvLyBBdHRlbXB0IHRvIGNvbnZlcnQgYSBzdHJpbmcgdmFsdWUgdG8gYSBOdW1iZXIuIE90aGVyd2lzZSwgcmV0dXJuIDAuXG5cdCAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsKSB7XG5cdCAgICB2YXIgYWx0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuXHQgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInID8gdmFsIDogdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsIHx8IGlzTmFOKE51bWJlcih2YWwpKSA/IGFsdCA6IE51bWJlcih2YWwpO1xuXHQgIH0sXG5cdCAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IHRvIHN0cmluZyBhbnkgdmFsdWUsIGV4Y2VwdCBmb3IgbnVsbCBvciB1bmRlZmluZWQuXG5cdCAgc3RyaW5nOiBmdW5jdGlvbiBzdHJpbmcodmFsKSB7XG5cdCAgICByZXR1cm4gdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsID8gJycgOiB2YWwgKyAnJztcblx0ICB9LFxuXHQgIC8vIFBhdHRlcm4gYWNjZXB0IFJlZ0V4cCwgZnVuY3Rpb24sIG9yIHN0cmluZyAoY29udmVydGVkIHRvIFJlZ0V4cCkuIE90aGVyd2lzZSByZXR1cm4gbnVsbC5cblx0ICBwYXR0ZXJuOiBmdW5jdGlvbiBwYXR0ZXJuKHZhbCkge1xuXHQgICAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IHZhbCBpbnN0YW5jZW9mIFJlZ0V4cCA/IHZhbCA6IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gbmV3IFJlZ0V4cCh2YWwpIDogbnVsbDtcblx0ICB9XG5cdH07XG5cdFxuXHRmdW5jdGlvbiBnZXRKU09OKHVybCkge1xuXHQgIHZhciByZXF1ZXN0ID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHQgIHZhciBkYXRhID0ge307XG5cdCAgLy8gcCAoLXNpbXVsYXRlZC0gcHJvbWlzZSlcblx0ICB2YXIgcCA9IHtcblx0ICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4oZm4xLCBmbjIpIHtcblx0ICAgICAgcmV0dXJuIHAuZG9uZShmbjEpLmZhaWwoZm4yKTtcblx0ICAgIH0sXG5cdCAgICBjYXRjaDogZnVuY3Rpb24gX2NhdGNoKGZuKSB7XG5cdCAgICAgIHJldHVybiBwLmZhaWwoZm4pO1xuXHQgICAgfSxcblx0ICAgIGFsd2F5czogZnVuY3Rpb24gYWx3YXlzKGZuKSB7XG5cdCAgICAgIHJldHVybiBwLmRvbmUoZm4pLmZhaWwoZm4pO1xuXHQgICAgfVxuXHQgIH07XG5cdCAgWydkb25lJywgJ2ZhaWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICBkYXRhW25hbWVdID0gW107XG5cdCAgICBwW25hbWVdID0gZnVuY3Rpb24gKGZuKSB7XG5cdCAgICAgIGlmIChmbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSBkYXRhW25hbWVdLnB1c2goZm4pO1xuXHQgICAgICByZXR1cm4gcDtcblx0ICAgIH07XG5cdCAgfSk7XG5cdCAgcC5kb25lKEpTT04ucGFyc2UpO1xuXHQgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSA9PT0gNCkge1xuXHQgICAgICB2YXIgcmVzcG9uc2U7XG5cdCAgICAgIHZhciBpO1xuXHQgICAgICB2YXIgdmFsdWU7XG5cdFxuXHQgICAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBlID0geyBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzIH07XG5cdCAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0ICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIHJlc3BvbnNlID0gcmVxdWVzdC5yZXNwb25zZVRleHQ7XG5cdFxuXHQgICAgICAgICAgICBmb3IgKGkgaW4gZGF0YS5kb25lKSB7XG5cdCAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhLmRvbmVbaV0ocmVzcG9uc2UpO1xuXHRcblx0ICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB2YWx1ZTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICBkYXRhLmZhaWwuZm9yRWFjaChmdW5jdGlvbiAoZmFpbCkge1xuXHQgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBkYXRhLmZhaWwuZm9yRWFjaChmdW5jdGlvbiAoZmFpbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbChlKTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSkoKTtcblx0ICAgIH1cblx0ICB9O1xuXHQgIHJlcXVlc3Qub3BlbignR0VUJywgdXJsKTtcblx0ICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG5cdCAgcmVxdWVzdC5zZW5kKCk7XG5cdCAgcmV0dXJuIHA7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGdldFNjcm9sbEJhcldpZHRoKCkge1xuXHQgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IDw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpIHtcblx0ICAgIHJldHVybiAwO1xuXHQgIH1cblx0ICB2YXIgaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cdCAgaW5uZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG5cdCAgaW5uZXIuc3R5bGUuaGVpZ2h0ID0gJzIwMHB4Jztcblx0XG5cdCAgdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdCAgb3V0ZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHQgIG91dGVyLnN0eWxlLnRvcCA9ICcwcHgnO1xuXHQgIG91dGVyLnN0eWxlLmxlZnQgPSAnMHB4Jztcblx0ICBvdXRlci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cdCAgb3V0ZXIuc3R5bGUud2lkdGggPSAnMjAwcHgnO1xuXHQgIG91dGVyLnN0eWxlLmhlaWdodCA9ICcxNTBweCc7XG5cdCAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblx0ICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7XG5cdFxuXHQgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpO1xuXHQgIHZhciB3MSA9IGlubmVyLm9mZnNldFdpZHRoO1xuXHQgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG5cdCAgdmFyIHcyID0gaW5uZXIub2Zmc2V0V2lkdGg7XG5cdCAgaWYgKHcxID09PSB3MikgdzIgPSBvdXRlci5jbGllbnRXaWR0aDtcblx0XG5cdCAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChvdXRlcik7XG5cdFxuXHQgIHJldHVybiB3MSAtIHcyO1xuXHR9XG5cdFxuXHQvLyByZXR1cm4gYWxsIHRoZSB0cmFuc2xhdGlvbnMgb3IgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgKGVuZ2xpc2gpXG5cdGZ1bmN0aW9uIHRyYW5zbGF0aW9ucygpIHtcblx0ICB2YXIgbGFuZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2VuJztcblx0XG5cdCAgdmFyIHRleHQgPSB7XG5cdCAgICBkYXlzT2ZXZWVrOiBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10sXG5cdCAgICBsaW1pdDogJ0xpbWl0IHJlYWNoZWQgKHt7bGltaXR9fSBpdGVtcyBtYXgpLicsXG5cdCAgICBsb2FkaW5nOiAnTG9hZGluZy4uLicsXG5cdCAgICBtaW5MZW5ndGg6ICdNaW4uIExlbmd0aCcsXG5cdCAgICBtb250aHM6IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddLFxuXHQgICAgbm90U2VsZWN0ZWQ6ICdOb3RoaW5nIFNlbGVjdGVkJyxcblx0ICAgIHJlcXVpcmVkOiAnUmVxdWlyZWQnLFxuXHQgICAgc2VhcmNoOiAnU2VhcmNoJyxcblx0ICAgIHNlbGVjdGVkOiAne3tjb3VudH19IHNlbGVjdGVkJ1xuXHQgIH07XG5cdCAgcmV0dXJuIHdpbmRvdy5WdWVTdHJhcExhbmcgPyB3aW5kb3cuVnVlU3RyYXBMYW5nKGxhbmcpIDogdGV4dDtcblx0fVxuXHRcblx0Ly8gZGVsYXllcjogc2V0IGEgZnVuY3Rpb24gdGhhdCBleGVjdXRlIGFmdGVyIGEgZGVsYXlcblx0Ly8gQHBhcmFtcyAoZnVuY3Rpb24sIGRlbGF5X3Byb3Agb3IgdmFsdWUsIGRlZmF1bHRfdmFsdWUpXG5cdGZ1bmN0aW9uIGRlbGF5ZXIoZm4sIHZhclRpbWVyKSB7XG5cdCAgdmFyIGlmTmFOID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxMDA7XG5cdFxuXHQgIGZ1bmN0aW9uIHRvSW50KGVsKSB7XG5cdCAgICByZXR1cm4gKC9eWzAtOV0rJC8udGVzdChlbCkgPyBOdW1iZXIoZWwpIHx8IDEgOiBudWxsXG5cdCAgICApO1xuXHQgIH1cblx0ICB2YXIgdGltZXJJZDtcblx0ICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuXHQgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuXHQgICAgfVxuXHRcblx0ICAgIGlmICh0aW1lcklkKSBjbGVhclRpbWVvdXQodGltZXJJZCk7XG5cdCAgICB0aW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGZuLmFwcGx5KF90aGlzLCBhcmdzKTtcblx0ICAgIH0sIHRvSW50KHZhclRpbWVyKSB8fCB0b0ludCh0aGlzW3ZhclRpbWVyXSkgfHwgaWZOYU4pO1xuXHQgIH07XG5cdH1cblx0XG5cdC8vIEZpeCBhIHZ1ZSBpbnN0YW5jZSBMaWZlY3ljbGUgdG8gdnVlIDEvMiAoanVzdCB0aGUgYmFzaWMgZWxlbWVudHMsIGlzIG5vdCBhIHJlYWwgcGFyc2VyLCBzbyB0aGlzIHdvcmsgb25seSBpZiB5b3VyIGNvZGUgaXMgY29tcGF0aWJsZSB3aXRoIGJvdGgpXG5cdC8vIChXYWl0aW5nIGZvciB0ZXN0aW5nKVxuXHRmdW5jdGlvbiBWdWVGaXhlcih2dWUpIHtcblx0ICB2YXIgdnVlMiA9ICF3aW5kb3cuVnVlIHx8ICF3aW5kb3cuVnVlLnBhcnRpYWw7XG5cdCAgdmFyIG1peGluID0ge1xuXHQgICAgY29tcHV0ZWQ6IHtcblx0ICAgICAgdnVlMjogZnVuY3Rpb24gdnVlMigpIHtcblx0ICAgICAgICByZXR1cm4gIXRoaXMuJGRpc3BhdGNoO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfTtcblx0ICBpZiAoIXZ1ZTIpIHtcblx0ICAgIC8vdHJhbnNsYXRlIHZ1ZTIgYXR0cmlidXRlcyB0byB2dWUxXG5cdCAgICBpZiAodnVlLmJlZm9yZUNyZWF0ZSkge1xuXHQgICAgICBtaXhpbi5jcmVhdGUgPSB2dWUuYmVmb3JlQ3JlYXRlO1xuXHQgICAgICBkZWxldGUgdnVlLmJlZm9yZUNyZWF0ZTtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUuYmVmb3JlTW91bnQpIHtcblx0ICAgICAgdnVlLmJlZm9yZUNvbXBpbGUgPSB2dWUuYmVmb3JlTW91bnQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUuYmVmb3JlTW91bnQ7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLm1vdW50ZWQpIHtcblx0ICAgICAgdnVlLnJlYWR5ID0gdnVlLm1vdW50ZWQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUubW91bnRlZDtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgLy90cmFuc2xhdGUgdnVlMSBhdHRyaWJ1dGVzIHRvIHZ1ZTJcblx0ICAgIGlmICh2dWUuYmVmb3JlQ29tcGlsZSkge1xuXHQgICAgICB2dWUuYmVmb3JlTW91bnQgPSB2dWUuYmVmb3JlQ29tcGlsZTtcblx0ICAgICAgZGVsZXRlIHZ1ZS5iZWZvcmVDb21waWxlO1xuXHQgICAgfVxuXHQgICAgaWYgKHZ1ZS5jb21waWxlZCkge1xuXHQgICAgICBtaXhpbi5jb21waWxlZCA9IHZ1ZS5jb21waWxlZDtcblx0ICAgICAgZGVsZXRlIHZ1ZS5jb21waWxlZDtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUucmVhZHkpIHtcblx0ICAgICAgdnVlLm1vdW50ZWQgPSB2dWUucmVhZHk7XG5cdCAgICAgIGRlbGV0ZSB2dWUucmVhZHk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGlmICghdnVlLm1peGlucykge1xuXHQgICAgdnVlLm1peGlucyA9IFtdO1xuXHQgIH1cblx0ICB2dWUubWl4aW5zLnVuc2hpZnQobWl4aW4pO1xuXHQgIHJldHVybiB2dWU7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24ocHJvY2Vzcykgeyd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvKipcclxuXHQgKiBDbGljayBvdXRzaWRlIGRpcmVjdGl2ZVxyXG5cdCAqL1xuXHR2YXIgYmluZGVkID0gW107XG5cdFxuXHRmdW5jdGlvbiBoYW5kbGVyKGUpIHtcblx0ICBiaW5kZWQuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgIGlmICghZWwubm9kZS5jb250YWlucyhlLnRhcmdldCkpIGVsLmNhbGxiYWNrKGUpO1xuXHQgIH0pO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBhZGRMaXN0ZW5lcihub2RlLCBjYWxsYmFjaykge1xuXHQgIGlmICghYmluZGVkLmxlbmd0aCkgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG5cdCAgYmluZGVkLnB1c2goeyBub2RlOiBub2RlLCBjYWxsYmFjazogY2FsbGJhY2sgfSk7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGNhbGxiYWNrKSB7XG5cdCAgYmluZGVkID0gYmluZGVkLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgIHJldHVybiBlbC5ub2RlICE9PSBub2RlID8gdHJ1ZSA6ICFjYWxsYmFjayA/IGZhbHNlIDogZWwuY2FsbGJhY2sgIT09IGNhbGxiYWNrO1xuXHQgIH0pO1xuXHQgIGlmICghYmluZGVkLmxlbmd0aCkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG5cdH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBiaW5kOiBmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICBpZiAodHlwZW9mIGJpbmRpbmcudmFsdWUgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcblx0ICAgICAgICBWdWUudXRpbC53YXJuKCdDbGlja091dHNpZGUgb25seSB3b3JrIHdpdGggYSBmdW5jdGlvbiwgcmVjZWl2ZWQ6IHYtJyArIGJpbmRpbmcubmFtZSArICc9XCInICsgYmluZGluZy5leHByZXNzaW9uICsgJ1wiJyk7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGFkZExpc3RlbmVyKGVsLCBiaW5kaW5nLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGVsLCBiaW5kaW5nKSB7XG5cdCAgICBpZiAoYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSkge1xuXHQgICAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy5vbGRWYWx1ZSk7XG5cdCAgICAgIGFkZExpc3RlbmVyKGVsLCBiaW5kaW5nLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgfVxuXHR9O1xuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg2NykpKVxuXG4vKioqLyB9LFxuLyogNjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXHR2YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cdFxuXHQvLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcblx0Ly8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG5cdC8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcblx0Ly8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblx0XG5cdHZhciBjYWNoZWRTZXRUaW1lb3V0O1xuXHR2YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXHRcblx0ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xuXHR9XG5cdGZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcblx0fVxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHQgICAgfVxuXHQgICAgdHJ5IHtcblx0ICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcblx0ICAgICAgICB9XG5cdCAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcblx0ICAgIH1cblx0fSAoKSlcblx0ZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcblx0ICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG5cdCAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG5cdCAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH1cblx0ICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG5cdCAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcblx0ICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcblx0ICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuXHQgICAgfVxuXHQgICAgdHJ5IHtcblx0ICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG5cdCAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH0gY2F0Y2goZSl7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcblx0ICAgICAgICB9IGNhdGNoKGUpe1xuXHQgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHRcblx0XG5cdH1cblx0ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuXHQgICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG5cdCAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG5cdCAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuXHQgICAgfVxuXHQgICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXHQgICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG5cdCAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH0gY2F0Y2ggKGUpe1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG5cdCAgICAgICAgfSBjYXRjaCAoZSl7XG5cdCAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuXHQgICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0XG5cdFxuXHRcblx0fVxuXHR2YXIgcXVldWUgPSBbXTtcblx0dmFyIGRyYWluaW5nID0gZmFsc2U7XG5cdHZhciBjdXJyZW50UXVldWU7XG5cdHZhciBxdWV1ZUluZGV4ID0gLTE7XG5cdFxuXHRmdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG5cdCAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBkcmFpbmluZyA9IGZhbHNlO1xuXHQgICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcblx0ICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG5cdCAgICB9XG5cdCAgICBpZiAocXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgZHJhaW5RdWV1ZSgpO1xuXHQgICAgfVxuXHR9XG5cdFxuXHRmdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuXHQgICAgaWYgKGRyYWluaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG5cdCAgICBkcmFpbmluZyA9IHRydWU7XG5cdFxuXHQgICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICAgIHdoaWxlKGxlbikge1xuXHQgICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuXHQgICAgICAgIHF1ZXVlID0gW107XG5cdCAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuXHQgICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICAgIH1cblx0ICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG5cdCAgICBkcmFpbmluZyA9IGZhbHNlO1xuXHQgICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHR9XG5cdFxuXHRwcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuXHQgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuXHQgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcblx0ICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG5cdCAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcblx0ICAgIH1cblx0fTtcblx0XG5cdC8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcblx0ZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG5cdCAgICB0aGlzLmZ1biA9IGZ1bjtcblx0ICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcblx0fVxuXHRJdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcblx0fTtcblx0cHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcblx0cHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcblx0cHJvY2Vzcy5lbnYgPSB7fTtcblx0cHJvY2Vzcy5hcmd2ID0gW107XG5cdHByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xuXHRwcm9jZXNzLnZlcnNpb25zID0ge307XG5cdFxuXHRmdW5jdGlvbiBub29wKCkge31cblx0XG5cdHByb2Nlc3Mub24gPSBub29wO1xuXHRwcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcblx0cHJvY2Vzcy5vbmNlID0gbm9vcDtcblx0cHJvY2Vzcy5vZmYgPSBub29wO1xuXHRwcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xuXHRwcm9jZXNzLmVtaXQgPSBub29wO1xuXHRcblx0cHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0XG5cdHByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5cdHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuXHR9O1xuXHRwcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cbi8qKiovIH0sXG4vKiA2OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKHByb2Nlc3MpIHsndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0LyoqXHJcblx0ICogQ2xpY2sgb3V0c2lkZSBkaXJlY3RpdmVcclxuXHQgKi9cblx0dmFyIEhBTkRMRVIgPSAnX3Z1ZV9zY3JvbGxfaGFuZGxlcic7XG5cdHZhciBldmVudHMgPSBbJ3Jlc2l6ZScsICdzY3JvbGwnXTtcblx0XG5cdGZ1bmN0aW9uIGJpbmQoZWwsIGJpbmRpbmcpIHtcblx0ICB1bmJpbmQoZWwpO1xuXHRcblx0ICB2YXIgY2FsbGJhY2sgPSBiaW5kaW5nLnZhbHVlO1xuXHQgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG5cdCAgICAgIFZ1ZS51dGlsLndhcm4oJ0NsaWNrT3V0c2lkZSBvbmx5IHdvcmsgd2l0aCBhIGZ1bmN0aW9uIHZhbHVlLCByZWNlaXZlZDogdi0nICsgYmluZGluZy5uYW1lICsgJz1cIicgKyBiaW5kaW5nLmV4cHJlc3Npb24gKyAnXCInKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgZWxbSEFORExFUl0gPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBjYWxsYmFjayhlKTtcblx0ICAgIH07XG5cdCAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuXHQgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihlLCBlbFtIQU5ETEVSXSwgZmFsc2UpO1xuXHQgICAgfSk7XG5cdCAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICBlbFtIQU5ETEVSXSgpO1xuXHQgICAgfSwgMCk7XG5cdCAgfVxuXHR9XG5cdFxuXHRmdW5jdGlvbiB1bmJpbmQoZWwpIHtcblx0ICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICB9KTtcblx0ICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICBkZWxldGUgZWxbSEFORExFUl07XG5cdH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBiaW5kOiBiaW5kLFxuXHQgIHVuYmluZDogdW5iaW5kLFxuXHQgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGVsLCBiaW5kaW5nKSB7XG5cdCAgICBpZiAoYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSkgYmluZChlbCwgYmluZGluZyk7XG5cdCAgfVxuXHR9O1xuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg2NykpKVxuXG4vKioqLyB9LFxuLyogNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzEpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQWNjb3JkaW9uLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1kNGI3NWE5MlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtZDRiNzVhOTJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBY2NvcmRpb24udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB0eXBlOiB7XG5cdCAgICAgIHR5cGU6IFN0cmluZyxcblx0ICAgICAgZGVmYXVsdDogbnVsbFxuXHQgICAgfSxcblx0ICAgIG9uZUF0QXRpbWU6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogZmFsc2Vcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIG9wZW5DaGlsZDogZnVuY3Rpb24gb3BlbkNoaWxkKGNoaWxkKSB7XG5cdCAgICAgIGlmICh0aGlzLm9uZUF0QXRpbWUpIHtcblx0ICAgICAgICB0aGlzLiRjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICAgICAgICBpZiAoY2hpbGQgIT09IGl0ZW0pIHtcblx0ICAgICAgICAgICAgaXRlbS5vcGVuID0gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9pc0FjY29yZGlvbiA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtZDRiNzVhOTJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA3MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Mylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxBZmZpeC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNWViZGRlYmZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTVlYmRkZWJmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWZmaXgudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9TY3JvbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4KTtcblx0XG5cdHZhciBfU2Nyb2xsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Njcm9sbCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIFNjcm9sbDogX1Njcm9sbDIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIG9mZnNldDoge1xuXHQgICAgICB0eXBlOiBOdW1iZXIsXG5cdCAgICAgIGRlZmF1bHQ6IDBcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhZmZpeGVkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdG9wOiBmdW5jdGlvbiB0b3AoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm9mZnNldCA+IDAgPyB0aGlzLm9mZnNldCArICdweCcgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvYWZmaXgvaW5kZXguanN4I0wyMFxuXHQgICAgY2hlY2tTY3JvbGw6IGZ1bmN0aW9uIGNoZWNrU2Nyb2xsKCkge1xuXHQgICAgICAvLyBpZiBpcyBoaWRkZW4gZG9uJ3QgY2FsY3VsYXRlIGFueXRoaW5nXG5cdCAgICAgIGlmICghKHRoaXMuJGVsLm9mZnNldFdpZHRoIHx8IHRoaXMuJGVsLm9mZnNldEhlaWdodCB8fCB0aGlzLiRlbC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgLy8gZ2V0IHdpbmRvdyBzY3JvbGwgYW5kIGVsZW1lbnQgcG9zaXRpb24gdG8gZGV0ZWN0IGlmIGhhdmUgdG8gYmUgbm9ybWFsIG9yIGFmZml4ZWRcblx0ICAgICAgdmFyIHNjcm9sbCA9IHt9O1xuXHQgICAgICB2YXIgZWxlbWVudCA9IHt9O1xuXHQgICAgICB2YXIgcmVjdCA9IHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBfYXJyID0gWydUb3AnLCAnTGVmdCddO1xuXHQgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcblx0ICAgICAgICB2YXIgdHlwZSA9IF9hcnJbX2ldO1xuXHQgICAgICAgIHZhciB0ID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgIHZhciByZXQgPSB3aW5kb3dbJ3BhZ2UnICsgKHR5cGUgPT09ICdUb3AnID8gJ1knIDogJ1gnKSArICdPZmZzZXQnXTtcblx0ICAgICAgICB2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyB0eXBlO1xuXHQgICAgICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgICAgLy8gaWU2LDcsOCBzdGFuZGFyZCBtb2RlXG5cdCAgICAgICAgICByZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbbWV0aG9kXTtcblx0ICAgICAgICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgICAgICAvLyBxdWlya3MgbW9kZVxuXHQgICAgICAgICAgICByZXQgPSBkb2N1bWVudC5ib2R5W21ldGhvZF07XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHNjcm9sbFt0XSA9IHJldDtcblx0ICAgICAgICBlbGVtZW50W3RdID0gc2Nyb2xsW3RdICsgcmVjdFt0XSAtICh0aGlzLiRlbFsnY2xpZW50JyArIHR5cGVdIHx8IGJvZHlbJ2NsaWVudCcgKyB0eXBlXSB8fCAwKTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZml4ID0gc2Nyb2xsLnRvcCA+IGVsZW1lbnQudG9wIC0gdGhpcy5vZmZzZXQ7XG5cdCAgICAgIGlmICh0aGlzLmFmZml4ZWQgIT09IGZpeCkge1xuXHQgICAgICAgIHRoaXMuYWZmaXhlZCA9IGZpeDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhpZGRlbi1wcmludCBoaWRkZW4teHMgaGlkZGVuLXNtXCJcblx0ICB9LCBbX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNjcm9sbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2Nyb2xsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNoZWNrU2Nyb2xsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjaGVja1Njcm9sbFwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLWRvY3Mtc2lkZWJhclwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgYWZmaXg6IF92bS5hZmZpeGVkXG5cdCAgICB9LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIG1hcmdpblRvcDogX3ZtLnRvcFxuXHQgICAgfSlcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNWViZGRlYmZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA3NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg3Nilcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFsZXJ0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1hZjdjMWY2YVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYWY3YzFmNmFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBbGVydC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiA3NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNzcpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWFmN2MxZjZhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9BbGVydC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWFmN2MxZjZhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9BbGVydC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA3NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZmFkZS1lbnRlci1hY3RpdmUsXFxyXFxuLmZhZGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxufVxcbi5mYWRlLWVudGVyLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBoZWlnaHQ6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcbn1cXG4uYWxlcnQudG9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMzBweDtcXHJcXG4gIG1hcmdpbjogMCBhdXRvO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMTA1MDtcXG59XFxuLmFsZXJ0LnRvcC1yaWdodCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICByaWdodDogNTBweDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQWxlcnQudnVlPzcxYTkxYzFhXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFvREE7O0VBRUEsNkJBQUE7Q0FDQTtBQUNBOztFQUVBLFVBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLGVBQUE7RUFDQSxRQUFBO0VBQ0EsU0FBQTtFQUNBLGNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLGNBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQWxlcnQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDx0cmFuc2l0aW9uIG5hbWU9XFxcImZhZGVcXFwiPlxcclxcbiAgICA8ZGl2IHYtc2hvdz1cXFwidmFsXFxcIiA6Y2xhc3M9XFxcIlsnYWxlcnQnLCAnYWxlcnQtJyt0eXBlLCBwbGFjZW1lbnRdXFxcIiA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aH1cXFwiIHJvbGU9XFxcImFsZXJ0XFxcIj5cXHJcXG4gICAgICA8YnV0dG9uIHYtc2hvdz1cXFwiZGlzbWlzc2FibGVcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9IGZhbHNlXFxcIj5cXHJcXG4gICAgICAgIDxzcGFuPiZ0aW1lczs8L3NwYW4+XFxyXFxuICAgICAgPC9idXR0b24+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gIDwvdHJhbnNpdGlvbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuXFxyXFxudmFyIERVUkFUSU9OID0gMFxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc21pc3NhYmxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBkdXJhdGlvbjoge2RlZmF1bHQ6IERVUkFUSU9OfSxcXHJcXG4gICAgcGxhY2VtZW50OiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IFN0cmluZ31cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICB2YWw6IHRoaXMudmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGR1cmF0aW9uTnVtICgpIHsgcmV0dXJuIGNvZXJjZS5udW1iZXIodGhpcy5kdXJhdGlvbiwgRFVSQVRJT04pIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICB2YWwgKHZhbCkge1xcclxcbiAgICAgIGlmICh2YWwgJiYgdGhpcy5kdXJhdGlvbk51bSA+IDApIHsgdGhpcy5fZGVsYXlDbG9zZSgpIH1cXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XFxyXFxuICAgICAgICB0aGlzLnZhbCA9IHZhbFxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9kZWxheUNsb3NlID0gZGVsYXllcihmdW5jdGlvbiAoKSB7XFxyXFxuICAgICAgdGhpcy52YWwgPSBmYWxzZVxcclxcbiAgICB9LCAnZHVyYXRpb25OdW0nKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmZhZGUtZW50ZXItYWN0aXZlLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcyBlYXNlO1xcclxcbn1cXHJcXG4uZmFkZS1lbnRlcixcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgaGVpZ2h0OiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG59XFxyXFxuLmFsZXJ0LnRvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxyXFxufVxcclxcbi5hbGVydC50b3AtcmlnaHQge1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgcmlnaHQ6IDUwcHg7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogNzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXHJcblx0XHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5cdFx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxyXG5cdCovXHJcblx0Ly8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcclxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGxpc3QgPSBbXTtcclxuXHRcclxuXHRcdC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcclxuXHRcdGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcclxuXHRcdFx0dmFyIHJlc3VsdCA9IFtdO1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpdGVtID0gdGhpc1tpXTtcclxuXHRcdFx0XHRpZihpdGVtWzJdKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaChcIkBtZWRpYSBcIiArIGl0ZW1bMl0gKyBcIntcIiArIGl0ZW1bMV0gKyBcIn1cIik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1bMV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0LmpvaW4oXCJcIik7XHJcblx0XHR9O1xyXG5cdFxyXG5cdFx0Ly8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcclxuXHRcdGxpc3QuaSA9IGZ1bmN0aW9uKG1vZHVsZXMsIG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0aWYodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpXHJcblx0XHRcdFx0bW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgXCJcIl1dO1xyXG5cdFx0XHR2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpZCA9IHRoaXNbaV1bMF07XHJcblx0XHRcdFx0aWYodHlwZW9mIGlkID09PSBcIm51bWJlclwiKVxyXG5cdFx0XHRcdFx0YWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvcihpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaXRlbSA9IG1vZHVsZXNbaV07XHJcblx0XHRcdFx0Ly8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxyXG5cdFx0XHRcdC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IDEwMCUgcGVyZmVjdCBmb3Igd2VpcmQgbWVkaWEgcXVlcnkgY29tYmluYXRpb25zXHJcblx0XHRcdFx0Ly8gIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cclxuXHRcdFx0XHQvLyAgSSBob3BlIHRoaXMgd2lsbCBuZXZlciBvY2N1ciAoSGV5IHRoaXMgd2F5IHdlIGhhdmUgc21hbGxlciBidW5kbGVzKVxyXG5cdFx0XHRcdGlmKHR5cGVvZiBpdGVtWzBdICE9PSBcIm51bWJlclwiIHx8ICFhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XHJcblx0XHRcdFx0XHRpZihtZWRpYVF1ZXJ5ICYmICFpdGVtWzJdKSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmKG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0XHRcdFx0aXRlbVsyXSA9IFwiKFwiICsgaXRlbVsyXSArIFwiKSBhbmQgKFwiICsgbWVkaWFRdWVyeSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHRcdHJldHVybiBsaXN0O1xyXG5cdH07XHJcblxuXG4vKioqLyB9LFxuLyogNzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qXG5cdFx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcblx0XHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG5cdCovXG5cdHZhciBzdHlsZXNJbkRvbSA9IHt9LFxuXHRcdG1lbW9pemUgPSBmdW5jdGlvbihmbikge1xuXHRcdFx0dmFyIG1lbW87XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIG1lbW8gPT09IFwidW5kZWZpbmVkXCIpIG1lbW8gPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0XHRyZXR1cm4gbWVtbztcblx0XHRcdH07XG5cdFx0fSxcblx0XHRpc09sZElFID0gbWVtb2l6ZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiAvbXNpZSBbNi05XVxcYi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtcblx0XHR9KSxcblx0XHRnZXRIZWFkRWxlbWVudCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO1xuXHRcdH0pLFxuXHRcdHNpbmdsZXRvbkVsZW1lbnQgPSBudWxsLFxuXHRcdHNpbmdsZXRvbkNvdW50ZXIgPSAwLFxuXHRcdHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wID0gW107XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGxpc3QsIG9wdGlvbnMpIHtcblx0XHRpZihmYWxzZSkge1xuXHRcdFx0aWYodHlwZW9mIGRvY3VtZW50ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIik7XG5cdFx0fVxuXHRcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0XHQvLyBGb3JjZSBzaW5nbGUtdGFnIHNvbHV0aW9uIG9uIElFNi05LCB3aGljaCBoYXMgYSBoYXJkIGxpbWl0IG9uIHRoZSAjIG9mIDxzdHlsZT5cblx0XHQvLyB0YWdzIGl0IHdpbGwgYWxsb3cgb24gYSBwYWdlXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zLnNpbmdsZXRvbiA9PT0gXCJ1bmRlZmluZWRcIikgb3B0aW9ucy5zaW5nbGV0b24gPSBpc09sZElFKCk7XG5cdFxuXHRcdC8vIEJ5IGRlZmF1bHQsIGFkZCA8c3R5bGU+IHRhZ3MgdG8gdGhlIGJvdHRvbSBvZiA8aGVhZD4uXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zLmluc2VydEF0ID09PSBcInVuZGVmaW5lZFwiKSBvcHRpb25zLmluc2VydEF0ID0gXCJib3R0b21cIjtcblx0XG5cdFx0dmFyIHN0eWxlcyA9IGxpc3RUb1N0eWxlcyhsaXN0KTtcblx0XHRhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcblx0XHRcdHZhciBtYXlSZW1vdmUgPSBbXTtcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXHRcdFx0XHRkb21TdHlsZS5yZWZzLS07XG5cdFx0XHRcdG1heVJlbW92ZS5wdXNoKGRvbVN0eWxlKTtcblx0XHRcdH1cblx0XHRcdGlmKG5ld0xpc3QpIHtcblx0XHRcdFx0dmFyIG5ld1N0eWxlcyA9IGxpc3RUb1N0eWxlcyhuZXdMaXN0KTtcblx0XHRcdFx0YWRkU3R5bGVzVG9Eb20obmV3U3R5bGVzLCBvcHRpb25zKTtcblx0XHRcdH1cblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtYXlSZW1vdmUubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIGRvbVN0eWxlID0gbWF5UmVtb3ZlW2ldO1xuXHRcdFx0XHRpZihkb21TdHlsZS5yZWZzID09PSAwKSB7XG5cdFx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKVxuXHRcdFx0XHRcdFx0ZG9tU3R5bGUucGFydHNbal0oKTtcblx0XHRcdFx0XHRkZWxldGUgc3R5bGVzSW5Eb21bZG9tU3R5bGUuaWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRcblx0ZnVuY3Rpb24gYWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKSB7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblx0XHRcdGlmKGRvbVN0eWxlKSB7XG5cdFx0XHRcdGRvbVN0eWxlLnJlZnMrKztcblx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0ZG9tU3R5bGUucGFydHNbal0oaXRlbS5wYXJ0c1tqXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yKDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRkb21TdHlsZS5wYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIHBhcnRzID0gW107XG5cdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0cGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3R5bGVzSW5Eb21baXRlbS5pZF0gPSB7aWQ6IGl0ZW0uaWQsIHJlZnM6IDEsIHBhcnRzOiBwYXJ0c307XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdFxuXHRmdW5jdGlvbiBsaXN0VG9TdHlsZXMobGlzdCkge1xuXHRcdHZhciBzdHlsZXMgPSBbXTtcblx0XHR2YXIgbmV3U3R5bGVzID0ge307XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gbGlzdFtpXTtcblx0XHRcdHZhciBpZCA9IGl0ZW1bMF07XG5cdFx0XHR2YXIgY3NzID0gaXRlbVsxXTtcblx0XHRcdHZhciBtZWRpYSA9IGl0ZW1bMl07XG5cdFx0XHR2YXIgc291cmNlTWFwID0gaXRlbVszXTtcblx0XHRcdHZhciBwYXJ0ID0ge2NzczogY3NzLCBtZWRpYTogbWVkaWEsIHNvdXJjZU1hcDogc291cmNlTWFwfTtcblx0XHRcdGlmKCFuZXdTdHlsZXNbaWRdKVxuXHRcdFx0XHRzdHlsZXMucHVzaChuZXdTdHlsZXNbaWRdID0ge2lkOiBpZCwgcGFydHM6IFtwYXJ0XX0pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRuZXdTdHlsZXNbaWRdLnBhcnRzLnB1c2gocGFydCk7XG5cdFx0fVxuXHRcdHJldHVybiBzdHlsZXM7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBzdHlsZUVsZW1lbnQpIHtcblx0XHR2YXIgaGVhZCA9IGdldEhlYWRFbGVtZW50KCk7XG5cdFx0dmFyIGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wID0gc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3Bbc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AubGVuZ3RoIC0gMV07XG5cdFx0aWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwidG9wXCIpIHtcblx0XHRcdGlmKCFsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCkge1xuXHRcdFx0XHRoZWFkLmluc2VydEJlZm9yZShzdHlsZUVsZW1lbnQsIGhlYWQuZmlyc3RDaGlsZCk7XG5cdFx0XHR9IGVsc2UgaWYobGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpIHtcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoc3R5bGVFbGVtZW50LCBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5wdXNoKHN0eWxlRWxlbWVudCk7XG5cdFx0fSBlbHNlIGlmIChvcHRpb25zLmluc2VydEF0ID09PSBcImJvdHRvbVwiKSB7XG5cdFx0XHRoZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciAnaW5zZXJ0QXQnLiBNdXN0IGJlICd0b3AnIG9yICdib3R0b20nLlwiKTtcblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcblx0XHRzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdHZhciBpZHggPSBzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5pbmRleE9mKHN0eWxlRWxlbWVudCk7XG5cdFx0aWYoaWR4ID49IDApIHtcblx0XHRcdHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wLnNwbGljZShpZHgsIDEpO1xuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcblx0XHR2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdHN0eWxlRWxlbWVudC50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuXHRcdGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBzdHlsZUVsZW1lbnQpO1xuXHRcdHJldHVybiBzdHlsZUVsZW1lbnQ7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFkZFN0eWxlKG9iaiwgb3B0aW9ucykge1xuXHRcdHZhciBzdHlsZUVsZW1lbnQsIHVwZGF0ZSwgcmVtb3ZlO1xuXHRcblx0XHRpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcblx0XHRcdHZhciBzdHlsZUluZGV4ID0gc2luZ2xldG9uQ291bnRlcisrO1xuXHRcdFx0c3R5bGVFbGVtZW50ID0gc2luZ2xldG9uRWxlbWVudCB8fCAoc2luZ2xldG9uRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKSk7XG5cdFx0XHR1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCBmYWxzZSk7XG5cdFx0XHRyZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3R5bGVFbGVtZW50ID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuXHRcdFx0dXBkYXRlID0gYXBwbHlUb1RhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCk7XG5cdFx0XHRyZW1vdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XG5cdFx0dXBkYXRlKG9iaik7XG5cdFxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGVTdHlsZShuZXdPYmopIHtcblx0XHRcdGlmKG5ld09iaikge1xuXHRcdFx0XHRpZihuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXApXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR1cGRhdGUob2JqID0gbmV3T2JqKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0XG5cdHZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHRleHRTdG9yZSA9IFtdO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gKGluZGV4LCByZXBsYWNlbWVudCkge1xuXHRcdFx0dGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xuXHRcdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG5cdFx0fTtcblx0fSkoKTtcblx0XG5cdGZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcoc3R5bGVFbGVtZW50LCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcblx0XHR2YXIgY3NzID0gcmVtb3ZlID8gXCJcIiA6IG9iai5jc3M7XG5cdFxuXHRcdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcyk7XG5cdFx0XHR2YXIgY2hpbGROb2RlcyA9IHN0eWxlRWxlbWVudC5jaGlsZE5vZGVzO1xuXHRcdFx0aWYgKGNoaWxkTm9kZXNbaW5kZXhdKSBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdFx0aWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHN0eWxlRWxlbWVudC5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGNzc05vZGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gYXBwbHlUb1RhZyhzdHlsZUVsZW1lbnQsIG9iaikge1xuXHRcdHZhciBjc3MgPSBvYmouY3NzO1xuXHRcdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcblx0XHR2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblx0XG5cdFx0aWYgKG1lZGlhKSB7XG5cdFx0XHRzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEpO1xuXHRcdH1cblx0XG5cdFx0aWYgKHNvdXJjZU1hcCkge1xuXHRcdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kZXZ0b29scy9kb2NzL2phdmFzY3JpcHQtZGVidWdnaW5nXG5cdFx0XHQvLyB0aGlzIG1ha2VzIHNvdXJjZSBtYXBzIGluc2lkZSBzdHlsZSB0YWdzIHdvcmsgcHJvcGVybHkgaW4gQ2hyb21lXG5cdFx0XHRjc3MgKz0gJ1xcbi8qIyBzb3VyY2VVUkw9JyArIHNvdXJjZU1hcC5zb3VyY2VzWzBdICsgJyAqLyc7XG5cdFx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNjYwMzg3NVxuXHRcdFx0Y3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIiArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSkgKyBcIiAqL1wiO1xuXHRcdH1cblx0XG5cdFx0aWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG5cdFx0XHRzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aGlsZShzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuXHRcdFx0XHRzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuXHRcdFx0fVxuXHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuXHRcdH1cblx0fVxuXG5cbi8qKiovIH0sXG4vKiA4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgRFVSQVRJT04gPSAwOyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBkaXNtaXNzYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZHVyYXRpb246IHsgZGVmYXVsdDogRFVSQVRJT04gfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB2YWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICB3aWR0aDogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHZhbDogdGhpcy52YWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgZHVyYXRpb25OdW06IGZ1bmN0aW9uIGR1cmF0aW9uTnVtKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5udW1iZXIodGhpcy5kdXJhdGlvbiwgRFVSQVRJT04pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwpIHtcblx0ICAgICAgaWYgKF92YWwgJiYgdGhpcy5kdXJhdGlvbk51bSA+IDApIHtcblx0ICAgICAgICB0aGlzLl9kZWxheUNsb3NlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9kZWxheUNsb3NlID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMudmFsID0gZmFsc2U7XG5cdCAgICB9LCAnZHVyYXRpb25OdW0nKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IFwiZmFkZVwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLnZhbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwidmFsXCJcblx0ICAgIH1dLFxuXHQgICAgY2xhc3M6IFsnYWxlcnQnLCAnYWxlcnQtJyArIF92bS50eXBlLCBfdm0ucGxhY2VtZW50XSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImFsZXJ0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzbWlzc2FibGUpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc21pc3NhYmxlXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gZmFsc2Vcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1hZjdjMWY2YVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDgyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDgzKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODYpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQXNpZGUudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTNhNGJkZTI3XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zYTRiZGUyN1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEFzaWRlLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NCk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtM2E0YmRlMjchLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0FzaWRlLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtM2E0YmRlMjchLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0FzaWRlLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5hc2lkZS1vcGVuIHtcXHJcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzO1xcbn1cXG4uYXNpZGUtb3Blbi5oYXMtcHVzaC1yaWdodCB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTMwMHB4KTtcXG59XFxuLmFzaWRlIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDk7XFxyXFxuICBvdmVyZmxvdzogYXV0bztcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxufVxcbi5hc2lkZS5sZWZ0IHtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogYXV0bztcXG59XFxuLmFzaWRlLnJpZ2h0IHtcXHJcXG4gIGxlZnQ6IGF1dG87XFxyXFxuICByaWdodDogMDtcXG59XFxuLnNsaWRlbGVmdC1lbnRlciB7XFxyXFxuICB0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7XFxufVxcbi5zbGlkZWxlZnQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZWxlZnQtaW4gLjNzO1xcbn1cXG4uc2xpZGVsZWZ0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LW91dCAuM3M7XFxufVxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcbi5zbGlkZXJpZ2h0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVyaWdodC1pbiAuM3M7XFxufVxcbi5zbGlkZXJpZ2h0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVyaWdodC1vdXQgLjNzO1xcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlcmlnaHQtaW4ge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LW91dCB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXG4uYXNpZGU6Zm9jdXMge1xcclxcbiAgICBvdXRsaW5lOiAwO1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcXG4uYXNpZGUge1xcclxcbiAgICBtaW4td2lkdGg6IDI0MHB4O1xcbn1cXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciB7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDE2LjQzcHg7XFxyXFxuICBwYWRkaW5nOiA2cHggMTVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICMzMzdhYjc7XFxyXFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciAuY2xvc2Uge1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAtOHB4O1xcclxcbiAgcGFkZGluZzogNHB4IDhweDtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbiAgZm9udC1zaXplOiAyNXB4O1xcclxcbiAgb3BhY2l0eTogLjg7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1ib2R5IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIge1xcclxcbiAgcGFkZGluZzogMTVweDtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tYmxvY2srLmJ0bi1ibG9jayB7XFxyXFxuICBtYXJnaW4tbGVmdDogMDtcXG59XFxuLmFzaWRlLWJhY2tkcm9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYm90dG9tOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxufVxcbi5hc2lkZS1iYWNrZHJvcC5pbiB7XFxyXFxuICBvcGFjaXR5OiAuNTtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT01MCk7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQXNpZGUudnVlPzU3Mzk2MjFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrRkE7RUFDQSwyQkFBQTtDQUNBO0FBQ0E7RUFDQSw4QkFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLE9BQUE7RUFDQSxVQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7RUFDQSxRQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsU0FBQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7RUFDQSwyQkFBQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLDZCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLHlCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSw2QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7RUFDQSw2QkFBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLDRCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLHlCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSw0QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtBQUNBO0lBQ0EsaUJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxpQ0FBQTtFQUNBLG9CQUFBO0VBQ0Esa0JBQUE7RUFDQSxvQkFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtFQUNBLFlBQUE7RUFDQSxnQkFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxjQUFBO0NBQ0E7QUFDQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLDhCQUFBO0NBQ0E7QUFDQTtFQUNBLGlCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7Q0FDQTtBQUNBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLFFBQUE7RUFDQSxjQUFBO0VBQ0EsV0FBQTtFQUNBLDZCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLDBCQUFBO0NBQ0FcIixcImZpbGVcIjpcIkFzaWRlLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8dHJhbnNpdGlvbiA6bmFtZT1cXFwiJ3NsaWRlJyArIHBsYWNlbWVudFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlXFxcIiB2LWlmPVxcXCJzaG93XFxcIiA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aCsncHgnfVxcXCIgOmNsYXNzPVxcXCJwbGFjZW1lbnRcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWRpYWxvZ1xcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1jb250ZW50XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXNpZGUtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9J3RyaWdnZXJfY2xvc2UnPjxzcGFuPiZ0aW1lczs8L3NwYW4+PC9idXR0b24+XFxyXFxuICAgICAgICAgICAgPGg0IGNsYXNzPVxcXCJhc2lkZS10aXRsZVxcXCI+PHNsb3QgbmFtZT1cXFwiaGVhZGVyXFxcIj57eyBoZWFkZXIgfX08L3Nsb3Q+PC9oND5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWJvZHlcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gIDwvdHJhbnNpdGlvbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtnZXRTY3JvbGxCYXJXaWR0aH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGhlYWRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHBsYWNlbWVudDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ3JpZ2h0J30sXFxyXFxuICAgIHNob3c6IHt0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZX0sXFxyXFxuICAgIHdpZHRoOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzMjB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgc2hvdyAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KHRoaXMuc2hvdyA/ICdvcGVuJyA6ICdjbG9zZScpXFxyXFxuICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHlcXHJcXG4gICAgICBjb25zdCBzY3JvbGxCYXJXaWR0aCA9IGdldFNjcm9sbEJhcldpZHRoKClcXHJcXG4gICAgICBpZiAodmFsKSB7XFxyXFxuICAgICAgICBpZiAoIXRoaXMuX2JhY2tkcm9wKSB7XFxyXFxuICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCdcXHJcXG4gICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fYmFja2Ryb3ApXFxyXFxuICAgICAgICBib2R5LmNsYXNzTGlzdC5hZGQoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XFxyXFxuICAgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gc2Nyb2xsQmFyV2lkdGggKyAncHgnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XFxyXFxuICAgICAgICB2YXIgeCA9IHRoaXMuX2JhY2tkcm9wLmNsaWVudEhlaWdodFxcclxcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZCgnaW4nKVxcclxcbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkub24oJ2NsaWNrJywgKCkgPT4gdGhpcy50cmlnZ2VyX2Nsb3NlKCkpXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLm9uKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xcclxcbiAgICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vZmYoKVxcclxcbiAgICAgICAgICB0cnkge1xcclxcbiAgICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMCdcXHJcXG4gICAgICAgICAgICBib2R5LnJlbW92ZUNoaWxkKHRoaXMuX2JhY2tkcm9wKVxcclxcbiAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gbnVsbFxcclxcbiAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCdcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHRyaWdnZXIgKCkge1xcclxcbiAgICAgIHJldHVybiB7XFxyXFxuICAgICAgICBjbG9zZTogKCkgPT4gdGhpcy50cmlnZ2VyX2Nsb3NlKCksXFxyXFxuICAgICAgICBvcGVuOiAoKSA9PiB0aGlzLnRyaWdnZXJfb3BlbigpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB0cmlnZ2VyX2Nsb3NlICgpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCAnY2xvc2UnIClcXHJcXG4gICAgfSxcXHJcXG4gICAgdHJpZ2dlcl9vcGVuKCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoICdvcGVuJyApXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgdGhpcy4kZW1pdCgndHJpZ2dlcicsICgpID0+IHRoaXMudHJpZ2dlcilcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5hc2lkZS1vcGVuIHtcXHJcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzO1xcclxcbn1cXHJcXG4uYXNpZGUtb3Blbi5oYXMtcHVzaC1yaWdodCB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTMwMHB4KTtcXHJcXG59XFxyXFxuLmFzaWRlIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDk7XFxyXFxuICBvdmVyZmxvdzogYXV0bztcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxyXFxufVxcclxcbi5hc2lkZS5sZWZ0IHtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogYXV0bztcXHJcXG59XFxyXFxuLmFzaWRlLnJpZ2h0IHtcXHJcXG4gIGxlZnQ6IGF1dG87XFxyXFxuICByaWdodDogMDtcXHJcXG59XFxyXFxuLnNsaWRlbGVmdC1lbnRlciB7XFxyXFxuICB0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxufVxcclxcbi5zbGlkZWxlZnQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZWxlZnQtaW4gLjNzO1xcclxcbn1cXHJcXG4uc2xpZGVsZWZ0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LW91dCAuM3M7XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG4uc2xpZGVyaWdodC1lbnRlci1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtaW4gLjNzO1xcclxcbn1cXHJcXG4uc2xpZGVyaWdodC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtb3V0IC4zcztcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxufVxcclxcbi5hc2lkZTpmb2N1cyB7XFxyXFxuICAgIG91dGxpbmU6IDA7XFxyXFxufVxcclxcbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xcclxcbiAgLmFzaWRlIHtcXHJcXG4gICAgbWluLXdpZHRoOiAyNDBweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciB7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDE2LjQzcHg7XFxyXFxuICBwYWRkaW5nOiA2cHggMTVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICMzMzdhYjc7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciAuY2xvc2Uge1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAtOHB4O1xcclxcbiAgcGFkZGluZzogNHB4IDhweDtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbiAgZm9udC1zaXplOiAyNXB4O1xcclxcbiAgb3BhY2l0eTogLjg7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1ib2R5IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIge1xcclxcbiAgcGFkZGluZzogMTVweDtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tYmxvY2srLmJ0bi1ibG9jayB7XFxyXFxuICBtYXJnaW4tbGVmdDogMDtcXHJcXG59XFxyXFxuLmFzaWRlLWJhY2tkcm9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYm90dG9tOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxyXFxufVxcclxcbi5hc2lkZS1iYWNrZHJvcC5pbiB7XFxyXFxuICBvcGFjaXR5OiAuNTtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT01MCk7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiA4NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdyaWdodCcgfSxcblx0ICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMzIwIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCwgb2xkKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQodGhpcy5zaG93ID8gJ29wZW4nIDogJ2Nsb3NlJyk7XG5cdCAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcblx0ICAgICAgdmFyIHNjcm9sbEJhcldpZHRoID0gKDAsIF91dGlscy5nZXRTY3JvbGxCYXJXaWR0aCkoKTtcblx0ICAgICAgaWYgKHZhbCkge1xuXHQgICAgICAgIGlmICghdGhpcy5fYmFja2Ryb3ApIHtcblx0ICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCc7XG5cdCAgICAgICAgYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9iYWNrZHJvcCk7XG5cdCAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XG5cdCAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4Jztcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxuXHQgICAgICAgIHZhciB4ID0gdGhpcy5fYmFja2Ryb3AuY2xpZW50SGVpZ2h0O1xuXHQgICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ2luJyk7XG5cdCAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fYmFja2Ryb3ApLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpcy50cmlnZ2VyX2Nsb3NlKCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fYmFja2Ryb3ApLm9uKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoX3RoaXMuX2JhY2tkcm9wKS5vZmYoKTtcblx0ICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpO1xuXHQgICAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcwJztcblx0ICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZChfdGhpcy5fYmFja2Ryb3ApO1xuXHQgICAgICAgICAgICBfdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuXHQgICAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICB0cmlnZ2VyOiBmdW5jdGlvbiB0cmlnZ2VyKCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzMi50cmlnZ2VyX2Nsb3NlKCk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBvcGVuOiBmdW5jdGlvbiBvcGVuKCkge1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzMi50cmlnZ2VyX29wZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICB9LFxuXHQgICAgdHJpZ2dlcl9jbG9zZTogZnVuY3Rpb24gdHJpZ2dlcl9jbG9zZSgpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnY2xvc2UnKTtcblx0ICAgIH0sXG5cdCAgICB0cmlnZ2VyX29wZW46IGZ1bmN0aW9uIHRyaWdnZXJfb3BlbigpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnb3BlbicpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgIHRoaXMuJGVtaXQoJ3RyaWdnZXInLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiBfdGhpczMudHJpZ2dlcjtcblx0ICAgIH0pO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogJ3NsaWRlJyArIF92bS5wbGFjZW1lbnRcblx0ICAgIH1cblx0ICB9LCBbKF92bS5zaG93KSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGVcIixcblx0ICAgIGNsYXNzOiBfdm0ucGxhY2VtZW50LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ud2lkdGggKyAncHgnXG5cdCAgICB9KVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWRpYWxvZ1wiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtY29udGVudFwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtaGVhZGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS50cmlnZ2VyX2Nsb3NlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnaDQnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhc2lkZS10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl92KF92bS5fcyhfdm0uaGVhZGVyKSldKV0sIDIpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtYm9keVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXSldKSA6IF92bS5fZSgpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtM2E0YmRlMjdcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA4NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OClcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxCdXR0b25Hcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMTI1ZWIwYzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTEyNWViMGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQnV0dG9uR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBidXR0b25zOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBqdXN0aWZpZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZlcnRpY2FsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBidG5Hcm91cDogZnVuY3Rpb24gYnRuR3JvdXAoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIC8vIHRoaXMgd2lsbCB1cGRhdGUgRVhURVJOQUwgdi1tb2RlbCB3aGVuIG91ciB2YWwgY2hhbmdlc1xuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIF92YWwpO1xuXHQgICAgfSxcblx0XG5cdCAgICAvLyB0aGlzIHdpbGwgdXBkYXRlIG91ciBJTlRFUk5BTCB2YWwsIHdoZW4gc29tZXRoaW5nIGV4dGVybmFsIGNoYW5nZXMgb3VyIHYtbW9kZWxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogODkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgJ2J0bi1ncm91cCc6IF92bS5idXR0b25zLCAnYnRuLWdyb3VwLWp1c3RpZmllZCc6IF92bS5qdXN0aWZpZWQsICdidG4tZ3JvdXAtdmVydGljYWwnOiBfdm0udmVydGljYWxcblx0ICAgIH0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImRhdGEtdG9nZ2xlXCI6IF92bS5idXR0b25zICYmICdidXR0b25zJ1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMTI1ZWIwYzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA5MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg5MSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXENhcm91c2VsLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtMzIyZGVlNDFcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTMyMmRlZTQxXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zMjJkZWU0MVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIENhcm91c2VsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDkxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMzIyZGVlNDEmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0Nhcm91c2VsLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMzIyZGVlNDEmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0Nhcm91c2VsLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDkyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5jYXJvdXNlbC1jb250cm9sW2RhdGEtdi0zMjJkZWU0MV0ge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0Nhcm91c2VsLnZ1ZT8yZjQ0NjM0MlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBNEdBO0VBQ0EsZ0JBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2Fyb3VzZWwudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG48ZGl2IGNsYXNzPVxcXCJjYXJvdXNlbCBzbGlkZVxcXCIgZGF0YS1yaWRlPVxcXCJjYXJvdXNlbFxcXCI+XFxyXFxuICA8IS0tIEluZGljYXRvcnMgLS0+XFxyXFxuICA8b2wgY2xhc3M9XFxcImNhcm91c2VsLWluZGljYXRvcnNcXFwiIHYtc2hvdz1cXFwiaW5kaWNhdG9yc1xcXCI+XFxyXFxuICAgIDxsaSB2LWZvcj1cXFwiKGluZGljYXRvcixpKSBpbiBpbmRpY2F0b3JfbGlzdFxcXCIgQGNsaWNrPVxcXCJpbmRpY2F0b3JDbGljayhpKVxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmkgPT09IGluZGV4fVxcXCI+PHNwYW4+PC9zcGFuPjwvbGk+XFxyXFxuICA8L29sPlxcclxcbiAgPCEtLSBXcmFwcGVyIGZvciBzbGlkZXMgLS0+XFxyXFxuICA8ZGl2IGNsYXNzPVxcXCJjYXJvdXNlbC1pbm5lclxcXCIgcm9sZT1cXFwibGlzdGJveFxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gIDwvZGl2PlxcclxcbiAgPCEtLSBDb250cm9scyAtLT5cXHJcXG4gIDxkaXYgdi1zaG93PVxcXCJjb250cm9sc1xcXCIgY2xhc3M9XFxcImNhcm91c2VsLWNvbnRyb2xzIGhpZGRlbi14c1xcXCI+XFxyXFxuICAgIDxhIGNsYXNzPVxcXCJsZWZ0IGNhcm91c2VsLWNvbnRyb2xcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCIgQGNsaWNrPVxcXCJwcmV2XFxcIj5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnRcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvYT5cXHJcXG4gICAgPGEgY2xhc3M9XFxcInJpZ2h0IGNhcm91c2VsLWNvbnRyb2xcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCIgQGNsaWNrPVxcXCJuZXh0XFxcIj5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0XFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICA8L2E+XFxyXFxuICA8L2Rpdj5cXHJcXG48L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG4vLyBsZXQgY29lcmNlID0ge1xcclxcbi8vICAgaW50ZXJ2YWw6ICdudW1iZXInXFxyXFxuLy8gfVxcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGluZGljYXRvcnM6IHtcXHJcXG4gICAgICB0eXBlOiBCb29sZWFuLFxcclxcbiAgICAgIGRlZmF1bHQ6IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgY29udHJvbHM6IHtcXHJcXG4gICAgICB0eXBlOiBCb29sZWFuLFxcclxcbiAgICAgIGRlZmF1bHQ6IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgaW50ZXJ2YWw6IHtcXHJcXG4gICAgICB0eXBlOiBOdW1iZXIsXFxyXFxuICAgICAgZGVmYXVsdDogNTAwMFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgaW5kaWNhdG9yX2xpc3Q6IFtdLFxcclxcbiAgICAgIGluZGV4OiAwLFxcclxcbiAgICAgIGlzQW5pbWF0aW5nOiBmYWxzZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKG5ld1ZhbCwgb2xkVmFsKSB7XFxyXFxuICAgICAgdGhpcy5zbGlkZShuZXdWYWwgPiBvbGRWYWwgPyAnbGVmdCcgOiAncmlnaHQnLCBuZXdWYWwsIG9sZFZhbClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaW5kaWNhdG9yQ2xpY2sgKGluZGV4KSB7XFxyXFxuICAgICAgaWYgKHRoaXMuaXNBbmltYXRpbmcgfHwgdGhpcy5pbmRleCA9PT0gaW5kZXgpIHJldHVybiBmYWxzZVxcclxcbiAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5pbmRleCA9IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIHNsaWRlIChkaXJlY3Rpb24sIG5leHQsIHByZXYpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuJGVsKSB7IHJldHVybiB9XFxyXFxuICAgICAgY29uc3QgJHNsaWRlciA9ICQoJy5pdGVtJywgdGhpcy4kZWwpXFxyXFxuICAgICAgaWYgKCEkc2xpZGVyLmxlbmd0aCkgeyByZXR1cm4gfVxcclxcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gJHNsaWRlcltuZXh0XSB8fCAkc2xpZGVyWzBdXFxyXFxuICAgICAgJChzZWxlY3RlZCkuYWRkQ2xhc3MoZGlyZWN0aW9uID09PSAnbGVmdCcgPyAnbmV4dCcgOiAncHJldicpXFxyXFxuICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxcclxcbiAgICAgIHZhciB4ID0gc2VsZWN0ZWQuY2xpZW50SGVpZ2h0XFxyXFxuICAgICAgJChbJHNsaWRlcltwcmV2XSwgc2VsZWN0ZWRdKS5hZGRDbGFzcyhkaXJlY3Rpb24pLm9uKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xcclxcbiAgICAgICAgJHNsaWRlci5vZmYoJ3RyYW5zaXRpb25lbmQnKS5jbGFzc05hbWUgPSAnaXRlbSdcXHJcXG4gICAgICAgICQoc2VsZWN0ZWQpLmFkZENsYXNzKCdhY3RpdmUnKVxcclxcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgbmV4dCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ICsgMSA8ICQoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCA/IHRoaXMuaW5kZXggKz0gMSA6IHRoaXMuaW5kZXggPSAwXFxyXFxuICAgIH0sXFxyXFxuICAgIHByZXYgKCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwgfHwgdGhpcy5pc0FuaW1hdGluZykgeyByZXR1cm4gZmFsc2UgfVxcclxcbiAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5pbmRleCA9PT0gMCA/IHRoaXMuaW5kZXggPSAkKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggLSAxIDogdGhpcy5pbmRleCAtPSAxXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZUludGVydmFsICh2YWwpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdmFsID0gdGhpcy5faW50ZXJ2YWxJRCB9XFxyXFxuICAgICAgaWYodGhpcy5faW50ZXJ2YWxJRCkge1xcclxcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbElEKVxcclxcbiAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVydmFsSURcXHJcXG4gICAgICB9XFxyXFxuICAgICAgaWYodmFsICYmIHRoaXMuaW50ZXJ2YWwgPiAwKSB7XFxyXFxuICAgICAgICB0aGlzLl9pbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwodGhpcy5uZXh0LCB0aGlzLmludGVydmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpXFxyXFxuICAgICQodGhpcy4kZWwpLm9uKCdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSkpLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy50b2dnbGVJbnRlcnZhbCh0cnVlKSlcXHJcXG4gIH0sXFxyXFxuICBiZWZvcmVEZXN0cm95ICgpIHtcXHJcXG4gICAgdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSlcXHJcXG4gICAgJCh0aGlzLiRlbCkub2ZmKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5jYXJvdXNlbC1jb250cm9sIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDkzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly8gbGV0IGNvZXJjZSA9IHtcblx0Ly8gICBpbnRlcnZhbDogJ251bWJlcidcblx0Ly8gfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBpbmRpY2F0b3JzOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IHRydWVcblx0ICAgIH0sXG5cdCAgICBjb250cm9sczoge1xuXHQgICAgICB0eXBlOiBCb29sZWFuLFxuXHQgICAgICBkZWZhdWx0OiB0cnVlXG5cdCAgICB9LFxuXHQgICAgaW50ZXJ2YWw6IHtcblx0ICAgICAgdHlwZTogTnVtYmVyLFxuXHQgICAgICBkZWZhdWx0OiA1MDAwXG5cdCAgICB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kaWNhdG9yX2xpc3Q6IFtdLFxuXHQgICAgICBpbmRleDogMCxcblx0ICAgICAgaXNBbmltYXRpbmc6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBpbmRleDogZnVuY3Rpb24gaW5kZXgobmV3VmFsLCBvbGRWYWwpIHtcblx0ICAgICAgdGhpcy5zbGlkZShuZXdWYWwgPiBvbGRWYWwgPyAnbGVmdCcgOiAncmlnaHQnLCBuZXdWYWwsIG9sZFZhbCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBpbmRpY2F0b3JDbGljazogZnVuY3Rpb24gaW5kaWNhdG9yQ2xpY2soaW5kZXgpIHtcblx0ICAgICAgaWYgKHRoaXMuaXNBbmltYXRpbmcgfHwgdGhpcy5pbmRleCA9PT0gaW5kZXgpIHJldHVybiBmYWxzZTtcblx0ICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcblx0ICAgIH0sXG5cdCAgICBzbGlkZTogZnVuY3Rpb24gc2xpZGUoZGlyZWN0aW9uLCBuZXh0LCBwcmV2KSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMuJGVsKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciAkc2xpZGVyID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5pdGVtJywgdGhpcy4kZWwpO1xuXHQgICAgICBpZiAoISRzbGlkZXIubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBzZWxlY3RlZCA9ICRzbGlkZXJbbmV4dF0gfHwgJHNsaWRlclswXTtcblx0ICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoc2VsZWN0ZWQpLmFkZENsYXNzKGRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJ25leHQnIDogJ3ByZXYnKTtcblx0ICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxuXHQgICAgICB2YXIgeCA9IHNlbGVjdGVkLmNsaWVudEhlaWdodDtcblx0ICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoWyRzbGlkZXJbcHJldl0sIHNlbGVjdGVkXSkuYWRkQ2xhc3MoZGlyZWN0aW9uKS5vbigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAkc2xpZGVyLm9mZigndHJhbnNpdGlvbmVuZCcpLmNsYXNzTmFtZSA9ICdpdGVtJztcblx0ICAgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShzZWxlY3RlZCkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXHQgICAgICAgIF90aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG5cdCAgICAgIGlmICghdGhpcy4kZWwgfHwgdGhpcy5pc0FuaW1hdGluZykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5pbmRleCArIDEgPCAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLml0ZW0nLCB0aGlzLiRlbCkubGVuZ3RoID8gdGhpcy5pbmRleCArPSAxIDogdGhpcy5pbmRleCA9IDA7XG5cdCAgICB9LFxuXHQgICAgcHJldjogZnVuY3Rpb24gcHJldigpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLmluZGV4ID09PSAwID8gdGhpcy5pbmRleCA9ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggLSAxIDogdGhpcy5pbmRleCAtPSAxO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZUludGVydmFsOiBmdW5jdGlvbiB0b2dnbGVJbnRlcnZhbCh2YWwpIHtcblx0ICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgdmFsID0gdGhpcy5faW50ZXJ2YWxJRDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5faW50ZXJ2YWxJRCkge1xuXHQgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWxJRCk7XG5cdCAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVydmFsSUQ7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbCAmJiB0aGlzLmludGVydmFsID4gMCkge1xuXHQgICAgICAgIHRoaXMuX2ludGVydmFsSUQgPSBzZXRJbnRlcnZhbCh0aGlzLm5leHQsIHRoaXMuaW50ZXJ2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgdGhpcy50b2dnbGVJbnRlcnZhbCh0cnVlKTtcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuJGVsKS5vbignbW91c2VlbnRlcicsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzMi50b2dnbGVJbnRlcnZhbChmYWxzZSk7XG5cdCAgICB9KS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzMi50b2dnbGVJbnRlcnZhbCh0cnVlKTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIHRoaXMudG9nZ2xlSW50ZXJ2YWwoZmFsc2UpO1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy4kZWwpLm9mZignbW91c2VlbnRlciBtb3VzZWxlYXZlJyk7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogOTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2Fyb3VzZWwgc2xpZGVcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiZGF0YS1yaWRlXCI6IFwiY2Fyb3VzZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ29sJywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmluZGljYXRvcnMpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImluZGljYXRvcnNcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1pbmRpY2F0b3JzXCJcblx0ICB9LCBfdm0uX2woKF92bS5pbmRpY2F0b3JfbGlzdCksIGZ1bmN0aW9uKGluZGljYXRvciwgaSkge1xuXHQgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgYWN0aXZlOiBpID09PSBfdm0uaW5kZXhcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLmluZGljYXRvckNsaWNrKGkpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdzcGFuJyldKVxuXHQgIH0pKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1pbm5lclwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwibGlzdGJveFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY29udHJvbHMpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNvbnRyb2xzXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2Fyb3VzZWwtY29udHJvbHMgaGlkZGVuLXhzXCJcblx0ICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibGVmdCBjYXJvdXNlbC1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnByZXZcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2EnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJyaWdodCBjYXJvdXNlbC1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLm5leHRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0XCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIyZGVlNDFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA5NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg5Nilcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXENoZWNrYm94LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtNjkyMmJmMjRcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTY5MjJiZjI0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi02OTIyYmYyNFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIENoZWNrYm94LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDk2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Nyk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjkyMmJmMjQmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0NoZWNrYm94LnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjkyMmJmMjQmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0NoZWNrYm94LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDk3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbmxhYmVsLmNoZWNrYm94W2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxOHB4O1xcbn1cXG5sYWJlbC5jaGVja2JveCA+IGlucHV0W2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHotaW5kZXg6IC0xO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICBtYXJnaW46IDA7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4ycmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgbGluZS1oZWlnaHQ6MXJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjM1cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxufVxcbmxhYmVsLmNoZWNrYm94Om5vdCguYWN0aXZlKSA+IC5pY29uW2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjNjZhZmU5O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxubGFiZWwuY2hlY2tib3guYWN0aXZlID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCM2FXUjBhRDBpTnlJZ2FHVnBaMmgwUFNJM0lqNDhjR0YwYUNCbWFXeHNQU0lqWm1abUlpQmtQU0p0TlM0M015d3dMalV5YkMwekxqRXlOREl5TERNdU16UXhOakZzTFRFdU16TTRPVFVzTFRFdU5ETXlNVEpzTFRFdU1qUTVOamtzTVM0ek16WTJOV3d5TGpVNE9EWXpMREl1TnpZNE56WnNOQzR6TnpNNUxDMDBMalkzT0RJMmJDMHhMakkwT1RZNUxDMHhMak16TmpZMWJEQXNNR3d3TGpBd01EQXlMREF1TURBd01ERjZJaTgrUEM5emRtYyspO1xcbn1cXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgLmJ0bi1kZWZhdWx0W2RhdGEtdi02OTIyYmYyNF0geyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTtcXG59XFxubGFiZWwuY2hlY2tib3guZGlzYWJsZWRbZGF0YS12LTY5MjJiZjI0XSxcXHJcXG5sYWJlbC5jaGVja2JveC5yZWFkb25seVtkYXRhLXYtNjkyMmJmMjRdLFxcclxcbi5idG4ucmVhZG9ubHlbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NjUpO1xcclxcbiAgYm94LXNoYWRvdzogbm9uZTtcXHJcXG4gIG9wYWNpdHk6IC42NTtcXG59XFxubGFiZWwuYnRuID4gaW5wdXRbdHlwZT1jaGVja2JveF1bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQ2hlY2tib3gudnVlPzU4YTFlNWM0XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF1RkE7RUFDQSxtQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSxVQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFFBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtFQUNBLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSxzQkFBQTtFQUNBLDZCQUFBO0VBQ0EsbUNBQUE7RUFDQSx5QkFBQTtDQUNBO0FBQ0E7RUFDQSx1QkFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7RUFDQSwwQkFBQTtFQUNBLDBFQUFBO0NBQ0E7QUFDQTtFQUNBLDJCQUFBO0VBQ0Esa1pBQUE7Q0FDQTtBQUNBLHNEQUFBLHdCQUFBO0NBQUE7QUFFQTs7O0VBR0EsMEJBQUE7RUFDQSxpQkFBQTtFQUNBLGFBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0NBQ0FcIixcImZpbGVcIjpcIkNoZWNrYm94LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8YSA6aXM9XFxcImlzQnV0dG9uPydhJzonbGFiZWwnXFxcIiBAY2xpY2s9XFxcInRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbaXNCdXR0b24/J2J0biBidG4tJyt0eXBlQ29sb3I6J29wZW4gY2hlY2tib3ggJyt0eXBlQ29sb3Ise2FjdGl2ZTpjaGVja2VkLGRpc2FibGVkOmRpc2FibGVkLHJlYWRvbmx5OnJlYWRvbmx5fV1cXFwiPlxcclxcbiAgICA8aW5wdXQgdi1pZj1cXFwibmFtZVxcXCIgdHlwZT1cXFwiaGlkZGVuXFxcIiA6bmFtZT1cXFwibmFtZVxcXCIgOnZhbHVlPVxcXCJjaGVja2VkP3RydWVWYWx1ZTpmYWxzZVZhbHVlXFxcIiAvPlxcclxcbiAgICA8c3BhbiB2LWlmPVxcXCIhaXNCdXR0b25cXFwiIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbY2hlY2tlZD8nYnRuLScrdHlwZUNvbG9yOicnLHtiZzp0eXBlQ29sb3I9PT0nZGVmYXVsdCd9XVxcXCI+PC9zcGFuPlxcclxcbiAgICA8c3BhbiB2LWlmPVxcXCIhaXNCdXR0b24mJmNoZWNrZWQmJnR5cGVDb2xvcj09PSdkZWZhdWx0J1xcXCIgY2xhc3M9XFxcImljb25cXFwiPjwvc3Bhbj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgPC9hPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBidXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBmYWxzZVZhbHVlOiB7ZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHRydWVWYWx1ZToge2RlZmF1bHQ6IHRydWV9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBmYWxzZX1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjaGVja2VkOiAodGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWUpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBpbkdyb3VwICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuYnRuR3JvdXAgJiYgIXRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCB9LFxcclxcbiAgICBpc0J1dHRvbiAoKSB7IHJldHVybiB0aGlzLmJ1dHRvbiB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucykgfSxcXHJcXG4gICAgaXNGYWxzZSAoKSB7IHJldHVybiB0aGlzLnZhbHVlID09PSB0aGlzLmZhbHNlVmFsdWUgfSxcXHJcXG4gICAgaXNUcnVlICgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT09IHRoaXMudHJ1ZVZhbHVlIH0sXFxyXFxuICAgIHBhcmVudFZhbHVlICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC52YWwgfSxcXHJcXG4gICAgdHlwZUNvbG9yICgpIHsgcmV0dXJuICh0aGlzLnR5cGUgfHwgKHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSkpIHx8ICdkZWZhdWx0JyB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgY2hlY2tlZCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB2YXIgdmFsdWUgPSB2YWwgPyB0aGlzLnRydWVWYWx1ZSA6IHRoaXMuZmFsc2VWYWx1ZVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB2YWwpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XFxyXFxuICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJlbnRWYWx1ZSAodmFsKSB7XFxyXFxuICAgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICAgIHBhcmVudC5fY2hlY2tib3hHcm91cCA9IHRydWVcXHJcXG4gICAgICBpZiAoIShwYXJlbnQudmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7IHBhcmVudC52YWwgPSBbXSB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICAvLyBjYWxsZWQgQCBtb3VudGVkKCksIG9yIHdoZW5ldmVyICRwYXJlbnQudmFsIGNoYW5nZXNcXHJcXG4gICAgLy8gc3luYyBvdXIgc3RhdGUgd2l0aCB0aGUgJHBhcmVudC52YWxcXHJcXG4gICAgdXBkYXRlRnJvbVBhcmVudCgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XFxyXFxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodGhpcy50cnVlVmFsdWUpXFxyXFxuICAgICAgICB0aGlzLmNoZWNrZWQgPSB+aW5kZXhcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIC8vIGNhbGxlZCB3aGVuIG91ciBjaGVja2VkIHN0YXRlIGNoYW5nZXNcXHJcXG4gICAgdXBkYXRlUGFyZW50KCkge1xcclxcbiAgICAgIGlmICh0aGlzLmluR3JvdXApIHtcXHJcXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuJHBhcmVudC52YWwuaW5kZXhPZih0aGlzLnRydWVWYWx1ZSlcXHJcXG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWQgJiYgIX5pbmRleCkgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHRoaXMudHJ1ZVZhbHVlKVxcclxcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWRcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbmxhYmVsLmNoZWNrYm94IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmctbGVmdDogMThweDtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3ggPiBpbnB1dCB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3ggPiAuaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4ycmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgbGluZS1oZWlnaHQ6MXJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjM1cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94Om5vdCguYWN0aXZlKSA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCM2FXUjBhRDBpTnlJZ2FHVnBaMmgwUFNJM0lqNDhjR0YwYUNCbWFXeHNQU0lqWm1abUlpQmtQU0p0TlM0M015d3dMalV5YkMwekxqRXlOREl5TERNdU16UXhOakZzTFRFdU16TTRPVFVzTFRFdU5ETXlNVEpzTFRFdU1qUTVOamtzTVM0ek16WTJOV3d5TGpVNE9EWXpMREl1TnpZNE56WnNOQzR6TnpNNUxDMDBMalkzT0RJMmJDMHhMakkwT1RZNUxDMHhMak16TmpZMWJEQXNNR3d3TGpBd01EQXlMREF1TURBd01ERjZJaTgrUEM5emRtYyspO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgLmJ0bi1kZWZhdWx0IHsgZmlsdGVyOiBicmlnaHRuZXNzKDc1JSk7IH1cXHJcXG5cXHJcXG5sYWJlbC5jaGVja2JveC5kaXNhYmxlZCxcXHJcXG5sYWJlbC5jaGVja2JveC5yZWFkb25seSxcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcclxcbn1cXHJcXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPWNoZWNrYm94XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiA5OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGZhbHNlVmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdHJ1ZVZhbHVlOiB7IGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB2YWx1ZTogeyBkZWZhdWx0OiBmYWxzZSB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2hlY2tlZDogdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluR3JvdXA6IGZ1bmN0aW9uIGluR3JvdXAoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LmJ0bkdyb3VwICYmICF0aGlzLiRwYXJlbnQuX3JhZGlvR3JvdXA7XG5cdCAgICB9LFxuXHQgICAgaXNCdXR0b246IGZ1bmN0aW9uIGlzQnV0dG9uKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICBpc0ZhbHNlOiBmdW5jdGlvbiBpc0ZhbHNlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5mYWxzZVZhbHVlO1xuXHQgICAgfSxcblx0ICAgIGlzVHJ1ZTogZnVuY3Rpb24gaXNUcnVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LnZhbDtcblx0ICAgIH0sXG5cdCAgICB0eXBlQ29sb3I6IGZ1bmN0aW9uIHR5cGVDb2xvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIGNoZWNrZWQ6IGZ1bmN0aW9uIGNoZWNrZWQodmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gdmFsID8gdGhpcy50cnVlVmFsdWUgOiB0aGlzLmZhbHNlVmFsdWU7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcblx0ICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJlbnRWYWx1ZTogZnVuY3Rpb24gcGFyZW50VmFsdWUodmFsKSB7XG5cdCAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgY2hlY2tlZCA9IHZhbCA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcblx0ICAgICAgICB0aGlzLmNoZWNrZWQgPSBjaGVja2VkO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgICBwYXJlbnQuX2NoZWNrYm94R3JvdXAgPSB0cnVlO1xuXHQgICAgICBpZiAoIShwYXJlbnQudmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7XG5cdCAgICAgICAgcGFyZW50LnZhbCA9IFtdO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XG5cdCAgfSxcblx0XG5cdCAgbWV0aG9kczoge1xuXHQgICAgLy8gY2FsbGVkIEAgbW91bnRlZCgpLCBvciB3aGVuZXZlciAkcGFyZW50LnZhbCBjaGFuZ2VzXG5cdCAgICAvLyBzeW5jIG91ciBzdGF0ZSB3aXRoIHRoZSAkcGFyZW50LnZhbFxuXHQgICAgdXBkYXRlRnJvbVBhcmVudDogZnVuY3Rpb24gdXBkYXRlRnJvbVBhcmVudCgpIHtcblx0ICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICAgIHZhciBpbmRleCA9IHRoaXMuJHBhcmVudC52YWwuaW5kZXhPZih0aGlzLnRydWVWYWx1ZSk7XG5cdCAgICAgICAgdGhpcy5jaGVja2VkID0gfmluZGV4O1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHRcblx0ICAgIC8vIGNhbGxlZCB3aGVuIG91ciBjaGVja2VkIHN0YXRlIGNoYW5nZXNcblx0ICAgIHVwZGF0ZVBhcmVudDogZnVuY3Rpb24gdXBkYXRlUGFyZW50KCkge1xuXHQgICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudHJ1ZVZhbHVlKTtcblx0ICAgICAgICBpZiAodGhpcy5jaGVja2VkICYmICF+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwucHVzaCh0aGlzLnRydWVWYWx1ZSk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnNwbGljZShpbmRleCwgMSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcblx0ICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDk5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoX3ZtLmlzQnV0dG9uID8gJ2EnIDogJ2xhYmVsJywge1xuXHQgICAgdGFnOiBcImFcIixcblx0ICAgIGNsYXNzOiBbX3ZtLmlzQnV0dG9uID8gJ2J0biBidG4tJyArIF92bS50eXBlQ29sb3IgOiAnb3BlbiBjaGVja2JveCAnICsgX3ZtLnR5cGVDb2xvciwge1xuXHQgICAgICBhY3RpdmU6IF92bS5jaGVja2VkLFxuXHQgICAgICBkaXNhYmxlZDogX3ZtLmRpc2FibGVkLFxuXHQgICAgICByZWFkb25seTogX3ZtLnJlYWRvbmx5XG5cdCAgICB9XSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnRvZ2dsZVxuXHQgICAgfVxuXHQgIH0sIFsoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5jaGVja2VkID8gX3ZtLnRydWVWYWx1ZSA6IF92bS5mYWxzZVZhbHVlXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKCFfdm0uaXNCdXR0b24pID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbiBkcm9wZG93bi10b2dnbGVcIixcblx0ICAgIGNsYXNzOiBbX3ZtLmNoZWNrZWQgPyAnYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJycsIHtcblx0ICAgICAgYmc6IF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0J1xuXHQgICAgfV1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoIV92bS5pc0J1dHRvbiAmJiBfdm0uY2hlY2tlZCAmJiBfdm0udHlwZUNvbG9yID09PSAnZGVmYXVsdCcpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY5MjJiZjI0XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcRGF0ZXBpY2tlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNDc3YjhlNWRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTQ3N2I4ZTVkXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRGF0ZXBpY2tlci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDc3YjhlNWQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0RhdGVwaWNrZXIudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi00NzdiOGU1ZCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vRGF0ZXBpY2tlci52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmRhdGVwaWNrZXIge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5pbnB1dC5kYXRlcGlja2VyLWlucHV0LndpdGgtcmVzZXQtYnV0dG9uIHtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDI1cHg7XFxufVxcbi5kYXRlcGlja2VyID4gYnV0dG9uLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5kYXRlcGlja2VyID4gYnV0dG9uLmNsb3NlOmZvY3VzIHtcXHJcXG4gIG9wYWNpdHk6IC4yO1xcbn1cXG4uZGF0ZXBpY2tlci1wb3B1cCB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgYmFja2dyb3VuZDogI2ZmZjtcXHJcXG4gIG1hcmdpbi10b3A6IDJweDtcXHJcXG4gIHotaW5kZXg6IDEwMDA7XFxyXFxuICBib3gtc2hhZG93OiAwIDZweCAxMnB4IHJnYmEoMCwwLDAsMC4xNzUpO1xcbn1cXG4uZGF0ZXBpY2tlci1pbm5lciB7XFxyXFxuICB3aWR0aDogMjE4cHg7XFxufVxcbi5kYXRlcGlja2VyLWJvZHkge1xcclxcbiAgcGFkZGluZzogMTBweCAxMHB4O1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHAsXFxyXFxuLmRhdGVwaWNrZXItY3RybCBzcGFuLFxcclxcbi5kYXRlcGlja2VyLWJvZHkgc3BhbiB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICB3aWR0aDogMjhweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyOHB4O1xcclxcbiAgaGVpZ2h0OiAyOHB4O1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHAge1xcclxcbiAgd2lkdGg6IDY1JTtcXG59XFxuLmRhdGVwaWNrZXItY3RybCBzcGFuIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuIHtcXHJcXG4gIHdpZHRoOiA0OHB4O1xcclxcbiAgaGVpZ2h0OiA1MHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDQ1cHg7XFxufVxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7XFxyXFxuICBjdXJzb3I6IG5vdC1hbGxvd2VkIWltcG9ydGFudDtcXG59XFxuLmRlY2FkZVJhbmdlIHNwYW46Zmlyc3QtY2hpbGQsXFxyXFxuLmRlY2FkZVJhbmdlIHNwYW46bGFzdC1jaGlsZCxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUsXFxyXFxuLmRhdGVwaWNrZXItaXRlbS1ncmF5IHtcXHJcXG4gIGNvbG9yOiAjOTk5O1xcbn1cXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmU6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlIHtcXHJcXG4gIGJhY2tncm91bmQ6IHJnYig1MCwgMTE4LCAxNzcpIWltcG9ydGFudDtcXHJcXG4gIGNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Uge1xcclxcbiAgbWFyZ2luLXRvcDogMTBweFxcbn1cXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBzcGFuLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2Ugc3BhbiB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3Bhbjpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHA6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItY3RybCBpOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWhvdmVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3IgOiAjZWVlZWVlO1xcbn1cXG4uZGF0ZXBpY2tlci13ZWVrUmFuZ2Ugc3BhbiB7XFxyXFxuICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuLmRhdGVwaWNrZXItbGFiZWwge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxyXFxuICBwYWRkaW5nOiA3cHggMDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItY3RybCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBoZWlnaHQ6IDMwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzBweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4ubW9udGgtYnRuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDpub25lO1xcclxcbiAgLW1vei11c2VyLXNlbGVjdDpub25lO1xcclxcbiAgLW1zLXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICB1c2VyLXNlbGVjdDpub25lO1xcbn1cXG4uZGF0ZXBpY2tlci1wcmVCdG4ge1xcclxcbiAgbGVmdDogMnB4O1xcbn1cXG4uZGF0ZXBpY2tlci1uZXh0QnRuIHtcXHJcXG4gIHJpZ2h0OiAycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvRGF0ZXBpY2tlci52dWU/NTIwMDZmNmNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQWlWQTtFQUNBLG1CQUFBO0VBQ0Esc0JBQUE7Q0FDQTtBQUNBO0VBQ0Esb0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLGlCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxjQUFBO0VBQ0EseUNBQUE7Q0FDQTtBQUNBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7OztFQUdBLHNCQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBO0VBQ0EsYUFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtDQUNBO0FBQ0E7RUFDQSxrQ0FBQTtFQUNBLDhCQUFBO0NBQ0E7QUFDQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUVBOztFQUVBLHdDQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBOzs7O0VBSUEsZ0JBQUE7Q0FDQTtBQUNBOzs7OztFQUtBLDJCQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLDBCQUFBO0VBQ0EsaUJBQUE7RUFDQSxlQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0VBQ0EseUJBQUE7RUFDQSxzQkFBQTtFQUNBLHFCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0EsVUFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0NBQ0FcIixcImZpbGVcIjpcIkRhdGVwaWNrZXIudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXJcXFwiPlxcclxcbiAgICA8aW5wdXQgY2xhc3M9XFxcImZvcm0tY29udHJvbCBkYXRlcGlja2VyLWlucHV0XFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIlxcclxcbiAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICA6Y2xhc3M9XFxcInsnd2l0aC1yZXNldC1idXR0b24nOiBjbGVhckJ1dHRvbn1cXFwiXFxyXFxuICAgICAgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aH1cXFwiXFxyXFxuICAgICAgQGNsaWNrPVxcXCJpbnB1dENsaWNrXFxcIlxcclxcbiAgICAvPlxcclxcbiAgICA8YnV0dG9uIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWxcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9ICcnXFxcIj5cXHJcXG4gICAgICA8c3Bhbj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICA8L2J1dHRvbj5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1wb3B1cFxcXCIgdi1zaG93PVxcXCJkaXNwbGF5RGF5Vmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dE1vbnRoQ2xpY2soMClcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcIm5leHRCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0TW9udGhDbGljaygxKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxwIEBjbGljaz1cXFwic3dpdGNoTW9udGhWaWV3XFxcIj57e3N0cmluZ2lmeURheUhlYWRlcihjdXJyRGF0ZSl9fTwvcD5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItd2Vla1JhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiB2LWZvcj1cXFwidyBpbiB0ZXh0LmRheXNPZldlZWtcXFwiPnt7d319PC9zcGFuPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1kYXRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIHYtZm9yPVxcXCJkIGluIGRhdGVSYW5nZVxcXCIgOmNsYXNzPVxcXCJkLnNjbGFzc1xcXCIgQGNsaWNrPVxcXCJkYXlTZWxlY3QoZClcXFwiPnt7ZC50ZXh0fX08L3NwYW4+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlNb250aFZpZXdcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItaW5uZXJcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1jdHJsXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcInByZUJ0bkNsYXNzZXNcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIiBAY2xpY2s9XFxcInByZU5leHRZZWFyQ2xpY2soMClcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcIm5leHRCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0WWVhckNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHAgQGNsaWNrPVxcXCJzd2l0Y2hEZWNhZGVWaWV3XFxcIj57e3N0cmluZ2lmeVllYXJIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiKG0sIGluZGV4KSBpbiB0ZXh0Lm1vbnRoc1xcXCI+XFxyXFxuICAgICAgICAgICAgICA8c3BhbiB2LXRleHQ9XFxcIm0uc3Vic3RyKDAsMylcXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6XFxyXFxuICAgICAgICAgICAgICAgICAgKHRleHQubW9udGhzW3BhcnNlKHZhbCkuZ2V0TW9udGgoKV0gPT09IG0pICYmXFxyXFxuICAgICAgICAgICAgICAgICAgY3VyckRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gcGFyc2UodmFsKS5nZXRGdWxsWWVhcigpfVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgQGNsaWNrPVxcXCJtb250aFNlbGVjdChpbmRleClcXFwiXFxyXFxuICAgICAgICAgICAgICA+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlZZWFyVmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHA+e3tzdHJpbmdpZnlEZWNhZGVIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2UgZGVjYWRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiZGVjYWRlIGluIGRlY2FkZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6cGFyc2UodmFsKS5nZXRGdWxsWWVhcigpID09PSBkZWNhZGUudGV4dH1cXFwiXFxyXFxuICAgICAgICAgICAgICAgIHYtdGV4dD1cXFwiZGVjYWRlLnRleHRcXFwiXFxyXFxuICAgICAgICAgICAgICAgIEBjbGljay5zdG9wPVxcXCJ5ZWFyU2VsZWN0KGRlY2FkZS50ZXh0KVxcXCJcXHJcXG4gICAgICAgICAgICAgID48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHt0cmFuc2xhdGlvbnN9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuLy8gaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICB2YWx1ZToge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGZvcm1hdDoge2RlZmF1bHQ6ICdNTS9kZC95eXl5J30sXFxyXFxuICAgIGRpc2FibGVkRGF5c09mV2Vlazoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGNsZWFyQnV0dG9uOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGljb25zRm9udDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2dseXBoaWNvbid9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgY3VyckRhdGU6IG5ldyBEYXRlKCksXFxyXFxuICAgICAgZGF0ZVJhbmdlOiBbXSxcXHJcXG4gICAgICBkZWNhZGVSYW5nZTogW10sXFxyXFxuICAgICAgZGlzcGxheURheVZpZXc6IGZhbHNlLFxcclxcbiAgICAgIGRpc3BsYXlNb250aFZpZXc6IGZhbHNlLFxcclxcbiAgICAgIGRpc3BsYXlZZWFyVmlldzogZmFsc2UsXFxyXFxuICAgICAgdmFsOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjdXJyRGF0ZSAoKSB7XFxyXFxuICAgICAgdGhpcy5nZXREYXRlUmFuZ2UoKVxcclxcbiAgICB9LFxcclxcbiAgICBmb3JtYXQgKCkge1xcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICB9LFxcclxcbiAgICB2YWx1ZSAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsICE9PSB2YWwpIHsgdGhpcy52YWwgPSB2YWwgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgdGV4dCAoKSB7XFxyXFxuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpXFxyXFxuICAgIH0sXFxyXFxuICAgIHByZUJ0bkNsYXNzZXMgKCkge1xcclxcbiAgICAgIHJldHVybiBgZGF0ZXBpY2tlci1wcmVCdG4gJHt0aGlzLmljb25zRm9udH0gJHt0aGlzLmljb25zRm9udH0tY2hldnJvbi1sZWZ0YFxcclxcbiAgICB9LFxcclxcbiAgICBuZXh0QnRuQ2xhc3NlcyAoKSB7XFxyXFxuICAgICAgcmV0dXJuIGBkYXRlcGlja2VyLW5leHRCdG4gJHt0aGlzLmljb25zRm9udH0gJHt0aGlzLmljb25zRm9udH0tY2hldnJvbi1yaWdodGBcXHJcXG4gICAgfSxcXHJcXG4gICAgZGlzYWJsZWREYXlzQXJyYXkgKCkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF5c09mV2Vlay5tYXAoZCA9PiBwYXJzZUludChkLCAxMCkpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGNsb3NlICgpIHtcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICB9LFxcclxcbiAgICBpbnB1dENsaWNrICgpIHtcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbCkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKVxcclxcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlNb250aFZpZXcgfHwgdGhpcy5kaXNwbGF5WWVhclZpZXcpIHtcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gIXRoaXMuZGlzcGxheURheVZpZXdcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHByZU5leHREZWNhZGVDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKClcXHJcXG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKClcXHJcXG5cXHJcXG4gICAgICBpZiAoZmxhZyA9PT0gMCkge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgLSAxMCwgbW9udGhzLCBkYXRlKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEwLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0TW9udGhDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICBjb25zdCBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZShwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCwgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0WWVhckNsaWNrIChmbGFnKSB7XFxyXFxuICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciAtIDEsIG1vbnRocywgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB5ZWFyU2VsZWN0ICh5ZWFyKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZGF5U2VsZWN0IChkYXkpIHtcXHJcXG4gICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBkYXkuZGF0ZVxcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKVxcclxcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzd2l0Y2hNb250aFZpZXcgKCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgc3dpdGNoRGVjYWRlVmlldyAoKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgbW9udGhTZWxlY3QgKGluZGV4KSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksIGluZGV4LCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZ2V0WWVhck1vbnRoICh5ZWFyLCBtb250aCkge1xcclxcbiAgICAgIGlmIChtb250aCA+IDExKSB7XFxyXFxuICAgICAgICB5ZWFyKytcXHJcXG4gICAgICAgIG1vbnRoID0gMFxcclxcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XFxyXFxuICAgICAgICB5ZWFyLS1cXHJcXG4gICAgICAgIG1vbnRoID0gMTFcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIHt5ZWFyOiB5ZWFyLCBtb250aDogbW9udGh9XFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeURlY2FkZUhlYWRlciAoZGF0ZSkge1xcclxcbiAgICAgIGNvbnN0IHllYXJTdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKVxcclxcbiAgICAgIGNvbnN0IGZpcnN0WWVhck9mRGVjYWRlID0geWVhclN0ci5zdWJzdHJpbmcoMCwgeWVhclN0ci5sZW5ndGggLSAxKSArIDBcXHJcXG4gICAgICBjb25zdCBsYXN0WWVhck9mRGVjYWRlID0gcGFyc2VJbnQoZmlyc3RZZWFyT2ZEZWNhZGUsIDEwKSArIDEwXFxyXFxuICAgICAgcmV0dXJuIGZpcnN0WWVhck9mRGVjYWRlICsgJy0nICsgbGFzdFllYXJPZkRlY2FkZVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlEYXlIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldICsgJyAnICsgZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgIH0sXFxyXFxuICAgIHBhcnNlTW9udGggKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldXFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeVllYXJIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeSAoZGF0ZSwgZm9ybWF0ID0gdGhpcy5mb3JtYXQpIHtcXHJcXG4gICAgICBpZiAoIWRhdGUpIGRhdGUgPSB0aGlzLnBhcnNlKClcXHJcXG4gICAgICBpZiAoIWRhdGUpIHJldHVybiAnJ1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDFcXHJcXG4gICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRoTmFtZSA9IHRoaXMucGFyc2VNb250aChkYXRlKVxcclxcbiAgICAgIHJldHVybiBmb3JtYXRcXHJcXG4gICAgICAgIC5yZXBsYWNlKC95eXl5L2csIHllYXIpXFxyXFxuICAgICAgICAucmVwbGFjZSgveXkvZywgeWVhcilcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTU1NL2csIG1vbnRoTmFtZSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTU0vZywgbW9udGhOYW1lLnN1YnN0cmluZygwLCAzKSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NKD8hYSkvZywgbW9udGgpXFxyXFxuICAgICAgICAucmVwbGFjZSgvZGQvZywgKCcwJyArIGRheSkuc2xpY2UoLTIpKVxcclxcbiAgICAgICAgLnJlcGxhY2UoL2QvZywgZGF5KVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZSAoc3RyKSB7XFxyXFxuICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkIHx8IHN0ciA9PT0gbnVsbCkgeyBzdHIgPSB0aGlzLnZhbCB9XFxyXFxuICAgICAgbGV0IGRhdGUgPSBzdHIubGVuZ3RoID09PSAxMCAmJiAodGhpcy5mb3JtYXQgPT09ICdkZC1NTS15eXl5JyB8fCB0aGlzLmZvcm1hdCA9PT0gJ2RkL01NL3l5eXknKSA/XFxyXFxuICAgICAgICBuZXcgRGF0ZShzdHIuc3Vic3RyaW5nKDYsIDEwKSwgc3RyLnN1YnN0cmluZygzLCA1KS0xLCBzdHIuc3Vic3RyaW5nKDAsIDIpKSA6XFxyXFxuICAgICAgICBuZXcgRGF0ZShzdHIpXFxyXFxuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0RnVsbFllYXIoKSkgPyBuZXcgRGF0ZSgpIDogZGF0ZVxcclxcbiAgICB9LFxcclxcbiAgICBnZXREYXlDb3VudCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBjb25zdCBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdXFxyXFxuICAgICAgaWYgKG1vbnRoID09PSAxKSB7XFxyXFxuICAgICAgICBpZiAoKHllYXIgJSA0MDAgPT09IDApIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSkge1xcclxcbiAgICAgICAgICByZXR1cm4gMjlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGRpY3RbbW9udGhdXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldERhdGVSYW5nZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIGNvbnN0IHRpbWUgPSB7XFxyXFxuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXFxyXFxuICAgICAgICBtb250aDogdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLFxcclxcbiAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9ICh5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCkgLSAxXFxyXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XFxyXFxuICAgICAgICB0aGlzLmRlY2FkZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKVxcclxcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcXHJcXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XFxyXFxuICAgICAgICBmaXJzdERheVdlZWsgPSA3XFxyXFxuICAgICAgfVxcclxcbiAgICAgIGNvbnN0IGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpXFxyXFxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcXHJcXG4gICAgICAgIGNvbnN0IHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSlcXHJcXG4gICAgICAgIGNvbnN0IHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aClcXHJcXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF5VGV4dCA9IHByZXZNb250aERheUNvdW50IC0gZmlyc3REYXlXZWVrICsgaSArIDFcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KVxcclxcbiAgICAgICAgICBsZXQgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7dGV4dDogZGF5VGV4dCwgZGF0ZSwgc2NsYXNzIH0pXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRheUNvdW50OyBpKyspIHtcXHJcXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIGkpXFxyXFxuICAgICAgICBsZXQgc2NsYXNzID0gJydcXHJcXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICBpZiAoaSA9PSB0aW1lLmRheSAmJiBkYXRlLmdldEZ1bGxZZWFyKCkgPT0gdGltZS55ZWFyICYmIGRhdGUuZ2V0TW9udGgoKSA9PSB0aW1lLm1vbnRoKXtcXHJcXG4gICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlJ1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7dGV4dDogaSwgZGF0ZSwgc2NsYXNzfSlcXHJcXG4gICAgICB9XFxyXFxuXFxyXFxuICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlLmxlbmd0aCA8IDQyKSB7XFxyXFxuICAgICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcXHJcXG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpXFxyXFxuXFxyXFxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXFxyXFxuICAgICAgICAgIGxldCBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXFxyXFxuICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSdcXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHt0ZXh0OiBpLCBkYXRlLCBzY2xhc3N9KVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcylcXHJcXG4gICAgdGhpcy5jdXJyRGF0ZSA9IHRoaXMucGFyc2UodGhpcy52YWwpIHx8IHRoaXMucGFyc2UobmV3IERhdGUoKSlcXHJcXG4gICAgdGhpcy5fYmx1ciA9IGUgPT4ge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKVxcclxcbiAgICAgICAgdGhpcy5jbG9zZSgpXFxyXFxuICAgIH1cXHJcXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JsdXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxufVxcclxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDEwMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHQvLyBpbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB2YWx1ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGZvcm1hdDogeyBkZWZhdWx0OiAnTU0vZGQveXl5eScgfSxcblx0ICAgIGRpc2FibGVkRGF5c09mV2VlazogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG5cdCAgICAgICAgcmV0dXJuIFtdO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBpY29uc0ZvbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZ2x5cGhpY29uJyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY3VyckRhdGU6IG5ldyBEYXRlKCksXG5cdCAgICAgIGRhdGVSYW5nZTogW10sXG5cdCAgICAgIGRlY2FkZVJhbmdlOiBbXSxcblx0ICAgICAgZGlzcGxheURheVZpZXc6IGZhbHNlLFxuXHQgICAgICBkaXNwbGF5TW9udGhWaWV3OiBmYWxzZSxcblx0ICAgICAgZGlzcGxheVllYXJWaWV3OiBmYWxzZSxcblx0ICAgICAgdmFsOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBjdXJyRGF0ZTogZnVuY3Rpb24gY3VyckRhdGUoKSB7XG5cdCAgICAgIHRoaXMuZ2V0RGF0ZVJhbmdlKCk7XG5cdCAgICB9LFxuXHQgICAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQoKSB7XG5cdCAgICAgIHRoaXMudmFsID0gdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSk7XG5cdCAgICB9LFxuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdGV4dDogZnVuY3Rpb24gdGV4dCgpIHtcblx0ICAgICAgcmV0dXJuICgwLCBfdXRpbHMudHJhbnNsYXRpb25zKSh0aGlzLmxhbmcpO1xuXHQgICAgfSxcblx0ICAgIHByZUJ0bkNsYXNzZXM6IGZ1bmN0aW9uIHByZUJ0bkNsYXNzZXMoKSB7XG5cdCAgICAgIHJldHVybiAnZGF0ZXBpY2tlci1wcmVCdG4gJyArIHRoaXMuaWNvbnNGb250ICsgJyAnICsgdGhpcy5pY29uc0ZvbnQgKyAnLWNoZXZyb24tbGVmdCc7XG5cdCAgICB9LFxuXHQgICAgbmV4dEJ0bkNsYXNzZXM6IGZ1bmN0aW9uIG5leHRCdG5DbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gJ2RhdGVwaWNrZXItbmV4dEJ0biAnICsgdGhpcy5pY29uc0ZvbnQgKyAnICcgKyB0aGlzLmljb25zRm9udCArICctY2hldnJvbi1yaWdodCc7XG5cdCAgICB9LFxuXHQgICAgZGlzYWJsZWREYXlzQXJyYXk6IGZ1bmN0aW9uIGRpc2FibGVkRGF5c0FycmF5KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERheXNPZldlZWsubWFwKGZ1bmN0aW9uIChkKSB7XG5cdCAgICAgICAgcmV0dXJuIHBhcnNlSW50KGQsIDEwKTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIGlucHV0Q2xpY2s6IGZ1bmN0aW9uIGlucHV0Q2xpY2soKSB7XG5cdCAgICAgIHRoaXMuY3VyckRhdGUgPSB0aGlzLnBhcnNlKHRoaXMudmFsKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgICBpZiAodGhpcy5kaXNwbGF5TW9udGhWaWV3IHx8IHRoaXMuZGlzcGxheVllYXJWaWV3KSB7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSAhdGhpcy5kaXNwbGF5RGF5Vmlldztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHREZWNhZGVDbGljazogZnVuY3Rpb24gcHJlTmV4dERlY2FkZUNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMTAsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxMCwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHRNb250aENsaWNrOiBmdW5jdGlvbiBwcmVOZXh0TW9udGhDbGljayhmbGFnKSB7XG5cdCAgICAgIHZhciB5ZWFyID0gdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgICB2YXIgbW9udGggPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSk7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKTtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwcmVOZXh0WWVhckNsaWNrOiBmdW5jdGlvbiBwcmVOZXh0WWVhckNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMSwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB5ZWFyU2VsZWN0OiBmdW5jdGlvbiB5ZWFyU2VsZWN0KHllYXIpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpO1xuXHQgICAgfSxcblx0ICAgIGRheVNlbGVjdDogZnVuY3Rpb24gZGF5U2VsZWN0KGRheSkge1xuXHQgICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gZGF5LmRhdGU7XG5cdCAgICAgICAgdGhpcy52YWwgPSB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKTtcblx0ICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzd2l0Y2hNb250aFZpZXc6IGZ1bmN0aW9uIHN3aXRjaE1vbnRoVmlldygpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHN3aXRjaERlY2FkZVZpZXc6IGZ1bmN0aW9uIHN3aXRjaERlY2FkZVZpZXcoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IHRydWU7XG5cdCAgICB9LFxuXHQgICAgbW9udGhTZWxlY3Q6IGZ1bmN0aW9uIG1vbnRoU2VsZWN0KGluZGV4KSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKSwgaW5kZXgsIHRoaXMuY3VyckRhdGUuZ2V0RGF0ZSgpKTtcblx0ICAgIH0sXG5cdCAgICBnZXRZZWFyTW9udGg6IGZ1bmN0aW9uIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuXHQgICAgICBpZiAobW9udGggPiAxMSkge1xuXHQgICAgICAgIHllYXIrKztcblx0ICAgICAgICBtb250aCA9IDA7XG5cdCAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XG5cdCAgICAgICAgeWVhci0tO1xuXHQgICAgICAgIG1vbnRoID0gMTE7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHsgeWVhcjogeWVhciwgbW9udGg6IG1vbnRoIH07XG5cdCAgICB9LFxuXHQgICAgc3RyaW5naWZ5RGVjYWRlSGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlEZWNhZGVIZWFkZXIoZGF0ZSkge1xuXHQgICAgICB2YXIgeWVhclN0ciA9IGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpO1xuXHQgICAgICB2YXIgZmlyc3RZZWFyT2ZEZWNhZGUgPSB5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMDtcblx0ICAgICAgdmFyIGxhc3RZZWFyT2ZEZWNhZGUgPSBwYXJzZUludChmaXJzdFllYXJPZkRlY2FkZSwgMTApICsgMTA7XG5cdCAgICAgIHJldHVybiBmaXJzdFllYXJPZkRlY2FkZSArICctJyArIGxhc3RZZWFyT2ZEZWNhZGU7XG5cdCAgICB9LFxuXHQgICAgc3RyaW5naWZ5RGF5SGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlEYXlIZWFkZXIoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldICsgJyAnICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgfSxcblx0ICAgIHBhcnNlTW9udGg6IGZ1bmN0aW9uIHBhcnNlTW9udGgoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeVllYXJIZWFkZXI6IGZ1bmN0aW9uIHN0cmluZ2lmeVllYXJIZWFkZXIoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGRhdGUpIHtcblx0ICAgICAgdmFyIGZvcm1hdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdGhpcy5mb3JtYXQ7XG5cdFxuXHQgICAgICBpZiAoIWRhdGUpIGRhdGUgPSB0aGlzLnBhcnNlKCk7XG5cdCAgICAgIGlmICghZGF0ZSkgcmV0dXJuICcnO1xuXHQgICAgICB2YXIgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgICAgdmFyIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcblx0ICAgICAgdmFyIGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHQgICAgICB2YXIgbW9udGhOYW1lID0gdGhpcy5wYXJzZU1vbnRoKGRhdGUpO1xuXHQgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoL3l5eXkvZywgeWVhcikucmVwbGFjZSgveXkvZywgeWVhcikucmVwbGFjZSgvTU1NTS9nLCBtb250aE5hbWUpLnJlcGxhY2UoL01NTS9nLCBtb250aE5hbWUuc3Vic3RyaW5nKDAsIDMpKS5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSkucmVwbGFjZSgvTSg/IWEpL2csIG1vbnRoKS5yZXBsYWNlKC9kZC9nLCAoJzAnICsgZGF5KS5zbGljZSgtMikpLnJlcGxhY2UoL2QvZywgZGF5KTtcblx0ICAgIH0sXG5cdCAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG5cdCAgICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCB8fCBzdHIgPT09IG51bGwpIHtcblx0ICAgICAgICBzdHIgPSB0aGlzLnZhbDtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZGF0ZSA9IHN0ci5sZW5ndGggPT09IDEwICYmICh0aGlzLmZvcm1hdCA9PT0gJ2RkLU1NLXl5eXknIHx8IHRoaXMuZm9ybWF0ID09PSAnZGQvTU0veXl5eScpID8gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSkgLSAxLCBzdHIuc3Vic3RyaW5nKDAsIDIpKSA6IG5ldyBEYXRlKHN0cik7XG5cdCAgICAgIHJldHVybiBpc05hTihkYXRlLmdldEZ1bGxZZWFyKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG5cdCAgICB9LFxuXHQgICAgZ2V0RGF5Q291bnQ6IGZ1bmN0aW9uIGdldERheUNvdW50KHllYXIsIG1vbnRoKSB7XG5cdCAgICAgIHZhciBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuXHQgICAgICBpZiAobW9udGggPT09IDEpIHtcblx0ICAgICAgICBpZiAoeWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB7XG5cdCAgICAgICAgICByZXR1cm4gMjk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBkaWN0W21vbnRoXTtcblx0ICAgIH0sXG5cdCAgICBnZXREYXRlUmFuZ2U6IGZ1bmN0aW9uIGdldERhdGVSYW5nZSgpIHtcblx0ICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXTtcblx0ICAgICAgdGhpcy5kZWNhZGVSYW5nZSA9IFtdO1xuXHQgICAgICB2YXIgdGltZSA9IHtcblx0ICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXG5cdCAgICAgICAgbW9udGg6IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSxcblx0ICAgICAgICBkYXk6IHRoaXMuY3VyckRhdGUuZ2V0RGF0ZSgpXG5cdCAgICAgIH07XG5cdCAgICAgIHZhciB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKCk7XG5cdCAgICAgIHZhciBmaXJzdFllYXJPZkRlY2FkZSA9IHllYXJTdHIuc3Vic3RyaW5nKDAsIHllYXJTdHIubGVuZ3RoIC0gMSkgKyAwIC0gMTtcblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG5cdCAgICAgICAgdGhpcy5kZWNhZGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgIHRleHQ6IGZpcnN0WWVhck9mRGVjYWRlICsgaVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIDEpO1xuXHQgICAgICB2YXIgZmlyc3REYXlXZWVrID0gY3Vyck1vbnRoRmlyc3REYXkuZ2V0RGF5KCkgKyAxO1xuXHQgICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XG5cdCAgICAgICAgZmlyc3REYXlXZWVrID0gNztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZGF5Q291bnQgPSB0aGlzLmdldERheUNvdW50KHRpbWUueWVhciwgdGltZS5tb250aCk7XG5cdCAgICAgIGlmIChmaXJzdERheVdlZWsgPiAxKSB7XG5cdCAgICAgICAgdmFyIHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSk7XG5cdCAgICAgICAgdmFyIHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCk7XG5cdCAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGZpcnN0RGF5V2VlazsgX2krKykge1xuXHQgICAgICAgICAgdmFyIGRheVRleHQgPSBwcmV2TW9udGhEYXlDb3VudCAtIGZpcnN0RGF5V2VlayArIF9pICsgMTtcblx0ICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUocHJlTW9udGgueWVhciwgcHJlTW9udGgubW9udGgsIGRheVRleHQpO1xuXHQgICAgICAgICAgdmFyIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZ3JheSc7XG5cdCAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcblx0ICAgICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goeyB0ZXh0OiBkYXlUZXh0LCBkYXRlOiBkYXRlLCBzY2xhc3M6IHNjbGFzcyB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8PSBkYXlDb3VudDsgX2kyKyspIHtcblx0ICAgICAgICB2YXIgX2RhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIF9pMik7XG5cdCAgICAgICAgdmFyIF9zY2xhc3MgPSAnJztcblx0ICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICBfc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKF9pMiA9PSB0aW1lLmRheSAmJiBfZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBfZGF0ZS5nZXRNb250aCgpID09IHRpbWUubW9udGgpIHtcblx0ICAgICAgICAgIF9zY2xhc3MgPSAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHsgdGV4dDogX2kyLCBkYXRlOiBfZGF0ZSwgc2NsYXNzOiBfc2NsYXNzIH0pO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBpZiAodGhpcy5kYXRlUmFuZ2UubGVuZ3RoIDwgNDIpIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoTmVlZCA9IDQyIC0gdGhpcy5kYXRlUmFuZ2UubGVuZ3RoO1xuXHQgICAgICAgIHZhciBuZXh0TW9udGggPSB0aGlzLmdldFllYXJNb250aCh0aW1lLnllYXIsIHRpbWUubW9udGggKyAxKTtcblx0XG5cdCAgICAgICAgZm9yICh2YXIgX2kzID0gMTsgX2kzIDw9IG5leHRNb250aE5lZWQ7IF9pMysrKSB7XG5cdCAgICAgICAgICB2YXIgX2RhdGUyID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgX2kzKTtcblx0ICAgICAgICAgIHZhciBfc2NsYXNzMiA9ICdkYXRlcGlja2VyLWl0ZW0tZ3JheSc7XG5cdCAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlMi5nZXREYXkoKSkgPiAtMSkge1xuXHQgICAgICAgICAgICBfc2NsYXNzMiA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSc7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHsgdGV4dDogX2kzLCBkYXRlOiBfZGF0ZTIsIHNjbGFzczogX3NjbGFzczIgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcyk7XG5cdCAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbCkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKTtcblx0ICAgIHRoaXMuX2JsdXIgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZiAoIV90aGlzLiRlbC5jb250YWlucyhlLnRhcmdldCkpIF90aGlzLmNsb3NlKCk7XG5cdCAgICB9O1xuXHQgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2wgZGF0ZXBpY2tlci1pbnB1dFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgJ3dpdGgtcmVzZXQtYnV0dG9uJzogX3ZtLmNsZWFyQnV0dG9uXG5cdCAgICB9LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ud2lkdGhcblx0ICAgIH0pLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwidGV4dFwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlclxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uaW5wdXRDbGljayxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS52YWwgPSAnJ1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzcGxheURheVZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlEYXlWaWV3XCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1wb3B1cFwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1pbm5lclwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1ib2R5XCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWN0cmxcIlxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLnByZUJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dE1vbnRoQ2xpY2soMClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLm5leHRCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRNb250aENsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywge1xuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uc3dpdGNoTW9udGhWaWV3XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURheUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItd2Vla1JhbmdlXCJcblx0ICB9LCBfdm0uX2woKF92bS50ZXh0LmRheXNPZldlZWspLCBmdW5jdGlvbih3KSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdihfdm0uX3ModykpXSlcblx0ICB9KSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1kYXRlUmFuZ2VcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLmRhdGVSYW5nZSksIGZ1bmN0aW9uKGQpIHtcblx0ICAgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGNsYXNzOiBkLnNjbGFzcyxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLmRheVNlbGVjdChkKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3MoZC50ZXh0KSldKVxuXHQgIH0pKV0pXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzcGxheU1vbnRoVmlldyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiZGlzcGxheU1vbnRoVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRZZWFyQ2xpY2soMClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLm5leHRCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRZZWFyQ2xpY2soMSlcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3AnLCB7XG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5zd2l0Y2hEZWNhZGVWaWV3XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeVllYXJIZWFkZXIoX3ZtLmN1cnJEYXRlKSkpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2VcIlxuXHQgIH0sIFtfdm0uX2woKF92bS50ZXh0Lm1vbnRocyksIGZ1bmN0aW9uKG0sIGluZGV4KSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOlxuXHQgICAgICAgIChfdm0udGV4dC5tb250aHNbX3ZtLnBhcnNlKF92bS52YWwpLmdldE1vbnRoKCldID09PSBtKSAmJlxuXHQgICAgICAgIF92bS5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpID09PSBfdm0ucGFyc2UoX3ZtLnZhbCkuZ2V0RnVsbFllYXIoKVxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidGV4dENvbnRlbnRcIjogX3ZtLl9zKG0uc3Vic3RyKDAsIDMpKVxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICBfdm0ubW9udGhTZWxlY3QoaW5kZXgpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9KV1cblx0ICB9KV0sIDIpXSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5kaXNwbGF5WWVhclZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlZZWFyVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHREZWNhZGVDbGljaygwKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ubmV4dEJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dERlY2FkZUNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURlY2FkZUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItbW9udGhSYW5nZSBkZWNhZGVSYW5nZVwiXG5cdCAgfSwgW192bS5fbCgoX3ZtLmRlY2FkZVJhbmdlKSwgZnVuY3Rpb24oZGVjYWRlKSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOiBfdm0ucGFyc2UoX3ZtLnZhbCkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHRcblx0ICAgICAgfSxcblx0ICAgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgICBcInRleHRDb250ZW50XCI6IF92bS5fcyhkZWNhZGUudGV4dClcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICAgX3ZtLnllYXJTZWxlY3QoZGVjYWRlLnRleHQpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9KV1cblx0ICB9KV0sIDIpXSldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDc3YjhlNWRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA2KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxEcm9wZG93bi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzliZTEwNzJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTM5YmUxMDcyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRHJvcGRvd24udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBzaXplOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICB2YXIgc2hvdyA9IHRoaXMudmFsdWU7XG5cdCAgICByZXR1cm4geyBzaG93OiBzaG93IH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHNob3c6IGZ1bmN0aW9uIHNob3codmFsKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBidXR0b25TaXplOiBmdW5jdGlvbiBidXR0b25TaXplKCkge1xuXHQgICAgICByZXR1cm4gflsnbGcnLCAnc20nLCAneHMnXS5pbmRleE9mKHRoaXMuc2l6ZSkgPyAnYnRuLScgKyB0aGlzLnNpemUgOiAnJztcblx0ICAgIH0sXG5cdCAgICBpbklucHV0OiBmdW5jdGlvbiBpbklucHV0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50Ll9pbnB1dDtcblx0ICAgIH0sXG5cdCAgICBpc0xpOiBmdW5jdGlvbiBpc0xpKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50Ll9pc1RhYnMgfHwgdGhpcy4kcGFyZW50Ll9uYXZiYXIgfHwgdGhpcy4kcGFyZW50Lm1lbnU7XG5cdCAgICB9LFxuXHQgICAgbWVudTogZnVuY3Rpb24gbWVudSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLiRwYXJlbnQgfHwgdGhpcy4kcGFyZW50Lm5hdmJhcjtcblx0ICAgIH0sXG5cdCAgICBzbG90czogZnVuY3Rpb24gc2xvdHMoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zbG90Q29udGVudHM7XG5cdCAgICB9LFxuXHQgICAgc3VibWVudTogZnVuY3Rpb24gc3VibWVudSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiAodGhpcy4kcGFyZW50Lm1lbnUgfHwgdGhpcy4kcGFyZW50LnN1Ym1lbnUpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcblx0ICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuXHQgICAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3c7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCd1bCcsIHRoaXMuJGVsKS5vbignY2xpY2snLCAnbGk+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIF90aGlzLnNob3cgPSBmYWxzZTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCd1bCcsIHRoaXMuJGVsKS5vZmYoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uaXNMaSA/ICdsaScgOiAnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJjbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1jbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmJsdXIpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImJsdXJcIlxuXHQgICAgfV0sXG5cdCAgICB0YWc6IFwiZGl2XCIsXG5cdCAgICBjbGFzczogW3tcblx0ICAgICAgb3BlbjogX3ZtLnNob3csXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIGRyb3Bkb3duOiBfdm0uaXNMaSxcblx0ICAgICAgJ2lucHV0LWdyb3VwLWJ0bic6IF92bS5pbklucHV0LFxuXHQgICAgICAnYnRuLWdyb3VwJzogIV92bS5pc0xpICYmICFfdm0uaW5JbnB1dFxuXHQgICAgfV1cblx0ICB9LCBbX3ZtLl90KFwiYmVmb3JlXCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmlzTGkpID8gX3ZtLl9jKCdhJywge1xuXHQgICAgY2xhc3M6IFsnZHJvcGRvd24tdG9nZ2xlJywgX3ZtLmJ1dHRvblNpemUsIHtcblx0ICAgICAgZGlzYWJsZWQ6IF92bS5kaXNhYmxlZFxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwia2V5dXBcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5zaG93ID0gZmFsc2Vcblx0ICAgICAgfSxcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJidXR0b25cIiwgW192bS5fdihfdm0uX3MoX3ZtLnRleHQpKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJldFwiXG5cdCAgfSldLCAyKSA6IF92bS5fYygnYnV0dG9uJywge1xuXHQgICAgY2xhc3M6IFsnYnRuIGJ0bi0nICsgX3ZtLnR5cGUsIF92bS5idXR0b25TaXplLCAnZHJvcGRvd24tdG9nZ2xlJ10sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJidXR0b25cIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZXNjXCIsIDI3KSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uc2hvdyA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiYnV0dG9uXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50ZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2FyZXRcIlxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRyb3Bkb3duLW1lbnVcIiwgW192bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zOWJlMTA3MlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEwOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEZvcm1Hcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzllYjQwMGFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTc5ZWI0MDBhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRm9ybUdyb3VwLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vIGxldCBjb2VyY2UgPSB7XG5cdC8vICAgICBlbnRlclN1Ym1pdDogJ2Jvb2xlYW4nLFxuXHQvLyAgICAgaWNvbjogJ2Jvb2xlYW4nXG5cdC8vIH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZW50ZXJTdWJtaXQ6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogZmFsc2Vcblx0ICAgIH0sXG5cdCAgICBpY29uOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9LFxuXHQgICAgbGFuZzoge1xuXHQgICAgICB0eXBlOiBTdHJpbmcsXG5cdCAgICAgIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoaWxkcmVuOiBbXSxcblx0ICAgICAgdmFsaWQ6IG51bGwsXG5cdCAgICAgIHRpbWVvdXQ6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbGlkOiBmdW5jdGlvbiB2YWxpZCh2YWwsIG9sZCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuXHQgICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuXHQgICAgICB0aGlzLmNoaWxkcmVuLnNvbWUoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgdmFyIHYgPSBlbC52YWxpZGF0ZSA/IGVsLnZhbGlkYXRlKCkgOiBlbC52YWxpZCAhPT0gdW5kZWZpbmVkID8gZWwudmFsaWQgOiBlbC5yZXF1aXJlZCAmJiAhflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKGVsLnZhbHVlKTtcblx0ICAgICAgICBpZiAoIXYpIHZhbGlkID0gZmFsc2U7XG5cdCAgICAgICAgcmV0dXJuICF2YWxpZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMudmFsaWQgPSB2YWxpZDtcblx0ICAgICAgcmV0dXJuIHZhbGlkID09PSB0cnVlO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2Zvcm1Hcm91cCA9IHRydWU7XG5cdCAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtR3JvdXApIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybUdyb3VwKSB7XG5cdCAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy52YWxpZGF0ZSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDExMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03OWViNDAwYVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEzKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEZvcm1WYWxpZGF0b3IudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWI5ZjU3YzQ2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1iOWY1N2M0NlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEZvcm1WYWxpZGF0b3IudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTEyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBlbnRlclN1Ym1pdDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgaWNvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgdmFsdWU6IG51bGxcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGlsZHJlbjogW10sXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuXHQgICAgICB2YXIgaW52YWxpZCA9ICF0aGlzLmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbC52YWxpZGF0ZSA/IGVsLnZhbGlkYXRlKCkgOiBlbC52YWxpZCAhPT0gdW5kZWZpbmVkID8gZWwudmFsaWQgOiBlbC5yZXF1aXJlZCAmJiAhflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKGVsLnZhbHVlKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMudmFsaWQgPSAhaW52YWxpZDtcblx0ICAgICAgcmV0dXJuICFpbnZhbGlkO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2Zvcm1WYWxpZGF0b3IgPSB0cnVlO1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcblx0ICAgIH1cblx0ICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy52YWxpZGF0ZSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDExMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1iOWY1N2M0NlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMTUpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTcpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE4KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXElucHV0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtNjUyYWQ3YjlcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTY1MmFkN2I5XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi02NTJhZDdiOVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIElucHV0LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDExNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE2KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02NTJhZDdiOSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vSW5wdXQudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02NTJhZDdiOSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vSW5wdXQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTE2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5mb3JtLWdyb3VwW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5sYWJlbH4uY2xvc2VbZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICB0b3A6IDI1cHg7XFxufVxcbi5pbnB1dC1ncm91cD4uaWNvbltkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxyXFxuICB3aWR0aDowO1xcclxcbiAgei1pbmRleDogMztcXG59XFxuLmNsb3NlW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICB6LWluZGV4OiAyO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMzRweDtcXHJcXG4gIGhlaWdodDogMzRweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzNHB4O1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uaGFzLWZlZWRiYWNrIC5jbG9zZVtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHJpZ2h0OiAyMHB4O1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0lucHV0LnZ1ZT81NmNlMTY5ZFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBMFFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsVUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EsUUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiSW5wdXQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIDpjbGFzcz1cXFwie3ZhbGlkYXRlOmNhblZhbGlkYXRlLCdoYXMtZmVlZGJhY2snOmljb24sJ2hhcy1lcnJvcic6Y2FuVmFsaWRhdGUmJnZhbGlkPT09ZmFsc2UsJ2hhcy1zdWNjZXNzJzpjYW5WYWxpZGF0ZSYmdmFsaWR9XFxcIj5cXHJcXG4gICAgPHNsb3QgbmFtZT1cXFwibGFiZWxcXFwiPjxsYWJlbCB2LWlmPVxcXCJsYWJlbFxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7bGFiZWx9fTwvbGFiZWw+PC9zbG90PlxcclxcbiAgICA8ZGl2IHYtaWY9XFxcIiRzbG90cy5iZWZvcmV8fCRzbG90cy5hZnRlclxcXCIgY2xhc3M9XFxcImlucHV0LWdyb3VwXFxcIj5cXHJcXG4gICAgICA8c2xvdCBuYW1lPVxcXCJiZWZvcmVcXFwiPjwvc2xvdD5cXHJcXG4gICAgICA8dGV4dGFyZWEgOmlzPVxcXCJ0eXBlPT0ndGV4dGFyZWEnP3R5cGU6J2lucHV0J1xcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIDpjb2xzPVxcXCJjb2xzXFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAgIDpsaXN0PVxcXCJpZF9kYXRhbGlzdFxcXCJcXHJcXG4gICAgICAgIDptYXg9XFxcImF0dHIobWF4KVxcXCJcXHJcXG4gICAgICAgIDptYXhsZW5ndGg9XFxcIm1heGxlbmd0aFxcXCJcXHJcXG4gICAgICAgIDptaW49XFxcImF0dHIobWluKVxcXCJcXHJcXG4gICAgICAgIDpuYW1lPVxcXCJuYW1lXFxcIlxcclxcbiAgICAgICAgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICAgIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiXFxyXFxuICAgICAgICA6cmVxdWlyZWQ9XFxcInJlcXVpcmVkXFxcIlxcclxcbiAgICAgICAgOnJvd3M9XFxcInJvd3NcXFwiXFxyXFxuICAgICAgICA6c3RlcD1cXFwic3RlcFxcXCJcXHJcXG4gICAgICAgIDp0aXRsZT1cXFwiYXR0cih0aXRsZSlcXFwiXFxyXFxuICAgICAgICA6dHlwZT1cXFwidHlwZT09J3RleHRhcmVhJz9udWxsOnR5cGVcXFwiXFxyXFxuICAgICAgICB2LW1vZGVsPVxcXCJ2YWxcXFwiXFxyXFxuICAgICAgICBAYmx1cj1cXFwiZW1pdFxcXCIgQGZvY3VzPVxcXCJlbWl0XFxcIiBAaW5wdXQ9XFxcImVtaXRcXFwiXFxyXFxuICAgICAgICBAa2V5dXAuZW50ZXI9XFxcInR5cGUhPSd0ZXh0YXJlYScmJmVudGVyU3VibWl0JiZzdWJtaXQoKVxcXCJcXHJcXG4gICAgICA+PC90ZXh0YXJlYT5cXHJcXG4gICAgICA8ZGl2IHYtaWY9XFxcImNsZWFyQnV0dG9uICYmIHZhbHVlXFxcIiA6Y2xhc3M9XFxcIntpY29uOmljb259XFxcIj5cXHJcXG4gICAgICAgIDxzcGFuIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJ2YWx1ZSA9ICcnXFxcIj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICAgIDxkaXYgdi1pZj1cXFwiaWNvblxcXCIgY2xhc3M9XFxcImljb25cXFwiPlxcclxcbiAgICAgICAgPHNwYW4gdi1pZj1cXFwiaWNvbiYmdmFsaWQhPT1udWxsXFxcIiA6Y2xhc3M9XFxcIlsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsJ2dseXBoaWNvbi0nKyh2YWxpZD8nb2snOidyZW1vdmUnKV1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiYWZ0ZXJcXFwiPjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XFxyXFxuICAgICAgPHRleHRhcmVhIDppcz1cXFwidHlwZT09J3RleHRhcmVhJz90eXBlOidpbnB1dCdcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICA6Y29scz1cXFwiY29sc1xcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgICA6bGlzdD1cXFwiaWRfZGF0YWxpc3RcXFwiXFxyXFxuICAgICAgICA6bWF4PVxcXCJhdHRyKG1heClcXFwiXFxyXFxuICAgICAgICA6bWF4bGVuZ3RoPVxcXCJtYXhsZW5ndGhcXFwiXFxyXFxuICAgICAgICA6bWluPVxcXCJhdHRyKG1pbilcXFwiXFxyXFxuICAgICAgICA6bmFtZT1cXFwibmFtZVxcXCJcXHJcXG4gICAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOnJlcXVpcmVkPVxcXCJyZXF1aXJlZFxcXCJcXHJcXG4gICAgICAgIDpyb3dzPVxcXCJyb3dzXFxcIlxcclxcbiAgICAgICAgOnN0ZXA9XFxcInN0ZXBcXFwiXFxyXFxuICAgICAgICA6dGl0bGU9XFxcImF0dHIodGl0bGUpXFxcIlxcclxcbiAgICAgICAgOnR5cGU9XFxcInR5cGU9PSd0ZXh0YXJlYSc/bnVsbDp0eXBlXFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgICAgQGJsdXI9XFxcImVtaXRcXFwiIEBmb2N1cz1cXFwiZW1pdFxcXCIgQGlucHV0PVxcXCJlbWl0XFxcIlxcclxcbiAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ0eXBlIT0ndGV4dGFyZWEnJiZlbnRlclN1Ym1pdCYmc3VibWl0KClcXFwiXFxyXFxuICAgICAgPjwvdGV4dGFyZWE+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiY2xlYXJCdXR0b24gJiYgdmFsXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwidmFsID0gJydcXFwiPiZ0aW1lczs8L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiaWNvbiYmdmFsaWQhPT1udWxsXFxcIiA6Y2xhc3M9XFxcIlsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsJ2dseXBoaWNvbi0nKyh2YWxpZD8nb2snOidyZW1vdmUnKV1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgIDxkYXRhbGlzdCB2LWlmPVxcXCJpZF9kYXRhbGlzdFxcXCIgOmlkPVxcXCJpZF9kYXRhbGlzdFxcXCI+XFxyXFxuICAgICAgPG9wdGlvbiB2LWZvcj1cXFwib3BjIGluIG9wdGlvbnNcXFwiIDp2YWx1ZT1cXFwib3BjXFxcIj48L29wdGlvbj5cXHJcXG4gICAgPC9kYXRhbGlzdD5cXHJcXG4gICAgPGRpdiB2LWlmPVxcXCJzaG93SGVscFxcXCIgY2xhc3M9XFxcImhlbHAtYmxvY2tcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7aGVscH19PC9kaXY+XFxyXFxuICAgIDxkaXYgdi1pZj1cXFwic2hvd0Vycm9yXFxcIiBjbGFzcz1cXFwiaGVscC1ibG9jayB3aXRoLWVycm9yc1xcXCIgQGNsaWNrPVxcXCJmb2N1c1xcXCI+e3tlcnJvclRleHR9fTwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Y29lcmNlLCBkZWxheWVyLCB0cmFuc2xhdGlvbnN9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG52YXIgREVMQVkgPSAzMDBcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBjbGVhckJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgY29sczoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGRhdGFsaXN0OiB7dHlwZTogQXJyYXksIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBkaXNhYmxlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZW50ZXJTdWJtaXQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGVycm9yOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgaGVscDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGhpZGVIZWxwOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIGljb246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGxhYmVsOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgbGFuZzoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbmF2aWdhdG9yLmxhbmd1YWdlfSxcXHJcXG4gICAgbWFzazogbnVsbCxcXHJcXG4gICAgbWFza0RlbGF5OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDB9LFxcclxcbiAgICBtYXRjaDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1heDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1heGxlbmd0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1pbjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1pbmxlbmd0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBwYXR0ZXJuOiB7ZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHJlcXVpcmVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICByb3dzOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzfSxcXHJcXG4gICAgc3RlcDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0J30sXFxyXFxuICAgIHVybDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHVybE1hcDoge3R5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsaWRhdGlvbkRlbGF5OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAyNTB9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgb3B0aW9uczogdGhpcy5kYXRhbGlzdCxcXHJcXG4gICAgICB2YWwsXFxyXFxuICAgICAgdmFsaWQ6IG51bGwsXFxyXFxuICAgICAgdGltZW91dDogbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgY2FuVmFsaWRhdGUgKCkgeyByZXR1cm4gIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHkgJiYgKHRoaXMucmVxdWlyZWQgfHwgdGhpcy5yZWdleCB8fCB0aGlzLm5hdGl2ZVZhbGlkYXRlIHx8IHRoaXMubWF0Y2ggIT09IG51bGwpIH0sXFxyXFxuICAgIGVycm9yVGV4dCAoKSB7XFxyXFxuICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZVxcclxcbiAgICAgIGxldCBlcnJvciA9IFt0aGlzLmVycm9yXVxcclxcbiAgICAgIGlmICghdmFsdWUgJiYgdGhpcy5yZXF1aXJlZCkgZXJyb3IucHVzaCgnKCcgKyB0aGlzLnRleHQucmVxdWlyZWQudG9Mb3dlckNhc2UoKSArICcpJylcXHJcXG4gICAgICBpZiAodmFsdWUgJiYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSkgZXJyb3IucHVzaCgnKCcgKyB0aGlzLnRleHQubWluTGVuZ3RoLnRvTG93ZXJDYXNlKCkgKyAnOiAnICsgdGhpcy5taW5sZW5ndGggKyAnKScpXFxyXFxuICAgICAgcmV0dXJuIGVycm9yLmpvaW4oJyAnKVxcclxcbiAgICB9LFxcclxcbiAgICBpZF9kYXRhbGlzdCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0aGlzLmRhdGFsaXN0IGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIGlmICghdGhpcy5faWRfZGF0YWxpc3QpIHtcXHJcXG4gICAgICAgICAgaWYgKCF0aGlzLiRyb290LmlkX2RhdGFsaXN0KSB7IHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QgPSAwIH1cXHJcXG4gICAgICAgICAgdGhpcy5faWRfZGF0YWxpc3QgPSAnaW5wdXQtZGF0YWxpc3QnICsgdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCsrXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICByZXR1cm4gdGhpcy5faWRfZGF0YWxpc3RcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIG51bGxcXHJcXG4gICAgfSxcXHJcXG4gICAgaW5wdXQgKCkgeyByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dCB9LFxcclxcbiAgICBuYXRpdmVWYWxpZGF0ZSAoKSB7IHJldHVybiAodGhpcy5pbnB1dCB8fCB7fSkuY2hlY2tWYWxpZGl0eSAmJiAoflsndXJsJywgJ2VtYWlsJ10uaW5kZXhPZih0aGlzLnR5cGUudG9Mb3dlckNhc2UoKSkgfHwgdGhpcy5taW4gfHwgdGhpcy5tYXgpIH0sXFxyXFxuICAgIHJlZ2V4ICgpIHsgcmV0dXJuIGNvZXJjZS5wYXR0ZXJuKHRoaXMucGF0dGVybikgfSxcXHJcXG4gICAgc2hvd0Vycm9yICgpIHsgcmV0dXJuIHRoaXMuZXJyb3IgJiYgdGhpcy52YWxpZCA9PT0gZmFsc2UgfSxcXHJcXG4gICAgc2hvd0hlbHAgKCkgeyByZXR1cm4gdGhpcy5oZWxwICYmICghdGhpcy5zaG93RXJyb3IgfHwgIXRoaXMuaGlkZUhlbHApIH0sXFxyXFxuICAgIHRleHQgKCkgeyByZXR1cm4gdHJhbnNsYXRpb25zKHRoaXMubGFuZykgfSxcXHJcXG4gICAgdGl0bGUgKCkgeyByZXR1cm4gdGhpcy5lcnJvclRleHQgfHwgdGhpcy5oZWxwIHx8ICcnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBkYXRhbGlzdCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQgJiYgdmFsIGluc3RhbmNlb2YgQXJyYXkpIHsgdGhpcy5vcHRpb25zID0gdmFsIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgbWF0Y2ggKHZhbCkgeyB0aGlzLmV2YWwoKSB9LFxcclxcbiAgICBvcHRpb25zICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdXJsICh2YWwpIHtcXHJcXG4gICAgICB0aGlzLl91cmwoKVxcclxcbiAgICB9LFxcclxcbiAgICB2YWwgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XFxyXFxuICAgICAgICBpZiAodGhpcy5tYXNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcXHJcXG4gICAgICAgICAgdmFsID0gdGhpcy5tYXNrKHZhbCB8fCAnJylcXHJcXG4gICAgICAgICAgaWYgKHRoaXMudmFsICE9PSB2YWwpIHtcXHJcXG4gICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dC5tYXNrKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5tYXNrKVxcclxcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQubWFzayA9IHNldFRpbWVvdXQoKCkgPT4ge1xcclxcbiAgICAgICAgICAgICAgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgICAgICAgICB9LCBpc05hTih0aGlzLm1hc2tEZWxheSkgPyAwIDogdGhpcy5tYXNrRGVsYXkpXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuZXZhbCgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB2YWxpZCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpXFxyXFxuICAgICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LnZhbGlkYXRlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7IHRoaXMudmFsID0gdmFsIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgYXR0ciAodmFsdWUpIHtcXHJcXG4gICAgICByZXR1cm4gflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gbnVsbCA6IHZhbHVlXFxyXFxuICAgIH0sXFxyXFxuICAgIGVtaXQgKGUpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KGUudHlwZSwgZS50eXBlID09ICdpbnB1dCcgPyBlLnRhcmdldC52YWx1ZSA6IGUpXFxyXFxuICAgICAgaWYgKGUudHlwZSA9PT0gJ2JsdXInICYmIHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGV2YWwgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpXFxyXFxuICAgICAgaWYgKCF0aGlzLmNhblZhbGlkYXRlKSB7XFxyXFxuICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKVxcclxcbiAgICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBudWxsXFxyXFxuICAgICAgICB9LCB0aGlzLnZhbGlkYXRpb25EZWxheSlcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGZvY3VzICgpIHsgdGhpcy5pbnB1dC5mb2N1cygpIH0sXFxyXFxuICAgIHN1Ym1pdCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuJHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICAgIGlmICh0aGlzLmlucHV0LmZvcm0pIHtcXHJcXG4gICAgICAgIGNvbnN0IGludmFsaWRzID0gJCgnLmZvcm0tZ3JvdXAudmFsaWRhdGU6bm90KC5oYXMtc3VjY2VzcyknLCB0aGlzLmlucHV0LmZvcm0pXFxyXFxuICAgICAgICBpZiAoaW52YWxpZHMubGVuZ3RoKSB7XFxyXFxuICAgICAgICAgIGludmFsaWRzLmZpbmQoJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcpWzBdLmZvY3VzKClcXHJcXG4gICAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICAgIHRoaXMuaW5wdXQuZm9ybS5zdWJtaXQoKVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWRhdGUgKCkge1xcclxcbiAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkgeyByZXR1cm4gdHJ1ZSB9XFxyXFxuICAgICAgbGV0IHZhbHVlID0gKHRoaXMudmFsIHx8ICcnKS50cmltKClcXHJcXG4gICAgICBpZiAoIXZhbHVlKSB7IHJldHVybiAhdGhpcy5yZXF1aXJlZCB9XFxyXFxuICAgICAgaWYgKHRoaXMubWF0Y2ggIT09IG51bGwpIHsgcmV0dXJuIHRoaXMubWF0Y2ggPT09IHZhbHVlIH1cXHJcXG4gICAgICBpZiAodmFsdWUubGVuZ3RoIDwgdGhpcy5taW5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICBpZiAodGhpcy5uYXRpdmVWYWxpZGF0ZSAmJiAhdGhpcy5pbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICBpZiAodGhpcy5yZWdleCkge1xcclxcbiAgICAgICAgaWYgKCEodGhpcy5yZWdleCBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdGhpcy5yZWdleCh0aGlzLnZhbCkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWwpKSkgeyByZXR1cm4gZmFsc2UgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgICByZXR1cm4gdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICByZXNldCgpIHtcXHJcXG4gICAgICB0aGlzLnZhbHVlID0gJydcXHJcXG4gICAgICB0aGlzLnZhbGlkID0gbnVsbFxcclxcbiAgICAgIGlmICh0aGlzLl90aW1lb3V0Lm1hc2spIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0Lm1hc2spXFxyXFxuICAgICAgaWYgKHRoaXMuX3RpbWVvdXQuZXZhbCkgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQuZXZhbClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9pbnB1dCA9IHRydWVcXHJcXG4gICAgdGhpcy5fdGltZW91dCA9IHt9XFxyXFxuICAgIGxldCBwYXJlbnQgPSB0aGlzLiRwYXJlbnRcXHJcXG4gICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7IHBhcmVudCA9IHBhcmVudC4kcGFyZW50IH1cXHJcXG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcXHJcXG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKVxcclxcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudFxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuX3VybCA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuJGh0dHAgfHwgdGhpcy5fbG9hZGluZykgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy4kaHR0cC5nZXQodGhpcy51cmwpLnRoZW4ocmVzcG9uc2UgPT4ge1xcclxcbiAgICAgICAgdmFyIGRhdGEgPSByZXNwb25zZS5kYXRhIGluc3RhbmNlb2YgQXJyYXkgPyByZXNwb25zZS5kYXRhIDogW11cXHJcXG4gICAgICAgIHRyeSB7IGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpIH0gY2F0Y2ggKGUpIHt9XFxyXFxuICAgICAgICBpZiAodGhpcy51cmxNYXApIHsgZGF0YSA9IGRhdGEubWFwKHRoaXMudXJsTWFwKSB9XFxyXFxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBkYXRhXFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIH0sIHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSwgREVMQVkpXFxyXFxuICAgIGlmICh0aGlzLnVybCkgdGhpcy5fdXJsKClcXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgLy8gJCh0aGlzLmlucHV0KS5vbignZm9jdXMnLCBlID0+IHsgdGhpcy4kZW1pdCgnZm9jdXMnLCBlKSB9KS5vbignYmx1cicsIGUgPT4ge1xcclxcbiAgICAvLyAgIGlmICh0aGlzLmNhblZhbGlkYXRlKSB7IHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKCkgfVxcclxcbiAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxcclxcbiAgICAvLyB9KVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXFxyXFxuICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcXHJcXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKVxcclxcbiAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpXFxyXFxuICAgIH1cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlIHNjb3BlZD5cXHJcXG4uZm9ybS1ncm91cCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxufVxcclxcbmxhYmVsfi5jbG9zZSB7XFxyXFxuICB0b3A6IDI1cHg7XFxyXFxufVxcclxcbi5pbnB1dC1ncm91cD4uaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcclxcbiAgd2lkdGg6MDtcXHJcXG4gIHotaW5kZXg6IDM7XFxyXFxufVxcclxcbi5jbG9zZSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5oYXMtZmVlZGJhY2sgLmNsb3NlIHtcXHJcXG4gIHJpZ2h0OiAyMHB4O1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTE3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdHZhciBERUxBWSA9IDMwMDtcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgY2xlYXJCdXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGNvbHM6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBkYXRhbGlzdDogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGVudGVyU3VibWl0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBlcnJvcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGhlbHA6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBoaWRlSGVscDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBpY29uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBsYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIG1hc2s6IG51bGwsXG5cdCAgICBtYXNrRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDAgfSxcblx0ICAgIG1hdGNoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWF4OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWF4bGVuZ3RoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWluOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWlubGVuZ3RoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHBhdHRlcm46IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgcmVxdWlyZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHJvd3M6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzIH0sXG5cdCAgICBzdGVwOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0JyB9LFxuXHQgICAgdXJsOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdXJsTWFwOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB2YWxpZGF0aW9uRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAyNTAgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgb3B0aW9uczogdGhpcy5kYXRhbGlzdCxcblx0ICAgICAgdmFsOiB2YWwsXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBjYW5WYWxpZGF0ZTogZnVuY3Rpb24gY2FuVmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSAmJiAodGhpcy5yZXF1aXJlZCB8fCB0aGlzLnJlZ2V4IHx8IHRoaXMubmF0aXZlVmFsaWRhdGUgfHwgdGhpcy5tYXRjaCAhPT0gbnVsbCk7XG5cdCAgICB9LFxuXHQgICAgZXJyb3JUZXh0OiBmdW5jdGlvbiBlcnJvclRleHQoKSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG5cdCAgICAgIHZhciBlcnJvciA9IFt0aGlzLmVycm9yXTtcblx0ICAgICAgaWYgKCF2YWx1ZSAmJiB0aGlzLnJlcXVpcmVkKSBlcnJvci5wdXNoKCcoJyArIHRoaXMudGV4dC5yZXF1aXJlZC50b0xvd2VyQ2FzZSgpICsgJyknKTtcblx0ICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSBlcnJvci5wdXNoKCcoJyArIHRoaXMudGV4dC5taW5MZW5ndGgudG9Mb3dlckNhc2UoKSArICc6ICcgKyB0aGlzLm1pbmxlbmd0aCArICcpJyk7XG5cdCAgICAgIHJldHVybiBlcnJvci5qb2luKCcgJyk7XG5cdCAgICB9LFxuXHQgICAgaWRfZGF0YWxpc3Q6IGZ1bmN0aW9uIGlkX2RhdGFsaXN0KCkge1xuXHQgICAgICBpZiAodGhpcy50eXBlICE9PSAndGV4dGFyZWEnICYmIHRoaXMuZGF0YWxpc3QgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIGlmICghdGhpcy5faWRfZGF0YWxpc3QpIHtcblx0ICAgICAgICAgIGlmICghdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCkge1xuXHQgICAgICAgICAgICB0aGlzLiRyb290LmlkX2RhdGFsaXN0ID0gMDtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuX2lkX2RhdGFsaXN0ID0gJ2lucHV0LWRhdGFsaXN0JyArIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QrKztcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2lkX2RhdGFsaXN0O1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfSxcblx0ICAgIGlucHV0OiBmdW5jdGlvbiBpbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgbmF0aXZlVmFsaWRhdGU6IGZ1bmN0aW9uIG5hdGl2ZVZhbGlkYXRlKCkge1xuXHQgICAgICByZXR1cm4gKHRoaXMuaW5wdXQgfHwge30pLmNoZWNrVmFsaWRpdHkgJiYgKH5bJ3VybCcsICdlbWFpbCddLmluZGV4T2YodGhpcy50eXBlLnRvTG93ZXJDYXNlKCkpIHx8IHRoaXMubWluIHx8IHRoaXMubWF4KTtcblx0ICAgIH0sXG5cdCAgICByZWdleDogZnVuY3Rpb24gcmVnZXgoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLnBhdHRlcm4odGhpcy5wYXR0ZXJuKTtcblx0ICAgIH0sXG5cdCAgICBzaG93RXJyb3I6IGZ1bmN0aW9uIHNob3dFcnJvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZXJyb3IgJiYgdGhpcy52YWxpZCA9PT0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvd0hlbHA6IGZ1bmN0aW9uIHNob3dIZWxwKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5oZWxwICYmICghdGhpcy5zaG93RXJyb3IgfHwgIXRoaXMuaGlkZUhlbHApO1xuXHQgICAgfSxcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICB0aXRsZTogZnVuY3Rpb24gdGl0bGUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmVycm9yVGV4dCB8fCB0aGlzLmhlbHAgfHwgJyc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgZGF0YWxpc3Q6IGZ1bmN0aW9uIGRhdGFsaXN0KHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB2YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIHRoaXMub3B0aW9ucyA9IHZhbDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1hdGNoOiBmdW5jdGlvbiBtYXRjaCh2YWwpIHtcblx0ICAgICAgdGhpcy5ldmFsKCk7XG5cdCAgICB9LFxuXHQgICAgb3B0aW9uczogZnVuY3Rpb24gb3B0aW9ucyh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHVybDogZnVuY3Rpb24gdXJsKHZhbCkge1xuXHQgICAgICB0aGlzLl91cmwoKTtcblx0ICAgIH0sXG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICAgIGlmIChfdmFsICE9PSBvbGQpIHtcblx0ICAgICAgICBpZiAodGhpcy5tYXNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICAgIF92YWwgPSB0aGlzLm1hc2soX3ZhbCB8fCAnJyk7XG5cdCAgICAgICAgICBpZiAodGhpcy52YWwgIT09IF92YWwpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQubWFzayA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgIF90aGlzLnZhbCA9IF92YWw7XG5cdCAgICAgICAgICAgIH0sIGlzTmFOKHRoaXMubWFza0RlbGF5KSA/IDAgOiB0aGlzLm1hc2tEZWxheSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXZhbCgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsaWQ6IGZ1bmN0aW9uIHZhbGlkKHZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lzdmFsaWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKTtcblx0ICAgICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LnZhbGlkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBhdHRyOiBmdW5jdGlvbiBhdHRyKHZhbHVlKSB7XG5cdCAgICAgIHJldHVybiB+WycnLCBudWxsLCB1bmRlZmluZWRdLmluZGV4T2YodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBudWxsIDogdmFsdWU7XG5cdCAgICB9LFxuXHQgICAgZW1pdDogZnVuY3Rpb24gZW1pdChlKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoZS50eXBlLCBlLnR5cGUgPT0gJ2lucHV0JyA/IGUudGFyZ2V0LnZhbHVlIDogZSk7XG5cdCAgICAgIGlmIChlLnR5cGUgPT09ICdibHVyJyAmJiB0aGlzLmNhblZhbGlkYXRlKSB7XG5cdCAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGV2YWw6IGZ1bmN0aW9uIF9ldmFsKCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgICBpZiAoIXRoaXMuY2FuVmFsaWRhdGUpIHtcblx0ICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIF90aGlzMi52YWxpZCA9IF90aGlzMi52YWxpZGF0ZSgpO1xuXHQgICAgICAgICAgX3RoaXMyLl90aW1lb3V0LmV2YWwgPSBudWxsO1xuXHQgICAgICAgIH0sIHRoaXMudmFsaWRhdGlvbkRlbGF5KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcblx0ICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuXHQgICAgfSxcblx0ICAgIHN1Ym1pdDogZnVuY3Rpb24gc3VibWl0KCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLmlucHV0LmZvcm0pIHtcblx0ICAgICAgICB2YXIgaW52YWxpZHMgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLmZvcm0tZ3JvdXAudmFsaWRhdGU6bm90KC5oYXMtc3VjY2VzcyknLCB0aGlzLmlucHV0LmZvcm0pO1xuXHQgICAgICAgIGlmIChpbnZhbGlkcy5sZW5ndGgpIHtcblx0ICAgICAgICAgIGludmFsaWRzLmZpbmQoJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcpWzBdLmZvY3VzKCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuaW5wdXQuZm9ybS5zdWJtaXQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG5cdCAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciB2YWx1ZSA9ICh0aGlzLnZhbCB8fCAnJykudHJpbSgpO1xuXHQgICAgICBpZiAoIXZhbHVlKSB7XG5cdCAgICAgICAgcmV0dXJuICF0aGlzLnJlcXVpcmVkO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLm1hdGNoICE9PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2ggPT09IHZhbHVlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbmxlbmd0aCkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5uYXRpdmVWYWxpZGF0ZSAmJiAhdGhpcy5pbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMucmVnZXgpIHtcblx0ICAgICAgICBpZiAoISh0aGlzLnJlZ2V4IGluc3RhbmNlb2YgRnVuY3Rpb24gPyB0aGlzLnJlZ2V4KHRoaXMudmFsKSA6IHRoaXMucmVnZXgudGVzdCh0aGlzLnZhbCkpKSB7XG5cdCAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLnZhbGlkID0gbnVsbDtcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lucHV0ID0gdHJ1ZTtcblx0ICAgIHRoaXMuX3RpbWVvdXQgPSB7fTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgICAgdGhpcy5fdXJsID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdCAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICBpZiAoX3RoaXMzLnVybE1hcCkge1xuXHQgICAgICAgICAgZGF0YSA9IGRhdGEubWFwKF90aGlzMy51cmxNYXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBfdGhpczMub3B0aW9ucyA9IGRhdGE7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LCBERUxBWSk7XG5cdCAgICBpZiAodGhpcy51cmwpIHRoaXMuX3VybCgpO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIC8vICQodGhpcy5pbnB1dCkub24oJ2ZvY3VzJywgZSA9PiB7IHRoaXMuJGVtaXQoJ2ZvY3VzJywgZSkgfSkub24oJ2JsdXInLCBlID0+IHtcblx0ICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XG5cdCAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxuXHQgICAgLy8gfSlcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1ncm91cFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgdmFsaWRhdGU6IF92bS5jYW5WYWxpZGF0ZSwgJ2hhcy1mZWVkYmFjayc6IF92bS5pY29uLCAnaGFzLWVycm9yJzogX3ZtLmNhblZhbGlkYXRlICYmIF92bS52YWxpZCA9PT0gZmFsc2UsICdoYXMtc3VjY2Vzcyc6IF92bS5jYW5WYWxpZGF0ZSAmJiBfdm0udmFsaWRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwibGFiZWxcIiwgWyhfdm0ubGFiZWwpID8gX3ZtLl9jKCdsYWJlbCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNvbnRyb2wtbGFiZWxcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmJlZm9yZSB8fCBfdm0uJHNsb3RzLmFmdGVyKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaW5wdXQtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJiZWZvcmVcIiksIF92bS5fdihcIiBcIiksIF92bS5fYyhfdm0udHlwZSA9PSAndGV4dGFyZWEnID8gX3ZtLnR5cGUgOiAnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgdGFnOiBcInRleHRhcmVhXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiY29sc1wiOiBfdm0uY29scyxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIFwibGlzdFwiOiBfdm0uaWRfZGF0YWxpc3QsXG5cdCAgICAgIFwibWF4XCI6IF92bS5hdHRyKF92bS5tYXgpLFxuXHQgICAgICBcIm1heGxlbmd0aFwiOiBfdm0ubWF4bGVuZ3RoLFxuXHQgICAgICBcIm1pblwiOiBfdm0uYXR0cihfdm0ubWluKSxcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJvd3NcIjogX3ZtLnJvd3MsXG5cdCAgICAgIFwic3RlcFwiOiBfdm0uc3RlcCxcblx0ICAgICAgXCJ0aXRsZVwiOiBfdm0uYXR0cihfdm0udGl0bGUpLFxuXHQgICAgICBcInR5cGVcIjogX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IG51bGwgOiBfdm0udHlwZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImZvY3VzXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImlucHV0XCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfSwgX3ZtLmVtaXRdLFxuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS50eXBlICE9ICd0ZXh0YXJlYScgJiYgX3ZtLmVudGVyU3VibWl0ICYmIF92bS5zdWJtaXQoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uY2xlYXJCdXR0b24gJiYgX3ZtLnZhbHVlKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgaWNvbjogX3ZtLmljb25cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbHVlID0gJydcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pY29uKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSwgWyhfdm0uaWNvbiAmJiBfdm0udmFsaWQgIT09IG51bGwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IFsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsaWQgPyAnb2snIDogJ3JlbW92ZScpXSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYWZ0ZXJcIildLCAyKSA6IFtfdm0uX2MoX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IF92bS50eXBlIDogJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIHRhZzogXCJ0ZXh0YXJlYVwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImNvbHNcIjogX3ZtLmNvbHMsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBcImxpc3RcIjogX3ZtLmlkX2RhdGFsaXN0LFxuXHQgICAgICBcIm1heFwiOiBfdm0uYXR0cihfdm0ubWF4KSxcblx0ICAgICAgXCJtYXhsZW5ndGhcIjogX3ZtLm1heGxlbmd0aCxcblx0ICAgICAgXCJtaW5cIjogX3ZtLmF0dHIoX3ZtLm1pbiksXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXIsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcInJlcXVpcmVkXCI6IF92bS5yZXF1aXJlZCxcblx0ICAgICAgXCJyb3dzXCI6IF92bS5yb3dzLFxuXHQgICAgICBcInN0ZXBcIjogX3ZtLnN0ZXAsXG5cdCAgICAgIFwidGl0bGVcIjogX3ZtLmF0dHIoX3ZtLnRpdGxlKSxcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlID09ICd0ZXh0YXJlYScgPyBudWxsIDogX3ZtLnR5cGVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0udmFsKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJmb2N1c1wiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJpbnB1dFwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH0sIF92bS5lbWl0XSxcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udHlwZSAhPSAndGV4dGFyZWEnICYmIF92bS5lbnRlclN1Ym1pdCAmJiBfdm0uc3VibWl0KClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9ICcnXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmljb24gJiYgX3ZtLnZhbGlkICE9PSBudWxsKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCAnZ2x5cGhpY29uLScgKyAoX3ZtLnZhbGlkID8gJ29rJyA6ICdyZW1vdmUnKV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKV0sIF92bS5fdihcIiBcIiksIChfdm0uaWRfZGF0YWxpc3QpID8gX3ZtLl9jKCdkYXRhbGlzdCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiaWRcIjogX3ZtLmlkX2RhdGFsaXN0XG5cdCAgICB9XG5cdCAgfSwgX3ZtLl9sKChfdm0ub3B0aW9ucyksIGZ1bmN0aW9uKG9wYykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnb3B0aW9uJywge1xuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidmFsdWVcIjogb3BjXG5cdCAgICAgIH1cblx0ICAgIH0pXG5cdCAgfSkpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uc2hvd0hlbHApID8gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoZWxwLWJsb2NrXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5mb2N1c1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWxwKSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLnNob3dFcnJvcikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmVycm9yVGV4dCkpXSkgOiBfdm0uX2UoKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY1MmFkN2I5XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcTW9kYWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWZlN2Q1ZGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1mZTdkNWRjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE1vZGFsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5tb2RhbCB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbn1cXG4ubW9kYWwuaW4ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjUpO1xcbn1cXG4ubW9kYWwuem9vbSAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdG9wOiAzMDBweDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4zcztcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzO1xcbn1cXG4ubW9kYWwuem9vbS5pbiAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgb3BhY2l0eTogMTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9Nb2RhbC52dWU/MWZkZDYyNjBcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXNHQTtFQUNBLDBCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0NBQ0E7QUFDQTtFQUNBLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSwwQkFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLDBCQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7RUFDQSx5QkFBQTtFQUNBLHdCQUFBO0VBQ0Esb0JBQUE7RUFDQSw2Q0FBQTtFQUNBLHFDQUFBO0VBQ0EsV0FBQTtDQUNBXCIsXCJmaWxlXCI6XCJNb2RhbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByb2xlPVxcXCJkaWFsb2dcXFwiIDpjbGFzcz1cXFwiWydtb2RhbCcsZWZmZWN0XVxcXCIgQGNsaWNrPVxcXCJiYWNrZHJvcCYmYWN0aW9uKGZhbHNlLDEpXFxcIiBAdHJhbnNpdGlvbmVuZD1cXFwidHJhbnNpdGlvbiA9IGZhbHNlXFxcIj5cXHJcXG4gICAgPGRpdiA6Y2xhc3M9XFxcIlsnbW9kYWwtZGlhbG9nJyx7J21vZGFsLWxnJzpsYXJnZSwnbW9kYWwtc20nOnNtYWxsfV1cXFwiIHJvbGU9XFxcImRvY3VtZW50XFxcIiA6c3R5bGU9XFxcInt3aWR0aDogb3B0aW9uYWxXaWR0aH1cXFwiIEBjbGljay5zdG9wPVxcXCJhY3Rpb24obnVsbClcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcImFjdGlvbihmYWxzZSwyKVxcXCI+PHNwYW4+JnRpbWVzOzwvc3Bhbj48L2J1dHRvbj5cXHJcXG4gICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj48c2xvdCBuYW1lPVxcXCJ0aXRsZVxcXCI+e3t0aXRsZX19PC9zbG90PjwvaDQ+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9zbG90PlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtYm9keVxcXCI+PGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+PHNsb3Q+PC9zbG90PjwvZGl2Pjwvc2xvdD5cXHJcXG4gICAgICAgIDxzbG90IG5hbWU9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIEBjbGljaz1cXFwiYWN0aW9uKGZhbHNlLDMpXFxcIj57eyBjYW5jZWxUZXh0IH19PC9idXR0b24+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwiYWN0aW9uKHRydWUsNClcXFwiPnt7IG9rVGV4dCB9fTwvYnV0dG9uPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgIDwvc2xvdD5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtnZXRTY3JvbGxCYXJXaWR0aH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBiYWNrZHJvcDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWV9LFxcclxcbiAgICBjYWxsYmFjazoge3R5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgY2FuY2VsVGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJ30sXFxyXFxuICAgIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxhcmdlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBva1RleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnfSxcXHJcXG4gICAgc21hbGw6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHRpdGxlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJ30sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWV9LFxcclxcbiAgICB3aWR0aDoge2RlZmF1bHQ6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgdHJhbnNpdGlvbjogZmFsc2UsXFxyXFxuICAgICAgdmFsOiBudWxsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBvcHRpb25hbFdpZHRoICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy53aWR0aCA9PT0gbnVsbCkge1xcclxcbiAgICAgICAgcmV0dXJuIG51bGxcXHJcXG4gICAgICB9IGVsc2UgaWYgKE51bWJlci5pc0ludGVnZXIodGhpcy53aWR0aCkpIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoICsgJ3B4J1xcclxcbiAgICAgIH1cXHJcXG4gICAgICByZXR1cm4gdGhpcy53aWR0aFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgdHJhbnNpdGlvbiAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSBvbGQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBjb25zdCBlbCA9IHRoaXMuJGVsXFxyXFxuICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHlcXHJcXG4gICAgICBpZiAodmFsKSB7Ly9zdGFydGluZ1xcclxcbiAgICAgICAgaWYgKHRoaXMudmFsKSB7XFxyXFxuICAgICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1jb250ZW50JykuZm9jdXMoKVxcclxcbiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xcclxcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGVsLmNsYXNzTGlzdC5hZGQoJ2luJyksIDApXFxyXFxuICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICAgIGlmIChnZXRTY3JvbGxCYXJXaWR0aCgpICE9PSAwKSB7XFxyXFxuICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBnZXRTY3JvbGxCYXJXaWR0aCgpICsgJ3B4J1xcclxcbiAgICAgICAgICB9XFxyXFxuICAgICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpbicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfSBlbHNlIHsvL2VuZGluZ1xcclxcbiAgICAgICAgdGhpcy4kZW1pdCh0aGlzLnZhbCA/ICdvcGVuZWQnIDogJ2Nsb3NlZCcpXFxyXFxuICAgICAgICBpZiAoIXRoaXMudmFsKSB7XFxyXFxuICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcXHJcXG4gICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsXFxyXFxuICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB2YWwgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgaWYgKG9sZCA9PT0gbnVsbCA/IHZhbCA9PT0gdHJ1ZSA6IHZhbCAhPT0gb2xkKSB0aGlzLnRyYW5zaXRpb24gPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgYWN0aW9uICh2YWwscCkge1xcclxcbiAgICAgIGlmICh2YWwgPT09IG51bGwpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBpZiAodmFsICYmIHRoaXMuY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbikgdGhpcy5jYWxsYmFjaygpXFxyXFxuICAgICAgdGhpcy4kZW1pdCh2YWwgPyAnb2snIDogJ2NhbmNlbCcscClcXHJcXG4gICAgICB0aGlzLnZhbCA9IHZhbCB8fCBmYWxzZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMudmFsID0gdGhpcy52YWx1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG48c3R5bGU+XFxyXFxuLm1vZGFsIHtcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxufVxcclxcbi5tb2RhbC5pbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7XFxyXFxufVxcclxcbi5tb2RhbC56b29tIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0b3A6IDMwMHB4O1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxuICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxufVxcclxcbi5tb2RhbC56b29tLmluIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICBvcGFjaXR5OiAxO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfaXNJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjMpO1xuXHRcblx0dmFyIF9pc0ludGVnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJbnRlZ2VyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJhY2tkcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGNhbGxiYWNrOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjYW5jZWxUZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJyB9LFxuXHQgICAgZWZmZWN0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFyZ2U6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG9rVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnIH0sXG5cdCAgICBzbWFsbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHRyYW5zaXRpb246IGZhbHNlLFxuXHQgICAgICB2YWw6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIG9wdGlvbmFsV2lkdGg6IGZ1bmN0aW9uIG9wdGlvbmFsV2lkdGgoKSB7XG5cdCAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgIH0gZWxzZSBpZiAoKDAsIF9pc0ludGVnZXIyLmRlZmF1bHQpKHRoaXMud2lkdGgpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24odmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCA9PT0gb2xkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIGlmICh2YWwpIHtcblx0ICAgICAgICAvL3N0YXJ0aW5nXG5cdCAgICAgICAgaWYgKHRoaXMudmFsKSB7XG5cdCAgICAgICAgICBlbC5xdWVyeVNlbGVjdG9yKCcubW9kYWwtY29udGVudCcpLmZvY3VzKCk7XG5cdCAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0ICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZWwuY2xhc3NMaXN0LmFkZCgnaW4nKTtcblx0ICAgICAgICAgIH0sIDApO1xuXHQgICAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgICBpZiAoKDAsIF91dGlscy5nZXRTY3JvbGxCYXJXaWR0aCkoKSAhPT0gMCkge1xuXHQgICAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCkgKyAncHgnO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpbicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAvL2VuZGluZ1xuXHQgICAgICAgIHRoaXMuJGVtaXQodGhpcy52YWwgPyAnb3BlbmVkJyA6ICdjbG9zZWQnKTtcblx0ICAgICAgICBpZiAoIXRoaXMudmFsKSB7XG5cdCAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHQgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsO1xuXHQgICAgICAgICAgYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICAgIGlmIChvbGQgPT09IG51bGwgPyBfdmFsID09PSB0cnVlIDogX3ZhbCAhPT0gb2xkKSB0aGlzLnRyYW5zaXRpb24gPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMudmFsID0gdmFsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYWN0aW9uOiBmdW5jdGlvbiBhY3Rpb24odmFsLCBwKSB7XG5cdCAgICAgIGlmICh2YWwgPT09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbCAmJiB0aGlzLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHRoaXMuY2FsbGJhY2soKTtcblx0ICAgICAgdGhpcy4kZW1pdCh2YWwgPyAnb2snIDogJ2NhbmNlbCcsIHApO1xuXHQgICAgICB0aGlzLnZhbCA9IHZhbCB8fCBmYWxzZTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTIzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMTI0KSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMTI0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5OdW1iZXIuaXNJbnRlZ2VyO1xuXG4vKioqLyB9LFxuLyogMTI1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7aXNJbnRlZ2VyOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNil9KTtcblxuLyoqKi8gfSxcbi8qIDEyNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpXG5cdCAgLCBmbG9vciAgICA9IE1hdGguZmxvb3I7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KXtcblx0ICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEyNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydtb2RhbCcsIF92bS5lZmZlY3RdLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwiZGlhbG9nXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5iYWNrZHJvcCAmJiBfdm0uYWN0aW9uKGZhbHNlLCAxKVxuXHQgICAgICB9LFxuXHQgICAgICBcInRyYW5zaXRpb25lbmRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnRyYW5zaXRpb24gPSBmYWxzZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsnbW9kYWwtZGlhbG9nJywge1xuXHQgICAgICAnbW9kYWwtbGcnOiBfdm0ubGFyZ2UsXG5cdCAgICAgICdtb2RhbC1zbSc6IF92bS5zbWFsbFxuXHQgICAgfV0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS5vcHRpb25hbFdpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRvY3VtZW50XCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICBfdm0uYWN0aW9uKG51bGwpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1jb250ZW50XCJcblx0ICB9LCBbX3ZtLl90KFwibW9kYWwtaGVhZGVyXCIsIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uYWN0aW9uKGZhbHNlLCAyKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnaDQnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcInRpdGxlXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXSldLCAyKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fdChcIm1vZGFsLWJvZHlcIiwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibW9kYWwtYm9keVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJtb2RhbC1mb290ZXJcIiwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibW9kYWwtZm9vdGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4gYnRuLWRlZmF1bHRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uYWN0aW9uKGZhbHNlLCAzKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmNhbmNlbFRleHQpKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJ0biBidG4tcHJpbWFyeVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5hY3Rpb24odHJ1ZSwgNClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5va1RleHQpKV0pXSldKV0sIDIpXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mZTdkNWRjOFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEyOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXE5hdmJhci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzhmMDYxOWVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTM4ZjA2MTllXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gTmF2YmFyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdkZWZhdWx0JyB9LFxuXHQgICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfSxcblx0ICAgIGNvbnRhaW5lcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpZDogJ2JzLWV4YW1wbGUtbmF2YmFyLWNvbGxhcHNlLTEnLFxuXHQgICAgICBjb2xsYXBzZWQ6IHRydWUsXG5cdCAgICAgIHN0eWxlczoge31cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHNsb3RzOiBmdW5jdGlvbiBzbG90cygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3Nsb3RDb250ZW50cztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZUNvbGxhcHNlOiBmdW5jdGlvbiB0b2dnbGVDb2xsYXBzZShlKSB7XG5cdCAgICAgIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9uYXZiYXIgPSB0cnVlO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgdHJ5IHtcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgJGRyb3Bkb3duID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bj5bZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsIF90aGlzLiRlbCkucGFyZW50KCk7XG5cdCAgICAgICAgaWYgKCRkcm9wZG93bikge1xuXHQgICAgICAgICAgJGRyb3Bkb3duLm9uKCdjbGljaycsICcuZHJvcGRvd24tdG9nZ2xlJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub24oJ2NsaWNrJywgJy5kcm9wZG93bi1tZW51PmxpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub25CbHVyKGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgICRkcm9wZG93bi5lYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG5cdCAgICAgICAgICAgICAgaWYgKCFjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KSgpO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGZpbmRpbmcgZHJvcGRvd24nKTtcblx0ICAgIH1cblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub24oJ2NsaWNrIHRvdWNoc3RhcnQnLCAnbGk6bm90KC5kcm9wZG93bik+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIF90aGlzLmNvbGxhcHNlZCA9IHRydWU7XG5cdCAgICAgIH0sIDIwMCk7XG5cdCAgICB9KS5vbkJsdXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCFfdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKSB7XG5cdCAgICAgICAgX3RoaXMuY29sbGFwc2VkID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICB2YXIgaGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0O1xuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAndG9wJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdUb3AgPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZUNvbGxhcHNlKGUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bicsIHRoaXMuJGVsKS5vZmYoJ2NsaWNrJykub2ZmQmx1cigpO1xuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub2ZmKCdjbGljaycpO1xuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXInLCAnbmF2YmFyLScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudCA9PT0gJ3N0YXRpYycgPyAnbmF2YmFyLXN0YXRpYy10b3AnIDogJ25hdmJhci1maXhlZC0nICsgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogX3ZtLmNvbnRhaW5lciA9PT0gJ2ZsdWlkJyA/ICdjb250YWluZXItZmx1aWQnIDogJ2NvbnRhaW5lcidcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXZiYXItaGVhZGVyXCJcblx0ICB9LCBbKCFfdm0uJHNsb3RzLmNvbGxhcHNlKSA/IF92bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2YmFyLXRvZ2dsZSBjb2xsYXBzZWRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiLFxuXHQgICAgICBcImFyaWEtZXhwYW5kZWRcIjogXCJmYWxzZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlQ29sbGFwc2Vcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Itb25seVwiXG5cdCAgfSwgW192bS5fdihcIlRvZ2dsZSBuYXZpZ2F0aW9uXCIpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24tYmFyXCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbi1iYXJcIlxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uLWJhclwiXG5cdCAgfSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJjb2xsYXBzZVwiKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYnJhbmRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXItY29sbGFwc2UnLCB7XG5cdCAgICAgIGNvbGxhcHNlOiBfdm0uY29sbGFwc2VkXG5cdCAgICB9XVxuXHQgIH0sIFtfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2IG5hdmJhci1uYXZcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmxlZnQpID8gX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdiBuYXZiYXItbmF2IG5hdmJhci1sZWZ0XCJcblx0ICB9LCBbX3ZtLl90KFwibGVmdFwiKV0sIDIpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLnJpZ2h0KSA/IF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXYgbmF2YmFyLW5hdiBuYXZiYXItcmlnaHRcIlxuXHQgIH0sIFtfdm0uX3QoXCJyaWdodFwiKV0sIDIpIDogX3ZtLl9lKCldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzhmMDYxOWVcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxPcHRpb24udnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQyMDg4MTE2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00MjA4ODExNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE9wdGlvbi52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7IHZhbHVlOiBudWxsIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7IGxvYWRpbmc6IHRydWUgfTtcblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAodGhpcy4kcGFyZW50Ll9zZWxlY3QpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRwYXJlbnQub3B0aW9ucykge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC5vcHRpb25zID0gW107XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGVsID0ge307XG5cdCAgICAgIGVsW3RoaXMuJHBhcmVudC5vcHRpb25zTGFiZWxdID0gdGhpcy4kZWwuaW5uZXJIVE1MO1xuXHQgICAgICBlbFt0aGlzLiRwYXJlbnQub3B0aW9uc1ZhbHVlXSA9IHRoaXMudmFsdWU7XG5cdCAgICAgIHRoaXMuJHBhcmVudC5vcHRpb25zLnB1c2goZWwpO1xuXHQgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnNvbGUud2Fybignb3B0aW9ucyBvbmx5IHdvcmsgaW5zaWRlIGEgc2VsZWN0IGNvbXBvbmVudCcpO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gKF92bS5sb2FkaW5nKSA/IF92bS5fYygnbGknLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpIDogX3ZtLl9lKClcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDIwODgxMTZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTM1KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTM3KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzOClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQYW5lbC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWIxZTA0NjFhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUGFuZWwudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTM1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzYpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWIxZTA0NjFhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9QYW5lbC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWIxZTA0NjFhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9QYW5lbC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjY29yZGlvbi10b2dnbGUge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uY29sbGFwc2UtZW50ZXItYWN0aXZlLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIC41cyBlYXNlO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuLmNvbGxhcHNlLWVudGVyLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcbn1cXHJcXG5cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1BhbmVsLnZ1ZT82MGU3OThlMlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBeUVBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBOztFQUVBLHlCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBOztDQUdBXCIsXCJmaWxlXCI6XCJQYW5lbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiA6Y2xhc3M9XFxcIlsncGFuZWwnLHBhbmVsVHlwZV1cXFwiPlxcclxcbiAgICA8ZGl2IDpjbGFzcz1cXFwiWydwYW5lbC1oZWFkaW5nJyx7J2FjY29yZGlvbi10b2dnbGUnOmluQWNjb3JkaW9ufV1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJpbkFjY29yZGlvbiYmdG9nZ2xlKClcXFwiPlxcclxcbiAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGg0IGNsYXNzPVxcXCJwYW5lbC10aXRsZVxcXCI+e3sgaGVhZGVyIH19PC9oND48L3Nsb3Q+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8dHJhbnNpdGlvblxcclxcbiAgICAgIG5hbWU9XFxcImNvbGxhcHNlXFxcIlxcclxcbiAgICAgIEBlbnRlcj1cXFwiZW50ZXJcXFwiXFxyXFxuICAgICAgQGFmdGVyLWVudGVyPVxcXCJhZnRlckVudGVyXFxcIlxcclxcbiAgICAgIEBiZWZvcmUtbGVhdmU9XFxcImJlZm9yZUxlYXZlXFxcIlxcclxcbiAgICA+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtY29sbGFwc2VcXFwiIHYtaWY9XFxcIm9wZW5cXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtYm9keVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L3RyYW5zaXRpb24+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgaGVhZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgaXNPcGVuOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQgOiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgb3BlbjogdGhpcy5pc09wZW5cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGlzT3BlbiggdmFsICkge1xcclxcbiAgICAgIHRoaXMub3BlbiA9IHZhbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgaW5BY2NvcmRpb24gKCkgeyByZXR1cm4gdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5faXNBY2NvcmRpb24gfSxcXHJcXG4gICAgcGFuZWxUeXBlICgpIHsgcmV0dXJuICdwYW5lbC0nICsgKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSB8fCAnZGVmYXVsdCcpIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gIXRoaXMub3BlblxcclxcbiAgICAgIGlmICh0aGlzLmluQWNjb3JkaW9uKSB7XFxyXFxuICAgICAgICB0aGlzLiRwYXJlbnQub3BlbkNoaWxkKHRoaXMpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBlbnRlciAoZWwpIHtcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0bydcXHJcXG4gICAgICB2YXIgZW5kV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKGVsKS5oZWlnaHRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnMHB4J1xcclxcbiAgICAgIGVsLm9mZnNldEhlaWdodCAvLyBmb3JjZSByZXBhaW50XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZW5kV2lkdGg7XFxyXFxuICAgIH0sXFxyXFxuICAgIGFmdGVyRW50ZXIgKGVsKSB7XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXFxyXFxuICAgIH0sXFxyXFxuICAgIGJlZm9yZUxlYXZlIChlbCkge1xcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodFxcclxcbiAgICAgIGVsLm9mZnNldEhlaWdodCAvLyBmb3JjZSByZXBhaW50XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCdcXHJcXG4gICAgfSxcXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaXNPcGVuID09PSBudWxsKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gIXRoaXMuaW5BY2NvcmRpb25cXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmFjY29yZGlvbi10b2dnbGUge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG4uY29sbGFwc2UtZW50ZXItYWN0aXZlLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIC41cyBlYXNlO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG59XFxyXFxuLmNvbGxhcHNlLWVudGVyLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTM3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgaGVhZGVyOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgaXNPcGVuOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBvcGVuOiB0aGlzLmlzT3BlblxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICB3YXRjaDoge1xuXHQgICAgaXNPcGVuOiBmdW5jdGlvbiBpc09wZW4odmFsKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBpbkFjY29yZGlvbjogZnVuY3Rpb24gaW5BY2NvcmRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50Ll9pc0FjY29yZGlvbjtcblx0ICAgIH0sXG5cdCAgICBwYW5lbFR5cGU6IGZ1bmN0aW9uIHBhbmVsVHlwZSgpIHtcblx0ICAgICAgcmV0dXJuICdwYW5lbC0nICsgKHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLm9wZW4gPSAhdGhpcy5vcGVuO1xuXHQgICAgICBpZiAodGhpcy5pbkFjY29yZGlvbikge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC5vcGVuQ2hpbGQodGhpcyk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBlbnRlcjogZnVuY3Rpb24gZW50ZXIoZWwpIHtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuXHQgICAgICB2YXIgZW5kV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKGVsKS5oZWlnaHQ7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuXHQgICAgICBlbC5vZmZzZXRIZWlnaHQ7IC8vIGZvcmNlIHJlcGFpbnRcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZW5kV2lkdGg7XG5cdCAgICB9LFxuXHQgICAgYWZ0ZXJFbnRlcjogZnVuY3Rpb24gYWZ0ZXJFbnRlcihlbCkge1xuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG5cdCAgICB9LFxuXHQgICAgYmVmb3JlTGVhdmU6IGZ1bmN0aW9uIGJlZm9yZUxlYXZlKGVsKSB7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodDtcblx0ICAgICAgZWwub2Zmc2V0SGVpZ2h0OyAvLyBmb3JjZSByZXBhaW50XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIGlmICh0aGlzLmlzT3BlbiA9PT0gbnVsbCkge1xuXHQgICAgICB0aGlzLm9wZW4gPSAhdGhpcy5pbkFjY29yZGlvbjtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncGFuZWwnLCBfdm0ucGFuZWxUeXBlXVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiBbJ3BhbmVsLWhlYWRpbmcnLCB7XG5cdCAgICAgICdhY2NvcmRpb24tdG9nZ2xlJzogX3ZtLmluQWNjb3JkaW9uXG5cdCAgICB9XSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLmluQWNjb3JkaW9uICYmIF92bS50b2dnbGUoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdoNCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLXRpdGxlXCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0uaGVhZGVyKSldKV0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImNvbGxhcHNlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImVudGVyXCI6IF92bS5lbnRlcixcblx0ICAgICAgXCJhZnRlci1lbnRlclwiOiBfdm0uYWZ0ZXJFbnRlcixcblx0ICAgICAgXCJiZWZvcmUtbGVhdmVcIjogX3ZtLmJlZm9yZUxlYXZlXG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ub3BlbikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWNvbGxhcHNlXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJwYW5lbC1ib2R5XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTQwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0NClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQb3BvdmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0yNDY1YmY1NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMjQ2NWJmNTRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQb3BvdmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE0MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0yNDY1YmY1NCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vUG9wb3Zlci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTI0NjViZjU0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Qb3BvdmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4ucG9wb3Zlci50b3AsXFxyXFxuLnBvcG92ZXIubGVmdCxcXHJcXG4ucG9wb3Zlci5yaWdodCxcXHJcXG4ucG9wb3Zlci5ib3R0b20ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcbi5zY2FsZS1lbnRlciB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtaW4gMC4xNXMgZWFzZS1pbjtcXG59XFxuLnNjYWxlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtb3V0IDAuMTVzIGVhc2Utb3V0O1xcbn1cXG5Aa2V5ZnJhbWVzIHNjYWxlLWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzY2FsZS1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1BvcG92ZXIudnVlP2U2MTY5NjNhXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF5QkE7Ozs7RUFJQSxlQUFBO0NBQ0E7QUFDQTtFQUNBLGlDQUFBO0NBQ0E7QUFDQTtFQUNBLG1DQUFBO0NBQ0E7QUFDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLG9CQUFBO0lBQ0EsV0FBQTtDQUNBO0NBQ0E7QUFDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLG9CQUFBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlBvcG92ZXIudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWydwb3BvdmVyJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImFycm93XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxoMyBjbGFzcz1cXFwicG9wb3Zlci10aXRsZVxcXCIgdi1pZj1cXFwidGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcInRpdGxlXFxcIj57e3RpdGxlfX08L3Nsb3Q+PC9oMz5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInBvcG92ZXItY29udGVudFxcXCI+PHNsb3QgbmFtZT1cXFwiY29udGVudFxcXCI+PHNwYW4gdi1odG1sPVxcXCJjb250ZW50XFxcIj48L3NwYW4+PC9zbG90PjwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L3RyYW5zaXRpb24+XFxyXFxuICA8L3NwYW4+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCBQb3BvdmVyTWl4aW4gZnJvbSAnLi91dGlscy9wb3BvdmVyTWl4aW5zLmpzJ1xcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIG1peGluczogW1BvcG92ZXJNaXhpbl0sXFxyXFxuICBwcm9wczoge1xcclxcbiAgICB0cmlnZ2VyOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLnBvcG92ZXIudG9wLFxcclxcbi5wb3BvdmVyLmxlZnQsXFxyXFxuLnBvcG92ZXIucmlnaHQsXFxyXFxuLnBvcG92ZXIuYm90dG9tIHtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbn1cXHJcXG4uc2NhbGUtZW50ZXIge1xcclxcbiAgYW5pbWF0aW9uOnNjYWxlLWluIDAuMTVzIGVhc2UtaW47XFxyXFxufVxcclxcbi5zY2FsZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNjYWxlLW91dCAwLjE1cyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzY2FsZS1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzY2FsZS1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9wb3BvdmVyTWl4aW5zID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDMpO1xuXHRcblx0dmFyIF9wb3BvdmVyTWl4aW5zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BvcG92ZXJNaXhpbnMpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBtaXhpbnM6IFtfcG9wb3Zlck1peGluczIuZGVmYXVsdF0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxNDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGNvbnRlbnQ6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZmFkZScgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndG9wJyB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgdG9wOiAwLFxuXHQgICAgICBsZWZ0OiAwLFxuXHQgICAgICBzaG93OiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgZXZlbnRzOiBmdW5jdGlvbiBldmVudHMoKSB7XG5cdCAgICAgIHJldHVybiB7IGNvbnRleHRtZW51OiBbJ2NvbnRleHRtZW51J10sIGhvdmVyOiBbJ21vdXNlbGVhdmUnLCAnbW91c2VlbnRlciddLCBmb2N1czogWydibHVyJywgJ2ZvY3VzJ10gfVt0aGlzLnRyaWdnZXJdIHx8IFsnY2xpY2snXTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJlZm9yZUVudGVyOiBmdW5jdGlvbiBiZWZvcmVFbnRlcigpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMucG9zaXRpb24oKTtcblx0ICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIF90aGlzLnBvc2l0aW9uKCk7XG5cdCAgICAgIH0sIDMwKTtcblx0ICAgIH0sXG5cdCAgICBwb3NpdGlvbjogZnVuY3Rpb24gcG9zaXRpb24oKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBwb3BvdmVyID0gX3RoaXMyLiRyZWZzLnBvcG92ZXI7XG5cdCAgICAgICAgdmFyIHRyaWdnZXIgPSBfdGhpczIuJHJlZnMudHJpZ2dlci5jaGlsZHJlblswXTtcblx0ICAgICAgICBzd2l0Y2ggKF90aGlzMi5wbGFjZW1lbnQpIHtcblx0ICAgICAgICAgIGNhc2UgJ3RvcCc6XG5cdCAgICAgICAgICAgIF90aGlzMi5sZWZ0ID0gdHJpZ2dlci5vZmZzZXRMZWZ0IC0gcG9wb3Zlci5vZmZzZXRXaWR0aCAvIDIgKyB0cmlnZ2VyLm9mZnNldFdpZHRoIC8gMjtcblx0ICAgICAgICAgICAgX3RoaXMyLnRvcCA9IHRyaWdnZXIub2Zmc2V0VG9wIC0gcG9wb3Zlci5vZmZzZXRIZWlnaHQ7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAnbGVmdCc6XG5cdCAgICAgICAgICAgIF90aGlzMi5sZWZ0ID0gdHJpZ2dlci5vZmZzZXRMZWZ0IC0gcG9wb3Zlci5vZmZzZXRXaWR0aDtcblx0ICAgICAgICAgICAgX3RoaXMyLnRvcCA9IHRyaWdnZXIub2Zmc2V0VG9wICsgdHJpZ2dlci5vZmZzZXRIZWlnaHQgLyAyIC0gcG9wb3Zlci5vZmZzZXRIZWlnaHQgLyAyO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgJ3JpZ2h0Jzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgKyB0cmlnZ2VyLm9mZnNldFdpZHRoO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodCAvIDIgLSBwb3BvdmVyLm9mZnNldEhlaWdodCAvIDI7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAnYm90dG9tJzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoIC8gMiArIHRyaWdnZXIub2Zmc2V0V2lkdGggLyAyO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodDtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1dyb25nIHBsYWNlbWVudCBwcm9wJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHBvcG92ZXIuc3R5bGUudG9wID0gX3RoaXMyLnRvcCArICdweCc7XG5cdCAgICAgICAgcG9wb3Zlci5zdHlsZS5sZWZ0ID0gX3RoaXMyLmxlZnQgKyAncHgnO1xuXHQgICAgICB9KTtcblx0ICAgIH0sXG5cdCAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZShlKSB7XG5cdCAgICAgIGlmIChlICYmIHRoaXMudHJpZ2dlciA9PT0gJ2NvbnRleHRtZW51JykgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICBpZiAodGhpcy5zaG93KSB0aGlzLmJlZm9yZUVudGVyKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cdFxuXHQgICAgdmFyIHRyaWdnZXIgPSB0aGlzLiRyZWZzLnRyaWdnZXIuY2hpbGRyZW5bMF07XG5cdCAgICBpZiAoIXRyaWdnZXIpIHJldHVybiBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgZmluZCB0cmlnZ2VyIHYtZWwgaW4geW91ciBjb21wb25lbnQgdGhhdCB1c2VzIHBvcG92ZXJNaXhpbi4nKTtcblx0XG5cdCAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnICYmICF+dHJpZ2dlci50YWJJbmRleCkge1xuXHQgICAgICB0cmlnZ2VyID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJ2EsaW5wdXQsc2VsZWN0LHRleHRhcmVhLGJ1dHRvbicsIHRyaWdnZXIpO1xuXHQgICAgICBpZiAoIXRyaWdnZXIubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0cmlnZ2VyKS5vbihldmVudCwgX3RoaXMzLnRvZ2dsZSk7XG5cdCAgICB9KTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fdHJpZ2dlcikgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fdHJpZ2dlcikub2ZmKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTQ0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWydwb3BvdmVyJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhcnJvd1wiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0udGl0bGUpID8gX3ZtLl9jKCdoMycsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBvcG92ZXItdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3QoXCJ0aXRsZVwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJwb3BvdmVyLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJjb250ZW50XCIsIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMjQ2NWJmNTRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ2KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0Nylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQcm9ncmVzc2Jhci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNjhhYTMzNzVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTY4YWEzMzc1XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUHJvZ3Jlc3NiYXIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQ2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYW5pbWF0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhYmVsOiB7IGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBub3c6IHsgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHN0cmlwZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBsYWJlbEJvb2w6IGZ1bmN0aW9uIGxhYmVsQm9vbCgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLmxhYmVsKTtcblx0ICAgIH0sXG5cdCAgICBub3dOdW06IGZ1bmN0aW9uIG5vd051bSgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UubnVtYmVyKHRoaXMubm93KTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxNDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncHJvZ3Jlc3MtYmFyJywgJ3Byb2dyZXNzLWJhci0nICsgX3ZtLnR5cGUsIHtcblx0ICAgICAgYWN0aXZlOiBfdm0uYW5pbWF0ZWQsXG5cdCAgICAgICdwcm9ncmVzcy1iYXItc3RyaXBlZCc6IF92bS5zdHJpcGVkXG5cdCAgICB9XSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLm5vd051bSArICclJ1xuXHQgICAgfSksXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInRleHRDb250ZW50XCI6IF92bS5fcyhfdm0ubGFiZWxCb29sID8gX3ZtLm5vd051bSArICclJyA6IG51bGwpXG5cdCAgICB9XG5cdCAgfSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNjhhYTMzNzVcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTQ5KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUxKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Milcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxSYWRpby52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzRjZmQ5MmNcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTc0Y2ZkOTJjXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUmFkaW8udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQ5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTApO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTc0Y2ZkOTJjIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9SYWRpby52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTc0Y2ZkOTJjIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9SYWRpby52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnJhZGlvIHsgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0IHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjE1cmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuN3JlbTtcXHJcXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxyXFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZC1zaXplOiA1MCUgNTAlO1xcbn1cXG4ucmFkaW86bm90KC5hY3RpdmUpID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2JiYjtcXG59XFxuLnJhZGlvID4gbGFiZWwgPiBpbnB1dDpmb2N1cyB+IC5pY29uIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjNjZhZmU5O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxuLnJhZGlvLmFjdGl2ZSA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1zaXplOiAxcmVtIDFyZW07XFxyXFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p4emRtY2dkbVZ5YzJsdmJqMGlNUzR4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpUGp4amFYSmpiR1VnWTNnOUlqVWlJR041UFNJMUlpQnlQU0kwSWlCbWFXeHNQU0lqWm1abUlpOCtQQzl6ZG1jKyk7XFxufVxcbi5yYWRpby5hY3RpdmUgLmJ0bi1kZWZhdWx0IHsgZmlsdGVyOiBicmlnaHRuZXNzKDc1JSk7XFxufVxcbi5yYWRpby5kaXNhYmxlZCA+IGxhYmVsID4gLmljb24sXFxyXFxuLnJhZGlvLnJlYWRvbmx5ID4gbGFiZWwgPiAuaWNvbixcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcbn1cXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPXJhZGlvXSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUmFkaW8udnVlPzExNjI0YzQ4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUE4R0EsU0FBQSxtQkFBQTtDQUFBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLFVBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLFlBQUE7RUFDQSxRQUFBO0VBQ0EsZUFBQTtFQUNBLGNBQUE7RUFDQSxlQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtFQUNBLHFCQUFBO0VBQ0EsNkJBQUE7RUFDQSxtQ0FBQTtFQUNBLHlCQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLDBCQUFBO0VBQ0EsMEVBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7RUFDQSw4T0FBQTtDQUNBO0FBQ0EsNkJBQUEsd0JBQUE7Q0FBQTtBQUVBOzs7RUFHQSwwQkFBQTtFQUNBLGlCQUFBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiUmFkaW8udnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgOmlzPVxcXCJidXR0b25TdHlsZT8nbGFiZWwnOidkaXYnXFxcIiBAY2xpY2sucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICA6Y2xhc3M9XFxcIlsoYnV0dG9uU3R5bGU/J2J0biBidG4tJyt0eXBlQ29sb3I6J3JhZGlvICcrdHlwZUNvbG9yKSx7YWN0aXZlOmFjdGl2ZSxkaXNhYmxlZDpkaXNhYmxlZCxyZWFkb25seTpyZWFkb25seX1dXFxcIlxcclxcbiAgPlxcclxcbiAgICA8dGVtcGxhdGUgdi1pZj1cXFwiYnV0dG9uU3R5bGVcXFwiPlxcclxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJyYWRpb1xcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICB2LXNob3c9XFxcIiFyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcImNoZWNrXFxcIlxcclxcbiAgICAgICAgOnZhbHVlPVxcXCJzZWxlY3RlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPGxhYmVsIHYtZWxzZSBjbGFzcz1cXFwib3BlblxcXCI+XFxyXFxuICAgICAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcImNoZWNrXFxcIlxcclxcbiAgICAgICAgOnZhbHVlPVxcXCJzZWxlY3RlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbYWN0aXZlPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiYWN0aXZlJiZ0eXBlQ29sb3I9PT0nZGVmYXVsdCdcXFwiIGNsYXNzPVxcXCJpY29uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2xhYmVsPlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgc2VsZWN0ZWRWYWx1ZToge2RlZmF1bHQ6IHRydWV9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBmYWxzZX1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjaGVjazogdGhpcy52YWx1ZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgYWN0aXZlICgpIHsgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZSB9LFxcclxcbiAgICBpbkdyb3VwICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuYnRuR3JvdXAgJiYgIXRoaXMuJHBhcmVudC5fY2hlY2tib3hHcm91cCB9LFxcclxcbiAgICBwYXJlbnRWYWx1ZSAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQudmFsIH0sXFxyXFxuICAgIGJ1dHRvblN0eWxlICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LmJ0bkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICB0eXBlQ29sb3IgKCkgeyByZXR1cm4gKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSkgfHwgJ2RlZmF1bHQnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjaGVjayAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdmFsKSB7XFxyXFxuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB0cnVlKVxcclxcbiAgICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHZhbCkge1xcclxcbiAgICAgICAgdGhpcy5jaGVjayA9IHZhbFxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmNoZWNrID0gZmFsc2VcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnRcXHJcXG4gICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlXFxyXFxuICAgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgdXBkYXRlRnJvbVBhcmVudCgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XFxyXFxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHRoaXMuJHBhcmVudC52YWwpIHtcXHJcXG4gICAgICAgICAgdGhpcy5jaGVjayA9IHRoaXMuc2VsZWN0ZWRWYWx1ZVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgdGhpcy5jaGVjayA9IGZhbHNlXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB1cGRhdGVQYXJlbnQoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdGhpcy5jaGVjaykge1xcclxcbiAgICAgICAgICB0aGlzLiRwYXJlbnQudmFsID0gdGhpcy5zZWxlY3RlZFZhbHVlXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBmb2N1cyAoKSB7XFxyXFxuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICB0aGlzLmZvY3VzKClcXHJcXG4gICAgICBpZiAodGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLnNlbGVjdGVkVmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGU+XFxyXFxuLnJhZGlvIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9XFxyXFxuLnJhZGlvID4gbGFiZWwgPiBpbnB1dCB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHotaW5kZXg6IC0xO1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuLnJhZGlvID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4xNXJlbTtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAxLjRyZW07XFxyXFxuICBoZWlnaHQ6IDEuNHJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjdyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXHJcXG59XFxyXFxuLnJhZGlvOm5vdCguYWN0aXZlKSA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxyXFxufVxcclxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbiB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzY2YWZlOTtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxyXFxufVxcclxcbi5yYWRpby5hY3RpdmUgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZG1WeWMybHZiajBpTVM0eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaVBqeGphWEpqYkdVZ1kzZzlJalVpSUdONVBTSTFJaUJ5UFNJMElpQm1hV3hzUFNJalptWm1JaTgrUEM5emRtYyspO1xcclxcbn1cXHJcXG4ucmFkaW8uYWN0aXZlIC5idG4tZGVmYXVsdCB7IGZpbHRlcjogYnJpZ2h0bmVzcyg3NSUpOyB9XFxyXFxuXFxyXFxuLnJhZGlvLmRpc2FibGVkID4gbGFiZWwgPiAuaWNvbixcXHJcXG4ucmFkaW8ucmVhZG9ubHkgPiBsYWJlbCA+IC5pY29uLFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxyXFxufVxcclxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9cmFkaW9dIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE1MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2VsZWN0ZWRWYWx1ZTogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcblx0ICAgIH0sXG5cdCAgICBpbkdyb3VwOiBmdW5jdGlvbiBpbkdyb3VwKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiAhdGhpcy4kcGFyZW50Ll9jaGVja2JveEdyb3VwO1xuXHQgICAgfSxcblx0ICAgIHBhcmVudFZhbHVlOiBmdW5jdGlvbiBwYXJlbnRWYWx1ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWw7XG5cdCAgICB9LFxuXHQgICAgYnV0dG9uU3R5bGU6IGZ1bmN0aW9uIGJ1dHRvblN0eWxlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICB0eXBlQ29sb3I6IGZ1bmN0aW9uIHR5cGVDb2xvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIGNoZWNrOiBmdW5jdGlvbiBjaGVjayh2YWwpIHtcblx0ICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB0cnVlKTtcblx0ICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudCgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLnVwZGF0ZUZyb21QYXJlbnQoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWUgPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy5jaGVjayA9IHZhbDtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmNoZWNrID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICBpZiAodGhpcy5pbkdyb3VwKSB7XG5cdCAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICAgIHBhcmVudC5fcmFkaW9Hcm91cCA9IHRydWU7XG5cdCAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHVwZGF0ZUZyb21QYXJlbnQ6IGZ1bmN0aW9uIHVwZGF0ZUZyb21QYXJlbnQoKSB7XG5cdCAgICAgIGlmICh0aGlzLmluR3JvdXApIHtcblx0ICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHRoaXMuJHBhcmVudC52YWwpIHtcblx0ICAgICAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLnNlbGVjdGVkVmFsdWU7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuY2hlY2sgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB1cGRhdGVQYXJlbnQ6IGZ1bmN0aW9uIHVwZGF0ZVBhcmVudCgpIHtcblx0ICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWUgPT09IHRoaXMuY2hlY2spIHtcblx0ICAgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB0aGlzLnNlbGVjdGVkVmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZm9jdXMoKTtcblx0ICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5jaGVjayA9IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uYnV0dG9uU3R5bGUgPyAnbGFiZWwnIDogJ2RpdicsIHtcblx0ICAgIHRhZzogXCJkaXZcIixcblx0ICAgIGNsYXNzOiBbKF92bS5idXR0b25TdHlsZSA/ICdidG4gYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJ3JhZGlvICcgKyBfdm0udHlwZUNvbG9yKSwge1xuXHQgICAgICBhY3RpdmU6IF92bS5hY3RpdmUsXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHlcblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFsoX3ZtLmJ1dHRvblN0eWxlKSA/IFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoIV92bS5yZWFkb25seSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiIXJlYWRvbmx5XCJcblx0ICAgIH0sIHtcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY2hlY2spLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNoZWNrXCJcblx0ICAgIH1dLFxuXHQgICAgcmVmOiBcImlucHV0XCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJyYWRpb1wiLFxuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWUsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcImRpc2FibGVkXCI6IF92bS5kaXNhYmxlZFxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLnNlbGVjdGVkVmFsdWUsXG5cdCAgICAgIFwiY2hlY2tlZFwiOiBfdm0uX3EoX3ZtLmNoZWNrLCBfdm0uc2VsZWN0ZWRWYWx1ZSlcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jaGVjayA9IF92bS5zZWxlY3RlZFZhbHVlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0gOiBfdm0uX2MoJ2xhYmVsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwib3BlblwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVjayksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInJhZGlvXCIsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uc2VsZWN0ZWRWYWx1ZSxcblx0ICAgICAgXCJjaGVja2VkXCI6IF92bS5fcShfdm0uY2hlY2ssIF92bS5zZWxlY3RlZFZhbHVlKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLmNoZWNrID0gX3ZtLnNlbGVjdGVkVmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uYWN0aXZlID8gJ2J0bi0nICsgX3ZtLnR5cGVDb2xvciA6ICcnLCB7XG5cdCAgICAgIGJnOiBfdm0udHlwZUNvbG9yID09PSAnZGVmYXVsdCdcblx0ICAgIH1dXG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uYWN0aXZlICYmIF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0JykgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uXCJcblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03NGNmZDkyY1wiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNTQpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTYpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTU3KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNlbGVjdC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdF9fdnVlX29wdGlvbnNfXy5fc2NvcGVJZCA9IFwiZGF0YS12LWU1MTRkYmM2XCJcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1lNTE0ZGJjNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtZTUxNGRiYzZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTZWxlY3QudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTU0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTUpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWU1MTRkYmM2JnNjb3BlZD10cnVlIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TZWxlY3QudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1lNTE0ZGJjNiZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU2VsZWN0LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZde1xcclxcbiAgaGVpZ2h0OiBhdXRvO1xcclxcbiAgcGFkZGluZy1yaWdodDogMjRweDtcXG59XFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGVbZGF0YS12LWU1MTRkYmM2XTphZnRlcntcXHJcXG4gIGNvbnRlbnQ6ICcgJztcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHJpZ2h0OiAxM3B4O1xcclxcbiAgdG9wOiA1MCU7XFxyXFxuICBtYXJnaW46IC0xcHggMCAwO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IGRhc2hlZDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBzb2xpZCBcXFxcOTtcXHJcXG4gIGJvcmRlci1yaWdodDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXG59XFxuLmJzLXNlYXJjaGJveFtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIG1hcmdpbjogNHB4IDhweDtcXG59XFxuLmJzLXNlYXJjaGJveCAuY2xvc2VbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5icy1zZWFyY2hib3ggaW5wdXRbZGF0YS12LWU1MTRkYmM2XTpmb2N1cyxcXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZdOmZvY3VzIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXItY29sb3I6ICM2NmFmZTkgIWltcG9ydGFudDtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxufVxcbi5zZWNyZXRbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBjbGlwOiByZWN0KDAgMCAwIDApO1xcclxcbiAgaGVpZ2h0OiAxcHg7XFxyXFxuICBtYXJnaW46IC0xcHg7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxcHg7XFxufVxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlPi5jbG9zZVtkYXRhLXYtZTUxNGRiYzZdIHsgbWFyZ2luLWxlZnQ6IDVweDtcXG59XFxuLm5vdGlmeS5vdXRbZGF0YS12LWU1MTRkYmM2XSB7IHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLm5vdGlmeS5pbltkYXRhLXYtZTUxNGRiYzZdLFxcclxcbi5ub3RpZnk+ZGl2W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDk2JTtcXHJcXG4gIG1hcmdpbjogMCAyJTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDI2cHg7XFxyXFxuICBwYWRkaW5nOiAzcHggNXB4O1xcclxcbiAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNlM2UzZTM7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcbi5ub3RpZnk+ZGl2W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgdG9wOiA1cHg7XFxyXFxuICB6LWluZGV4OiAxO1xcbn1cXG4ubm90aWZ5LmluW2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgb3BhY2l0eTogLjk7XFxyXFxuICBib3R0b206IDVweDtcXG59XFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLXRvZ2dsZT5zcGFuW2RhdGEtdi1lNTE0ZGJjNl06bm90KC5jbG9zZSkge1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDE4cHgpO1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG4gIG1hcmdpbi1ib3R0b206IC00cHg7XFxufVxcbi5idG4tZ3JvdXAtanVzdGlmaWVkIC5kcm9wZG93bi1tZW51W2RhdGEtdi1lNTE0ZGJjNl0geyB3aWR0aDogMTAwJTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9TZWxlY3QudnVlPzY4Mjk4YzEzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF1UUE7RUFDQSxhQUFBO0VBQ0Esb0JBQUE7Q0FDQTtBQUNBO0VBQ0EsYUFBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLFNBQUE7RUFDQSxpQkFBQTtFQUNBLHVCQUFBO0VBQ0EseUJBQUE7RUFDQSxvQ0FBQTtFQUNBLG1DQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTs7RUFFQSxXQUFBO0VBQ0EsaUNBQUE7RUFDQSwwRUFBQTtDQUNBO0FBQ0E7RUFDQSxVQUFBO0VBQ0Esb0JBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGlCQUFBO0VBQ0EsV0FBQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtDQUNBO0FBQ0Esd0RBQUEsaUJBQUE7Q0FBQTtBQUNBLCtCQUFBLG1CQUFBO0NBQUE7QUFDQTs7RUFFQSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxhQUFBO0VBQ0EsaUJBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0EsMEJBQUE7RUFDQSw0Q0FBQTtFQUNBLHFCQUFBO0NBQ0E7QUFDQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0Esd0JBQUE7RUFDQSxvQkFBQTtDQUNBO0FBQ0EsdURBQUEsWUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJTZWxlY3QudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgcmVmPVxcXCJzZWxlY3RcXFwiIDpjbGFzcz1cXFwiY2xhc3Nlc1xcXCIgdi1jbGljay1vdXRzaWRlPVxcXCJjbG9zZVxcXCI+XFxyXFxuICAgIDxkaXYgcmVmPVxcXCJidG5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZHJvcGRvd24tdG9nZ2xlXFxcIiB0YWJpbmRleD1cXFwiMVxcXCIgOmRpc2FibGVkPVxcXCJkaXNhYmxlZCB8fCAhaGFzUGFyZW50XFxcIiA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgIEBibHVyPVxcXCJjYW5TZWFyY2ggPyBudWxsIDogY2xvc2UoKVxcXCJcXHJcXG4gICAgICBAY2xpY2s9XFxcInRvZ2dsZSgpXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVzYy5zdG9wLnByZXZlbnQ9XFxcImNsb3NlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLnNwYWNlLnN0b3AucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVudGVyLnN0b3AucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICA+XFxyXFxuICAgICAgPHNwYW4gY2xhc3M9XFxcImJ0bi1jb250ZW50XFxcIiB2LWh0bWw9XFxcImxvYWRpbmcgPyB0ZXh0LmxvYWRpbmcgOiBzaG93UGxhY2Vob2xkZXIgfHwgKG11bHRpcGxlICYmIHNob3dDb3VudCA/IHNlbGVjdGVkVGV4dCA6IHNlbGVjdGVkKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWx1ZXMubGVuZ3RoXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwiY2xlYXIoKVxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDxzZWxlY3QgcmVmPVxcXCJzZWxcXFwiIHYtbW9kZWw9XFxcInZhbFxcXCIgOm5hbWU9XFxcIm5hbWVcXFwiIGNsYXNzPVxcXCJzZWNyZXRcXFwiIDptdWx0aXBsZT1cXFwibXVsdGlwbGVcXFwiIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1pZj1cXFwicmVxdWlyZWRcXFwiIHZhbHVlPVxcXCJcXFwiPjwvb3B0aW9uPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wdGlvbiBpbiBsaXN0XFxcIiA6dmFsdWU9XFxcIm9wdGlvbltvcHRpb25zVmFsdWVdXFxcIj57eyBvcHRpb25bb3B0aW9uc0xhYmVsXSB9fTwvb3B0aW9uPlxcclxcbiAgICA8L3NlbGVjdD5cXHJcXG4gICAgPHVsIGNsYXNzPVxcXCJkcm9wZG93bi1tZW51XFxcIj5cXHJcXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cXFwibGlzdC5sZW5ndGhcXFwiPlxcclxcbiAgICAgICAgPGxpIHYtaWY9XFxcImNhblNlYXJjaFxcXCIgY2xhc3M9XFxcImJzLXNlYXJjaGJveFxcXCI+XFxyXFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiA6cGxhY2Vob2xkZXI9XFxcInNlYXJjaFRleHR8fHRleHQuc2VhcmNoXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJzZWFyY2hcXFwiXFxyXFxuICAgICAgICAgICAgdi1tb2RlbD1cXFwic2VhcmNoVmFsdWVcXFwiXFxyXFxuICAgICAgICAgICAgQGtleXVwLmVzYz1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgICAgIC8+XFxyXFxuICAgICAgICAgIDxzcGFuIHYtc2hvdz1cXFwic2VhcmNoVmFsdWVcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJjbGVhclNlYXJjaFxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDwvbGk+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwicmVxdWlyZWQmJiFjbGVhckJ1dHRvblxcXCI+PGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJjbGVhcigpICYmIGNsb3NlKClcXFwiPnt7IHBsYWNlaG9sZGVyIHx8IHRleHQubm90U2VsZWN0ZWQgfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDxsaSB2LWZvcj1cXFwib3B0aW9uIGluIGZpbHRlcmVkT3B0aW9uc1xcXCIgOmlkPVxcXCJvcHRpb25bb3B0aW9uc1ZhbHVlXVxcXCI+XFxyXFxuICAgICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwic2VsZWN0KG9wdGlvbltvcHRpb25zVmFsdWVdKVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1odG1sPVxcXCJvcHRpb25bb3B0aW9uc0xhYmVsXVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcXFwiIHYtc2hvdz1cXFwiaXNTZWxlY3RlZChvcHRpb25bb3B0aW9uc1ZhbHVlXSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9hPlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgIWNsb3NlT25TZWxlY3RcXFwiIG5hbWU9XFxcImZhZGVpblxcXCI+PGRpdiBjbGFzcz1cXFwibm90aWZ5IGluXFxcIj57e2xpbWl0VGV4dH19PC9kaXY+PC90cmFuc2l0aW9uPlxcclxcbiAgICA8L3VsPlxcclxcbiAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgY2xvc2VPblNlbGVjdFxcXCIgbmFtZT1cXFwiZmFkZWluXFxcIj48ZGl2IGNsYXNzPVxcXCJub3RpZnkgb3V0XFxcIj48ZGl2Pnt7bGltaXRUZXh0fX08L2Rpdj48L2Rpdj48L3RyYW5zaXRpb24+XFxyXFxuICAgIDwhLS0gPHByZT5PcHRpb25zOiB7e2xpc3R9fTwvcHJlPiAtLT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge3RyYW5zbGF0aW9uc30gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgQ2xpY2tPdXRzaWRlIGZyb20gJy4vZGlyZWN0aXZlcy9DbGlja091dHNpZGUuanMnXFxyXFxuXFxyXFxudmFyIHRpbWVvdXQgPSB7fVxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIGRpcmVjdGl2ZXM6IHtcXHJcXG4gICAgQ2xpY2tPdXRzaWRlXFxyXFxuICB9LFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNsb3NlT25TZWxlY3Q6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBsaW1pdDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNH0sXFxyXFxuICAgIG1pblNlYXJjaDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG11bHRpcGxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgb3B0aW9uczoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICBvcHRpb25zTGFiZWw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCd9LFxcclxcbiAgICBvcHRpb25zVmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZSd9LFxcclxcbiAgICBwYXJlbnQ6IHtkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgcGxhY2Vob2xkZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzZWFyY2g6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHNlYXJjaFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBjb3VudFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzaG93Q291bnQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHVybDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiBudWxsXFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgbGlzdDogW10sXFxyXFxuICAgICAgbG9hZGluZzogbnVsbCxcXHJcXG4gICAgICBzZWFyY2hWYWx1ZTogbnVsbCxcXHJcXG4gICAgICBzaG93OiBmYWxzZSxcXHJcXG4gICAgICBub3RpZnk6IGZhbHNlLFxcclxcbiAgICAgIHZhbDogbnVsbCxcXHJcXG4gICAgICB2YWxpZDogbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgY2FuU2VhcmNoICgpIHsgcmV0dXJuIHRoaXMubWluU2VhcmNoID8gdGhpcy5saXN0Lmxlbmd0aCA+PSB0aGlzLm1pblNlYXJjaCA6IHRoaXMuc2VhcmNoIH0sXFxyXFxuICAgIGNsYXNzZXMgKCkgeyByZXR1cm4gW3tvcGVuOiB0aGlzLnNob3csIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkfSwgdGhpcy5jbGFzcywgdGhpcy5pc0xpID8gJ2Ryb3Bkb3duJyA6IHRoaXMuaW5JbnB1dCA/ICdpbnB1dC1ncm91cC1idG4nIDogJ2J0bi1ncm91cCddIH0sXFxyXFxuICAgIGZpbHRlcmVkT3B0aW9ucyAoKSB7XFxyXFxuICAgICAgdmFyIHNlYXJjaCA9ICh0aGlzLnNlYXJjaFZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgcmV0dXJuICFzZWFyY2ggPyB0aGlzLmxpc3QgOiB0aGlzLmxpc3QuZmlsdGVyKGVsID0+IHtcXHJcXG4gICAgICAgIHJldHVybiB+ZWxbdGhpcy5vcHRpb25zTGFiZWxdLnRvTG93ZXJDYXNlKCkuc2VhcmNoKHNlYXJjaClcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LFxcclxcbiAgICBoYXNQYXJlbnQgKCkgeyByZXR1cm4gdGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBBcnJheSA/IHRoaXMucGFyZW50Lmxlbmd0aCA6IHRoaXMucGFyZW50IH0sXFxyXFxuICAgIGluSW5wdXQgKCkgeyByZXR1cm4gdGhpcy4kcGFyZW50Ll9pbnB1dCB9LFxcclxcbiAgICBpc0xpICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0IH0sXFxyXFxuICAgIGxpbWl0VGV4dCAoKSB7IHJldHVybiB0aGlzLnRleHQubGltaXQucmVwbGFjZSgne3tsaW1pdH19JywgdGhpcy5saW1pdCkgfSxcXHJcXG4gICAgc2VsZWN0ZWQgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmxpc3QubGVuZ3RoID09PSAwKSB7IHJldHVybiAnJyB9XFxyXFxuICAgICAgdmFyIHNlbCA9IHRoaXMudmFsdWVzLm1hcCh2YWwgPT4gKHRoaXMubGlzdC5maW5kKG8gPT4gb1t0aGlzLm9wdGlvbnNWYWx1ZV0gPT09IHZhbCkgfHwge30pW3RoaXMub3B0aW9uc0xhYmVsXSkuZmlsdGVyKHZhbCA9PiB2YWwgIT09IHVuZGVmaW5lZClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdzZWxlY3RlZCcsIHNlbClcXHJcXG4gICAgICByZXR1cm4gc2VsLmpvaW4oJywgJylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ZWRUZXh0ICgpIHsgcmV0dXJuIHRoaXMuY291bnRUZXh0IHx8IHRoaXMudGV4dC5zZWxlY3RlZC5yZXBsYWNlKCd7e2NvdW50fX0nLCB0aGlzLnZhbHVlcy5sZW5ndGgpIH0sXFxyXFxuICAgIHNob3dQbGFjZWhvbGRlciAoKSB7IHJldHVybiAodGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCkgPyAodGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQpIDogbnVsbCB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHZhbHVlcyAoKSB7IHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF0gfSxcXHJcXG4gICAgdmFsT3B0aW9ucyAoKSB7IHJldHVybiB0aGlzLmxpc3QubWFwKGVsID0+IGVsW3RoaXMub3B0aW9uc1ZhbHVlXSkgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIG9wdGlvbnMgKG9wdGlvbnMpIHtcXHJcXG4gICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLnNldE9wdGlvbnMob3B0aW9ucylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAodmFsKSB7XFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAoKSB7XFxyXFxuICAgICAgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdGhpcy52YWwgPSB2YWwgPSBudWxsIH1cXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgdmFsLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcXHJcXG4gICAgICAgIHRoaXMudmFsID0gdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWVcXHJcXG4gICAgICAgIGlmICh0aW1lb3V0LmxpbWl0KSBjbGVhclRpbWVvdXQodGltZW91dC5saW1pdClcXHJcXG4gICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGltZW91dC5saW1pdCA9IGZhbHNlXFxyXFxuICAgICAgICAgIHRoaXMubm90aWZ5ID0gZmFsc2VcXHJcXG4gICAgICAgIH0sIDE1MDApXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIGNoZWNrRGF0YSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcXHJcXG4gICAgICAgIGlmICh0aGlzLmxpbWl0IDwgMSkgeyB0aGlzLmxpbWl0ID0gMSB9XFxyXFxuICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xcclxcbiAgICAgICAgICB0aGlzLnZhbCA9ICh0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkKSA/IFtdIDogW3RoaXMudmFsXVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9uc1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbC5maWx0ZXIoZWwgPT4gfnZhbHVlcy5pbmRleE9mKGVsKSlcXHJcXG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgaWYgKCF+dGhpcy52YWxPcHRpb25zLmluZGV4T2YodGhpcy52YWwpKSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBjbGVhciAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDogbnVsbFxcclxcbiAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgY2xlYXJTZWFyY2ggKCkge1xcclxcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgaXNTZWxlY3RlZCAodikge1xcclxcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTFcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ICh2KSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKVxcclxcbiAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xcclxcbiAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgbmV3VmFsLnB1c2godilcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMudmFsID0gbmV3VmFsXFxyXFxuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2XFxyXFxuICAgICAgICB0aGlzLnRvZ2dsZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzZXRPcHRpb25zIChvcHRpb25zKSB7XFxyXFxuICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZWwgPT4ge1xcclxcbiAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7IHJldHVybiBlbCB9XFxyXFxuICAgICAgICBsZXQgb2JqID0ge31cXHJcXG4gICAgICAgIG9ialt0aGlzLm9wdGlvbnNMYWJlbF0gPSBlbFxcclxcbiAgICAgICAgb2JqW3RoaXMub3B0aW9uc1ZhbHVlXSA9IGVsXFxyXFxuICAgICAgICByZXR1cm4gb2JqXFxyXFxuICAgICAgfSlcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdvcHRpb25zJywgdGhpcy5saXN0KVxcclxcbiAgICB9LFxcclxcbiAgICB0b2dnbGUgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkICYmICF0aGlzLnNob3cpIHJldHVybjtcXHJcXG4gICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93XFxyXFxuICAgICAgaWYgKCF0aGlzLnNob3cpIHRoaXMuJHJlZnMuYnRuLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdXJsQ2hhbmdlZCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihyZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXVxcclxcbiAgICAgICAgdHJ5IHsgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSkgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyhkYXRhKVxcclxcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gICAgICB9LCByZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIH0pXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbGlkYXRlICgpIHtcXHJcXG4gICAgICByZXR1cm4gIXRoaXMucmVxdWlyZWQgPyB0cnVlIDogdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IHRoaXMudmFsLmxlbmd0aCA+IDAgOiB0aGlzLnZhbCAhPT0gbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpXFxyXFxuICAgIHRoaXMudmFsID0gdGhpcy52YWx1ZVxcclxcbiAgICB0aGlzLl9zZWxlY3QgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLnZhbCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLnBhcmVudCkgeyB0aGlzLnZhbCA9IG51bGwgfVxcclxcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWxbMF1cXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLmNoZWNrRGF0YSgpXFxyXFxuICAgIGlmICh0aGlzLnVybCkgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgbGV0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHsgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQgfVxcclxcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcylcXHJcXG4gICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucylcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gIH0sXFxyXFxuICBiZWZvcmVEZXN0cm95ICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkge1xcclxcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xle1xcclxcbiAgaGVpZ2h0OiBhdXRvO1xcclxcbiAgcGFkZGluZy1yaWdodDogMjRweDtcXHJcXG59XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU6YWZ0ZXJ7XFxyXFxuICBjb250ZW50OiAnICc7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICByaWdodDogMTNweDtcXHJcXG4gIHRvcDogNTAlO1xcclxcbiAgbWFyZ2luOiAtMXB4IDAgMDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBkYXNoZWQ7XFxyXFxuICBib3JkZXItdG9wOiA0cHggc29saWQgXFxcXDk7XFxyXFxuICBib3JkZXItcmlnaHQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG4gIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3gge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgbWFyZ2luOiA0cHggOHB4O1xcclxcbn1cXHJcXG4uYnMtc2VhcmNoYm94IC5jbG9zZSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3ggaW5wdXQ6Zm9jdXMsXFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlci1jb2xvcjogIzY2YWZlOSAhaW1wb3J0YW50O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXHJcXG59XFxyXFxuLnNlY3JldCB7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBjbGlwOiByZWN0KDAgMCAwIDApO1xcclxcbiAgaGVpZ2h0OiAxcHg7XFxyXFxuICBtYXJnaW46IC0xcHg7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxcHg7XFxyXFxufVxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlPi5jbG9zZSB7IG1hcmdpbi1sZWZ0OiA1cHg7fVxcclxcbi5ub3RpZnkub3V0IHsgcG9zaXRpb246IHJlbGF0aXZlOyB9XFxyXFxuLm5vdGlmeS5pbixcXHJcXG4ubm90aWZ5PmRpdiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB3aWR0aDogOTYlO1xcclxcbiAgbWFyZ2luOiAwIDIlO1xcclxcbiAgbWluLWhlaWdodDogMjZweDtcXHJcXG4gIHBhZGRpbmc6IDNweCA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2UzZTNlMztcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuLm5vdGlmeT5kaXYge1xcclxcbiAgdG9wOiA1cHg7XFxyXFxuICB6LWluZGV4OiAxO1xcclxcbn1cXHJcXG4ubm90aWZ5LmluIHtcXHJcXG4gIG9wYWNpdHk6IC45O1xcclxcbiAgYm90dG9tOiA1cHg7XFxyXFxufVxcclxcbi5idG4tZ3JvdXAtanVzdGlmaWVkIC5kcm9wZG93bi10b2dnbGU+c3Bhbjpub3QoLmNsb3NlKSB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gMThweCk7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogLTRweDtcXHJcXG59XFxyXFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLW1lbnUgeyB3aWR0aDogMTAwJTsgfVxcclxcbjwvc3R5bGU+XFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdHZhciB0aW1lb3V0ID0ge307XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBDbGlja091dHNpZGU6IF9DbGlja091dHNpZGUyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgY2xvc2VPblNlbGVjdDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNCB9LFxuXHQgICAgbWluU2VhcmNoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuXHQgICAgbXVsdGlwbGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcblx0ICAgICAgICByZXR1cm4gW107XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBvcHRpb25zTGFiZWw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbGFiZWwnIH0sXG5cdCAgICBvcHRpb25zVmFsdWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndmFsdWUnIH0sXG5cdCAgICBwYXJlbnQ6IHsgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZXF1aXJlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBzZWFyY2g6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHNlYXJjaFRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjb3VudFRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBzaG93Q291bnQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHVybDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgbGlzdDogW10sXG5cdCAgICAgIGxvYWRpbmc6IG51bGwsXG5cdCAgICAgIHNlYXJjaFZhbHVlOiBudWxsLFxuXHQgICAgICBzaG93OiBmYWxzZSxcblx0ICAgICAgbm90aWZ5OiBmYWxzZSxcblx0ICAgICAgdmFsOiBudWxsLFxuXHQgICAgICB2YWxpZDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgY2FuU2VhcmNoOiBmdW5jdGlvbiBjYW5TZWFyY2goKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaDtcblx0ICAgIH0sXG5cdCAgICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gW3sgb3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCB0aGlzLmNsYXNzLCB0aGlzLmlzTGkgPyAnZHJvcGRvd24nIDogdGhpcy5pbklucHV0ID8gJ2lucHV0LWdyb3VwLWJ0bicgOiAnYnRuLWdyb3VwJ107XG5cdCAgICB9LFxuXHQgICAgZmlsdGVyZWRPcHRpb25zOiBmdW5jdGlvbiBmaWx0ZXJlZE9wdGlvbnMoKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgc2VhcmNoID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cdCAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gfmVsW190aGlzLm9wdGlvbnNMYWJlbF0udG9Mb3dlckNhc2UoKS5zZWFyY2goc2VhcmNoKTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgaGFzUGFyZW50OiBmdW5jdGlvbiBoYXNQYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5wYXJlbnQubGVuZ3RoIDogdGhpcy5wYXJlbnQ7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0O1xuXHQgICAgfSxcblx0ICAgIGxpbWl0VGV4dDogZnVuY3Rpb24gbGltaXRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkOiBmdW5jdGlvbiBzZWxlY3RlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgc2VsID0gdGhpcy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICByZXR1cm4gKF90aGlzMi5saXN0LmZpbmQoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICAgIHJldHVybiBvW190aGlzMi5vcHRpb25zVmFsdWVdID09PSB2YWw7XG5cdCAgICAgICAgfSkgfHwge30pW190aGlzMi5vcHRpb25zTGFiZWxdO1xuXHQgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdGVkJywgc2VsKTtcblx0ICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkVGV4dDogZnVuY3Rpb24gc2VsZWN0ZWRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5jb3VudFRleHQgfHwgdGhpcy50ZXh0LnNlbGVjdGVkLnJlcGxhY2UoJ3t7Y291bnR9fScsIHRoaXMudmFsdWVzLmxlbmd0aCk7XG5cdCAgICB9LFxuXHQgICAgc2hvd1BsYWNlaG9sZGVyOiBmdW5jdGlvbiBzaG93UGxhY2Vob2xkZXIoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggPT09IDAgfHwgIXRoaXMuaGFzUGFyZW50ID8gdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQgOiBudWxsO1xuXHQgICAgfSxcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnZhbCA6IH5bbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKHRoaXMudmFsKSA/IFtdIDogW3RoaXMudmFsXTtcblx0ICAgIH0sXG5cdCAgICB2YWxPcHRpb25zOiBmdW5jdGlvbiB2YWxPcHRpb25zKCkge1xuXHQgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICAgIHJldHVybiB0aGlzLmxpc3QubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbFtfdGhpczMub3B0aW9uc1ZhbHVlXTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgb3B0aW9uczogZnVuY3Rpb24gb3B0aW9ucyhfb3B0aW9ucykge1xuXHQgICAgICBpZiAoX29wdGlvbnMgaW5zdGFuY2VvZiBBcnJheSkgdGhpcy5zZXRPcHRpb25zKF9vcHRpb25zKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCkge1xuXHQgICAgICBpZiAodmFsKSB7XG5cdCAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKTtcblx0ICAgICAgICAvLyBvbkJsdXIodGhpcy4kcmVmcy5zZWxlY3QsIGUgPT4geyB0aGlzLnNob3cgPSBmYWxzZSB9KVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcblx0ICAgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdXJsOiBmdW5jdGlvbiB1cmwoKSB7XG5cdCAgICAgIHRoaXMudXJsQ2hhbmdlZCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbGlkOiBmdW5jdGlvbiB2YWxpZCh2YWwsIG9sZCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IHZhbDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblx0XG5cdCAgICAgIGlmIChfdmFsID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IF92YWwgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChfdmFsICE9PSBvbGQpIHtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBfdmFsKTtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIF92YWwpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChfdmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgX3ZhbC5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSBfdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICAgIHRoaXMubm90aWZ5ID0gdHJ1ZTtcblx0ICAgICAgICBpZiAodGltZW91dC5saW1pdCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQubGltaXQpO1xuXHQgICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHRpbWVvdXQubGltaXQgPSBmYWxzZTtcblx0ICAgICAgICAgIF90aGlzNC5ub3RpZnkgPSBmYWxzZTtcblx0ICAgICAgICB9LCAxNTAwKTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBjaGVja0RhdGE6IGZ1bmN0aW9uIGNoZWNrRGF0YSgpIHtcblx0ICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcblx0ICAgICAgICBpZiAodGhpcy5saW1pdCA8IDEpIHtcblx0ICAgICAgICAgIHRoaXMubGltaXQgPSAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHQgICAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkID8gW10gOiBbdGhpcy52YWxdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy52YWxPcHRpb25zO1xuXHQgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgcmV0dXJuIH52YWx1ZXMuaW5kZXhPZihlbCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgaWYgKHRoaXMudmFsdWVzLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGlmICghfnRoaXMudmFsT3B0aW9ucy5pbmRleE9mKHRoaXMudmFsKSkge1xuXHQgICAgICAgICAgdGhpcy52YWwgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcblx0ICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyBbXSA6IG51bGw7XG5cdCAgICAgIHRoaXMudG9nZ2xlKCk7XG5cdCAgICB9LFxuXHQgICAgY2xlYXJTZWFyY2g6IGZ1bmN0aW9uIGNsZWFyU2VhcmNoKCkge1xuXHQgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG5cdCAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgaXNTZWxlY3RlZDogZnVuY3Rpb24gaXNTZWxlY3RlZCh2KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTE7XG5cdCAgICB9LFxuXHQgICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3Qodikge1xuXHQgICAgICBpZiAodGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKTtcblx0ICAgICAgICBpZiAofm5ld1ZhbC5pbmRleE9mKHYpKSB7XG5cdCAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgbmV3VmFsLnB1c2godik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMudmFsID0gbmV3VmFsO1xuXHQgICAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QpIHtcblx0ICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMudmFsID0gdjtcblx0ICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG5cdCAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7XG5cdCAgICAgICAgICByZXR1cm4gZWw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBvYmogPSB7fTtcblx0ICAgICAgICBvYmpbX3RoaXM1Lm9wdGlvbnNMYWJlbF0gPSBlbDtcblx0ICAgICAgICBvYmpbX3RoaXM1Lm9wdGlvbnNWYWx1ZV0gPSBlbDtcblx0ICAgICAgICByZXR1cm4gb2JqO1xuXHQgICAgICB9KTtcblx0ICAgICAgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHRoaXMubGlzdCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkICYmICF0aGlzLnNob3cpIHJldHVybjtcblx0ICAgICAgdGhpcy5zaG93ID0gIXRoaXMuc2hvdztcblx0ICAgICAgaWYgKCF0aGlzLnNob3cpIHRoaXMuJHJlZnMuYnRuLmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdXJsQ2hhbmdlZDogZnVuY3Rpb24gdXJsQ2hhbmdlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMudXJsIHx8ICF0aGlzLiRodHRwKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuJGh0dHAuZ2V0KHRoaXMudXJsKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHQgICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5ID8gcmVzcG9uc2UuZGF0YSA6IFtdO1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblx0ICAgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgICAgIF90aGlzNi5zZXRPcHRpb25zKGRhdGEpO1xuXHQgICAgICAgIF90aGlzNi5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgICAgX3RoaXM2LmNoZWNrRGF0YSgpO1xuXHQgICAgICB9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICBfdGhpczYubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgICB9KTtcblx0ICAgIH0sXG5cdCAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCA/IHRydWUgOiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwubGVuZ3RoID4gMCA6IHRoaXMudmFsICE9PSBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5fc2VsZWN0ID0gdHJ1ZTtcblx0ICAgIGlmICh0aGlzLnZhbCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLnBhcmVudCkge1xuXHQgICAgICB0aGlzLnZhbCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsWzBdO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jaGVja0RhdGEoKTtcblx0ICAgIGlmICh0aGlzLnVybCkgdGhpcy51cmxDaGFuZ2VkKCk7XG5cdCAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5jaGVja0RhdGEoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJjbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1jbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNsb3NlKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjbG9zZVwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJzZWxlY3RcIixcblx0ICAgIGNsYXNzOiBfdm0uY2xhc3Nlc1xuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJidG5cIixcblx0ICAgIHN0YXRpY0NsYXNzOiBcImZvcm0tY29udHJvbCBkcm9wZG93bi10b2dnbGVcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFiaW5kZXhcIjogXCIxXCIsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkIHx8ICFfdm0uaGFzUGFyZW50LFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uY2FuU2VhcmNoID8gbnVsbCA6IF92bS5jbG9zZSgpXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgpXG5cdCAgICAgIH0sXG5cdCAgICAgIFwia2V5ZG93blwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uY2xvc2UoJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInNwYWNlXCIsIDMyKSkgeyByZXR1cm47IH1cblx0ICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfV1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYnRuLWNvbnRlbnRcIixcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhfdm0ubG9hZGluZyA/IF92bS50ZXh0LmxvYWRpbmcgOiBfdm0uc2hvd1BsYWNlaG9sZGVyIHx8IChfdm0ubXVsdGlwbGUgJiYgX3ZtLnNob3dDb3VudCA/IF92bS5zZWxlY3RlZFRleHQgOiBfdm0uc2VsZWN0ZWQpKVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWx1ZXMubGVuZ3RoKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jbGVhcigpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc2VsZWN0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VsXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJzZWNyZXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJtdWx0aXBsZVwiOiBfdm0ubXVsdGlwbGUsXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNoYW5nZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucywgZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgcmV0dXJuIG8uc2VsZWN0ZWRcblx0ICAgICAgICB9KS5tYXAoZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgdmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTtcblx0ICAgICAgICAgIHJldHVybiB2YWxcblx0ICAgICAgICB9KVswXVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ucmVxdWlyZWQpID8gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInZhbHVlXCI6IFwiXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2woKF92bS5saXN0KSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJ2YWx1ZVwiOiBvcHRpb25bX3ZtLm9wdGlvbnNWYWx1ZV1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3Mob3B0aW9uW192bS5vcHRpb25zTGFiZWxdKSldKVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbKF92bS5saXN0Lmxlbmd0aCkgPyBbKF92bS5jYW5TZWFyY2gpID8gX3ZtLl9jKCdsaScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLXNlYXJjaGJveFwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VhcmNoXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0uc2VhcmNoVGV4dCB8fCBfdm0udGV4dC5zZWFyY2gsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0uc2VhcmNoVmFsdWUpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmNsb3NlKCRldmVudClcblx0ICAgICAgfSxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNlYXJjaFZhbHVlID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xlYXJTZWFyY2hcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0ucmVxdWlyZWQgJiYgIV92bS5jbGVhckJ1dHRvbikgPyBfdm0uX2MoJ2xpJywgW192bS5fYygnYScsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbGVhcigpICYmIF92bS5jbG9zZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ucGxhY2Vob2xkZXIgfHwgX3ZtLnRleHQubm90U2VsZWN0ZWQpKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9sKChfdm0uZmlsdGVyZWRPcHRpb25zKSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcImlkXCI6IG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uc2VsZWN0KG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKG9wdGlvbltfdm0ub3B0aW9uc0xhYmVsXSlcblx0ICAgICAgfVxuXHQgICAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICAgIHZhbHVlOiAoX3ZtLmlzU2VsZWN0ZWQob3B0aW9uW192bS5vcHRpb25zVmFsdWVdKSksXG5cdCAgICAgICAgZXhwcmVzc2lvbjogXCJpc1NlbGVjdGVkKG9wdGlvbltvcHRpb25zVmFsdWVdKVwiXG5cdCAgICAgIH1dLFxuXHQgICAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcIlxuXHQgICAgfSldKV0pXG5cdCAgfSldIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmICFfdm0uY2xvc2VPblNlbGVjdCkgPyBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogXCJmYWRlaW5cIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5vdGlmeSBpblwiXG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKSA6IF92bS5fZSgpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmIF92bS5jbG9zZU9uU2VsZWN0KSA/IF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVpblwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibm90aWZ5IG91dFwiXG5cdCAgfSwgW192bS5fYygnZGl2JywgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKV0pIDogX3ZtLl9lKCldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1lNTE0ZGJjNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNsaWRlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIxODViODJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMTg1YjgyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gU2xpZGVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC4kY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LmluZGV4ID09PSB0aGlzLmluZGV4O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuaW5kaWNhdG9yX2xpc3QpIHtcblx0ICAgICAgdGhpcy4kcGFyZW50LmluZGljYXRvcl9saXN0LnB1c2godGhpcy5pbmRleCk7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKHRoaXMuaW5kZXggPT09IDApIHtcblx0ICAgICAgdGhpcy4kZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIml0ZW1cIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIxODViODJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTYyKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTY0KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxTcGlubmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi04YjI5OGU3MFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtOGIyOThlNzBcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTcGlubmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYzKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi04YjI5OGU3MCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU3Bpbm5lci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LThiMjk4ZTcwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TcGlubmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE2MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5Aa2V5ZnJhbWVzIHNwaW4ge1xcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbn1cXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXG59XFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvU3Bpbm5lci52dWU/NjVmYzVhOGZcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJGQTtBQUNBO0lBQ0EsMEJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLGlDQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLDRCQUFBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLDRCQUFBO0VBQ0Esb0NBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsNklBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGFBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtDQUNBXCIsXCJmaWxlXCI6XCJTcGlubmVyLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLHNwaW5uZXJTaXplLHsnc3Bpbm5lci1maXhlZCc6Zml4ZWR9XVxcXCIgdi1zaG93PVxcXCJhY3RpdmV8fGxvY2tlZFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItd3JhcHBlclxcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3Bpbm5lci1jaXJjbGVcXFwiPjwvZGl2PlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItdGV4dFxcXCI+e3t0ZXh0fX08L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuY29uc3QgTUlOX1dBSVQgPSA1MDAgLy8gaW4gbXNcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBmaXhlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZ2xvYmFsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBzaXplOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbWQnfSxcXHJcXG4gICAgdGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcXHJcXG4gICAgICBsb2NrZWQ6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBzcGlubmVyU2l6ZSAoKSB7IHJldHVybiAnc3Bpbm5lci0nICsgKHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZSA6ICdzbScpIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBhY3RpdmUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7IHRoaXNbdmFsID8gJ3Nob3cnIDogJ2hpZGUnXSgpIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaGlkZSAoKSB7XFxyXFxuICAgICAgdmFyIGRlbGF5ID0gMFxcclxcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAob3B0aW9ucykge1xcclxcbiAgICAgIGlmIChvcHRpb25zKSB7XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy50ZXh0KSB7IHRoaXMudGV4dCA9IG9wdGlvbnMudGV4dCB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7IHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZSB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5maXhlZCkgeyB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZCB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIC8vIGJsb2NrIHNjcm9sbGluZyB3aGVuIHNwaW5uZXIgaXMgb25cXHJcXG4gICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nXFxyXFxuICAgICAgLy8gYWN0aXZhdGUgc3Bpbm5lclxcclxcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpXFxyXFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5fdW5sb2NrKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9ib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WVxcclxcbiAgICB0aGlzLl91bmxvY2sgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gICAgfSwgTUlOX1dBSVQpXFxyXFxuICAgIGlmICh0aGlzLmdsb2JhbCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lcikge1xcclxcbiAgICAgICAgdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lciA9IHRydWVcXHJcXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xcclxcbiAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xcclxcbiAgICAgICAgICBoaWRlICgpIHsgc2VsZi5oaWRlKCkgfSxcXHJcXG4gICAgICAgICAgc2hvdyAoKSB7IHNlbGYuc2hvdygpIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuJHJvb3QuJG9uKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fZ2xvYmFsKSB7XFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpoaWRlJywgdGhpcy5fZ2xvYmFsLmhpZGUpXFxyXFxuICAgICAgZGVsZXRlIHRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXJcXHJcXG4gICAgfVxcclxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc3Bpbm5lckFuaW1hdGlvbilcXHJcXG4gICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbkBrZXlmcmFtZXMgc3BpbiB7XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXHJcXG59XFxyXFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIE1JTl9XQUlUID0gNTAwOyAvLyBpbiBtc1xuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZml4ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGdsb2JhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdtZCcgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcblx0ICAgICAgbG9ja2VkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgc3Bpbm5lclNpemU6IGZ1bmN0aW9uIHNwaW5uZXJTaXplKCkge1xuXHQgICAgICByZXR1cm4gJ3NwaW5uZXItJyArICh0aGlzLnNpemUgPyB0aGlzLnNpemUgOiAnc20nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpc1t2YWwgPyAnc2hvdycgOiAnaGlkZSddKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG5cdCAgICAgIHZhciBkZWxheSA9IDA7XG5cdCAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyhvcHRpb25zKSB7XG5cdCAgICAgIGlmIChvcHRpb25zKSB7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGV4dCkge1xuXHQgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG5cdCAgICAgICAgICB0aGlzLnNpemUgPSBvcHRpb25zLnNpemU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChvcHRpb25zLmZpeGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgLy8gYmxvY2sgc2Nyb2xsaW5nIHdoZW4gc3Bpbm5lciBpcyBvblxuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuXHQgICAgICAvLyBhY3RpdmF0ZSBzcGlubmVyXG5cdCAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdCAgICAgIHRoaXMubG9ja2VkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fdW5sb2NrKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WTtcblx0ICAgIHRoaXMuX3VubG9jayA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9IHRoaXMuX2JvZHlPdmVyZmxvdztcblx0ICAgIH0sIE1JTl9XQUlUKTtcblx0ICAgIGlmICh0aGlzLmdsb2JhbCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXIpIHtcblx0ICAgICAgICB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xuXHQgICAgICAgICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcblx0ICAgICAgICAgICAgc2VsZi5oaWRlKCk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgICAgICAgc2VsZi5zaG93KCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6c2hvdycsIHRoaXMuX2dsb2JhbC5zaG93KTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9nbG9iYWwpIHtcblx0ICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpO1xuXHQgICAgICB0aGlzLiRyb290LiRvZmYoJ3NwaW5uZXI6OmhpZGUnLCB0aGlzLl9nbG9iYWwuaGlkZSk7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyO1xuXHQgICAgfVxuXHQgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NwaW5uZXJBbmltYXRpb24pO1xuXHQgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3c7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5hY3RpdmUgfHwgX3ZtLmxvY2tlZCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiYWN0aXZlfHxsb2NrZWRcIlxuXHQgICAgfV0sXG5cdCAgICBjbGFzczogWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLCBfdm0uc3Bpbm5lclNpemUsIHtcblx0ICAgICAgJ3NwaW5uZXItZml4ZWQnOiBfdm0uZml4ZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci13cmFwcGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzcGlubmVyLWNpcmNsZVwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci10ZXh0XCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LThiMjk4ZTcwXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFiLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0wOTg1ZTg3OFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMDk4NWU4NzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBUYWIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGZhZGVpbjogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIGFjdGl2ZSA9ICF0aGlzLl90YWJzIHx8IHRoaXMuX3RhYnMuc2hvdyA9PT0gdGhpcztcblx0ICAgICAgdGhpcy5mYWRlaW4gPSBmYWxzZTtcblx0ICAgICAgaWYgKGFjdGl2ZSkge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMuZmFkZWluID0gdHJ1ZTtcblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYWN0aXZlO1xuXHQgICAgfSxcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3RhYnMudGFicy5pbmRleE9mKHRoaXMpO1xuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl90YWJzID8gdGhpcy5fdGFicy5lZmZlY3QgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiID0gdHJ1ZTtcblx0ICAgIHZhciB0YWJzID0gdGhpcztcblx0ICAgIHdoaWxlICghdGhpcy5fdGFicyAmJiB0YWJzLiRwYXJlbnQpIHtcblx0ICAgICAgaWYgKHRhYnMuX2lzVGFiR3JvdXApIHtcblx0ICAgICAgICB0YWJzLnRhYnMucHVzaCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl90YWJHcm91cCA9IHRhYnM7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRhYnMuX2lzVGFicykge1xuXHQgICAgICAgIHRhYnMudGFicy5wdXNoKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3RhYnMgPSB0YWJzO1xuXHQgICAgICAgIGlmICghdGhpcy5fdGFiR3JvdXApIHRhYnMuaGVhZGVycy5wdXNoKHRoaXMpO1xuXHQgICAgICB9XG5cdCAgICAgIHRhYnMgPSB0YWJzLiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuX3RhYnMpIHRocm93IEVycm9yKCd0YWIgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgaWYgKHRoaXMuX3RhYkdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX3RhYkdyb3VwLnRhYnMgPSB0aGlzLl90YWJHcm91cC50YWJzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwgIT09IF90aGlzMjtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB0aGlzLl90YWJzLnRhYnMgPSB0aGlzLl90YWJzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbCAhPT0gX3RoaXMyO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl90YWJzKSB7XG5cdCAgICAgIGlmICh0aGlzLl90YWJzLmFjdGl2ZSA9PT0gdGhpcy5pbmRleCkge1xuXHQgICAgICAgIHRoaXMuX3RhYnMuaW5kZXggPSAwO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbmdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy4kcGFyZW50LnRhYnMuaW5kZXhPZih0aGlzKTtcblx0ICAgICAgICBpZiAofmlkKSB0aGlzLiRwYXJlbnQudGFicy5zcGxpY2UoaWQsIDEpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB2YXIgX2lkID0gdGhpcy5fdGFicy50YWJzLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIGlmICh+X2lkKSB0aGlzLl90YWJzLnRhYnMuc3BsaWNlKF9pZCwgMSk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwYW5lbFwiLFxuXHQgICAgY2xhc3M6IFsndGFiLXBhbmUnLCB7XG5cdCAgICAgICdhY3RpdmUgZmFkZSc6IF92bS5hY3RpdmUsXG5cdCAgICAgICdpbic6IF92bS5mYWRlaW5cblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwidGFicGFuZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMDk4NWU4NzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTcwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTcyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Mylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUYWJHcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNTVmYWYzY2JcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTU1ZmFmM2NiXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFiR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnRhYi1jb250ZW50IC50YWItcGFuZSB7IGRpc3BsYXk6IG5vbmU7XFxufVxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVGFiR3JvdXAudnVlPzIyYWUxYzA4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrQ0EseUJBQUEsY0FBQTtDQUFBO0FBQ0EsZ0NBQUEsZUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJUYWJHcm91cC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPjxzcGFuPjxzbG90Pjwvc2xvdD48L3NwYW4+PC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgdGFiczogW11cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGFjdGl2ZSAoKSB7IHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KSB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBibHVyICgpIHsgdGhpcy5zaG93ID0gZmFsc2UgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHsgdGhpcy5zaG93ID0gIXRoaXMuc2hvdyB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLiRwYXJlbnQpIHtcXHJcXG4gICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFxcXCd0IG5lc3QgdGFiLWdyb3Vwcy4nKVxcclxcbiAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJylcXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHRoaXMuX3RhYnMuaGVhZGVycy5wdXNoKHRoaXMpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4udGFiLWNvbnRlbnQgLnRhYi1wYW5lIHsgZGlzcGxheTogbm9uZTsgfVxcclxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7IH1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTcyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHNob3c6IGZhbHNlLFxuXHQgICAgICB0YWJzOiBbXVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUoKSB7XG5cdCAgICAgIHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuJHBhcmVudCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFwndCBuZXN0IHRhYi1ncm91cHMuJyk7XG5cdCAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50O1xuXHQgICAgdGhpcy5fdGFicy5oZWFkZXJzLnB1c2godGhpcyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTU1ZmFmM2NiXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFicy52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzAxMDBkZGZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTcwMTAwZGRmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFicy52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzAxMDBkZGYhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1RhYnMudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi03MDEwMGRkZiEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vVGFicy52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1RhYnMudnVlPzQzMTdiOWFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUEwRUE7RUFDQSxlQUFBO0NBQ0FcIixcImZpbGVcIjpcIlRhYnMudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgdGFicz5cXHJcXG4gICAgPHVsIDpjbGFzcz1cXFwibmF2U3R5bGVDbGFzc1xcXCIgcm9sZT1cXFwidGFibGlzdFxcXCI+XFxyXFxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCJoZWFkZXIgaW4gaGVhZGVyc1xcXCI+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwiaGVhZGVyLl9pc1RhYlxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmhlYWRlci5hY3RpdmUsIGRpc2FibGVkOmhlYWRlci5kaXNhYmxlZH1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QoaGVhZGVyKVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGEgaHJlZj1cXFwiI1xcXCIgdi1odG1sPVxcXCJoZWFkZXIuaGVhZGVyXFxcIj48L2E+PC9zbG90PlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICAgIDxkcm9wZG93biB2LWlmPVxcXCJoZWFkZXIuX2lzVGFiR3JvdXBcXFwiIDp0ZXh0PVxcXCJoZWFkZXIuaGVhZGVyXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aGVhZGVyLmFjdGl2ZX1cXFwiIDpkaXNhYmxlZD1cXFwiaGVhZGVyLmRpc2FibGVkXFxcIj5cXHJcXG4gICAgICAgICAgPGxpIHYtZm9yPVxcXCJ0YWIgaW4gaGVhZGVyLnRhYnNcXFwiIDpjbGFzcz1cXFwie2Rpc2FibGVkOnRhYi5kaXNhYmxlZH1cXFwiPjxhIGhyZWY9XFxcIiNcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QodGFiKVxcXCI+e3t0YWIuaGVhZGVyfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDwvZHJvcGRvd24+XFxyXFxuICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPC91bD5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwidGFiLWNvbnRlbnRcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZX0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnLi9Ecm9wZG93bi52dWUnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgY29tcG9uZW50czoge1xcclxcbiAgICBkcm9wZG93blxcclxcbiAgfSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIC8vIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2ZhZGVpbid9LFxcclxcbiAgICBqdXN0aWZpZWQ6IGZhbHNlLFxcclxcbiAgICBuYXZTdHlsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgaW5kZXggPSB0aGlzLnZhbHVlIHx8IDBcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRleCxcXHJcXG4gICAgICBoZWFkZXJzOiBbXSxcXHJcXG4gICAgICB0YWJzOiBbXVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKHZhbCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2FjdGl2ZScsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMuaW5kZXggPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG5hdlN0eWxlQ2xhc3MgKCkge1xcclxcbiAgICAgIHJldHVybiBbXFxyXFxuICAgICAgICAnbmF2JyxcXHJcXG4gICAgICAgIH5bJ3BpbGxzJywgJ3N0YWNrZWQnXS5pbmRleE9mKHRoaXMubmF2U3R5bGUpID8gJ25hdi0nICsgdGhpcy5uYXZTdHlsZSA6ICduYXYtdGFicycsXFxyXFxuICAgICAgICB7XFxyXFxuICAgICAgICAgICduYXYtanVzdGlmaWVkJzogY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxcclxcbiAgICAgICAgICAnbmF2LXBpbGxzJzogdGhpcy5uYXZTdHlsZSA9PT0gJ3N0YWNrZWQnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgXVxcclxcbiAgICB9LFxcclxcbiAgICBzaG93ICgpIHsgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF0gfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2VsZWN0ICh0YWIpIHtcXHJcXG4gICAgICBpZiAoIXRhYi5kaXNhYmxlZCkge1xcclxcbiAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHRhYilcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5faXNUYWJzID0gdHJ1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTc3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfRHJvcGRvd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNSk7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGNvbXBvbmVudHM6IHtcblx0ICAgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICAvLyBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlaW4nfSxcblx0ICAgIGp1c3RpZmllZDogZmFsc2UsXG5cdCAgICBuYXZTdHlsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIGluZGV4ID0gdGhpcy52YWx1ZSB8fCAwO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kZXg6IGluZGV4LFxuXHQgICAgICBoZWFkZXJzOiBbXSxcblx0ICAgICAgdGFiczogW11cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCh2YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnYWN0aXZlJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy5pbmRleCA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBuYXZTdHlsZUNsYXNzOiBmdW5jdGlvbiBuYXZTdHlsZUNsYXNzKCkge1xuXHQgICAgICByZXR1cm4gWyduYXYnLCB+WydwaWxscycsICdzdGFja2VkJ10uaW5kZXhPZih0aGlzLm5hdlN0eWxlKSA/ICduYXYtJyArIHRoaXMubmF2U3R5bGUgOiAnbmF2LXRhYnMnLCB7XG5cdCAgICAgICAgJ25hdi1qdXN0aWZpZWQnOiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxuXHQgICAgICAgICduYXYtcGlsbHMnOiB0aGlzLm5hdlN0eWxlID09PSAnc3RhY2tlZCdcblx0ICAgICAgfV07XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF07XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdCh0YWIpIHtcblx0ICAgICAgaWYgKCF0YWIuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFicyA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFic1wiOiBcIlwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBjbGFzczogX3ZtLm5hdlN0eWxlQ2xhc3MsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJ0YWJsaXN0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9sKChfdm0uaGVhZGVycyksIGZ1bmN0aW9uKGhlYWRlcikge1xuXHQgICAgcmV0dXJuIFsoaGVhZGVyLl9pc1RhYikgPyBfdm0uX2MoJ2xpJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZSwgZGlzYWJsZWQ6IGhlYWRlci5kaXNhYmxlZFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIF92bS5zZWxlY3QoaGVhZGVyKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhoZWFkZXIuaGVhZGVyKVxuXHQgICAgICB9XG5cdCAgICB9KV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKGhlYWRlci5faXNUYWJHcm91cCkgPyBfdm0uX2MoJ2Ryb3Bkb3duJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZVxuXHQgICAgICB9LFxuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwidGV4dFwiOiBoZWFkZXIuaGVhZGVyLFxuXHQgICAgICAgIFwiZGlzYWJsZWRcIjogaGVhZGVyLmRpc2FibGVkXG5cdCAgICAgIH1cblx0ICAgIH0sIF92bS5fbCgoaGVhZGVyLnRhYnMpLCBmdW5jdGlvbih0YWIpIHtcblx0ICAgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAgIGRpc2FibGVkOiB0YWIuZGlzYWJsZWRcblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICAgICAgYXR0cnM6IHtcblx0ICAgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb246IHtcblx0ICAgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICBfdm0uc2VsZWN0KHRhYilcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX3YoX3ZtLl9zKHRhYi5oZWFkZXIpKV0pXSlcblx0ICAgIH0pKSA6IF92bS5fZSgpXVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwidGFiLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03MDEwMGRkZlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE3OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvZ2dsZUJ1dHRvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZjAzNGE1ZjJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWYwMzRhNWYyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVG9nZ2xlQnV0dG9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGZhbHNlVHlwZTogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBuYW1lOiBudWxsLFxuXHQgICAgcmVhZG9ubHk6IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHJ1ZVR5cGU6IHsgZGVmYXVsdDogJ3ByaW1hcnknIH0sXG5cdCAgICB2YWx1ZTogZmFsc2Vcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhY3RpdmU6IF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLnZhbHVlKSxcblx0ICAgICAgdHlwZXM6IHtcblx0ICAgICAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcblx0ICAgICAgICBpbmZvOiAnYnRuLWluZm8nLFxuXHQgICAgICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG5cdCAgICAgICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcblx0ICAgICAgICB3YXJuaW5nOiAnYnRuLXdhcm5pbmcnXG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZWQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQodmFsID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJyk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuYWN0aXZlID0gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMudmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYm9vbERpc2FibGVkOiBmdW5jdGlvbiBib29sRGlzYWJsZWQoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5kaXNhYmxlZCk7XG5cdCAgICB9LFxuXHQgICAgYm9vbFJlYWRvbmx5OiBmdW5jdGlvbiBib29sUmVhZG9ubHkoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5yZWFkb25seSk7XG5cdCAgICB9LFxuXHQgICAgdHlwZTogZnVuY3Rpb24gdHlwZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZXNbdGhpcy52YWx1ZSA/IHRoaXMudHJ1ZVR5cGUgOiB0aGlzLmZhbHNlVHlwZV0gfHwgJ2J0bi1kZWZhdWx0Jztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5ib29sRGlzYWJsZWQgfHwgdGhpcy5ib29sUmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG5cdCAgICB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTgxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2EnLCB7XG5cdCAgICBjbGFzczogWydidG4nLCBfdm0udHlwZSwge1xuXHQgICAgICByZWFkb25seTogX3ZtLmJvb2xSZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImhyZWZcIjogXCJqYXZhc2NyaXB0OnZvaWQoMClcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uYm9vbERpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2dseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsdWUgPyAnb2snIDogJ3JlbW92ZScpXVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5hY3RpdmUgPyAxIDogMFxuXHQgICAgfVxuXHQgIH0pIDogX3ZtLl9lKCldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mMDM0YTVmMlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxODMpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvb2x0aXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQ4ZmI1MWIyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00OGZiNTFiMlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFRvb2x0aXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ4ZmI1MWIyIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Ub29sdGlwLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDhmYjUxYjIhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1Rvb2x0aXAudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXG59XFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXG59XFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXG59XFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcbjAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG59XFxuQGtleWZyYW1lcyBmYWRlaW4tb3V0IHtcXG4wJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVG9vbHRpcC52dWU/MzdkMTgzZWNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJCQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlRvb2x0aXAudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWyd0b29sdGlwJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInRvb2x0aXAtYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1pbm5lclxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImNvbnRlbnRcXFwiPjxkaXYgdi1odG1sPVxcXCJjb250ZW50XFxcIj48L2Rpdj48L3Nsb3Q+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC90cmFuc2l0aW9uPlxcclxcbiAgPC9zcGFuPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgUG9wb3Zlck1peGluIGZyb20gJy4vdXRpbHMvcG9wb3Zlck1peGlucy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBtaXhpbnM6IFtQb3BvdmVyTWl4aW5dLFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgZWZmZWN0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnfSxcXHJcXG4gICAgdHJpZ2dlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJ31cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG59XFxyXFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXHJcXG59XFxyXFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIGZhZGVpbi1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAuOTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTg1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGlucyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQzKTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3BvdmVyTWl4aW5zKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgbWl4aW5zOiBbX3BvcG92ZXJNaXhpbnMyLmRlZmF1bHRdLFxuXHQgIHByb3BzOiB7XG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJyB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWyd0b29sdGlwJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWlubmVyXCJcblx0ICB9LCBbX3ZtLl90KFwiY29udGVudFwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDhmYjUxYjJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTg4KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNilcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUeXBlYWhlYWQudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTViNWY1ZTk0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01YjVmNWU5NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFR5cGVhaGVhZC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4OSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNWI1ZjVlOTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1R5cGVhaGVhZC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTViNWY1ZTk0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UeXBlYWhlYWQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9UeXBlYWhlYWQudnVlPzczZmNkNGJlXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrSUE7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJUeXBlYWhlYWQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgc3R5bGU9XFxcInBvc2l0aW9uOiByZWxhdGl2ZVxcXCIgOmNsYXNzPVxcXCJ7b3BlbjpzaG93RHJvcGRvd259XFxcIj5cXHJcXG4gICAgPGlucHV0IGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIlxcclxcbiAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICA6cGxhY2Vob2xkZXI9XFxcInBsYWNlaG9sZGVyXFxcIlxcclxcbiAgICAgIDp0eXBlLm9uY2U9XFxcInR5cGVcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcInNob3dEcm9wZG93biA9IGZhbHNlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmRvd24ucHJldmVudD1cXFwiZG93blxcXCJcXHJcXG4gICAgICBAa2V5ZG93bi5lbnRlcj1cXFwiaGl0XFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVzYz1cXFwicmVzZXRcXFwiXFxyXFxuICAgICAgQGtleWRvd24udXAucHJldmVudD1cXFwidXBcXFwiXFxyXFxuICAgIC8+XFxyXFxuICAgIDx1bCBjbGFzcz1cXFwiZHJvcGRvd24tbWVudVxcXCIgcmVmPVxcXCJkcm9wZG93blxcXCI+XFxyXFxuICAgICAgPGxpIHYtZm9yPVxcXCIoaXRlbSwgaSkgaW4gaXRlbXNcXFwiIDpjbGFzcz1cXFwie2FjdGl2ZTogaXNBY3RpdmUoaSl9XFxcIj5cXHJcXG4gICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwiaGl0XFxcIiBAbW91c2Vtb3ZlPVxcXCJzZXRBY3RpdmUoaSlcXFwiPlxcclxcbiAgICAgICAgICA8Y29tcG9uZW50IDppcz1cXFwidGVtcGxhdGVDb21wXFxcIiA6aXRlbT1cXFwiaXRlbVxcXCI+PC9jb21wb25lbnQ+XFxyXFxuICAgICAgICA8L2E+XFxyXFxuICAgICAgPC9saT5cXHJcXG4gICAgPC91bD5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2RlbGF5ZXIsIGdldEpTT059IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYXN5bmM6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBkYXRhOiB7dHlwZTogQXJyYXl9LFxcclxcbiAgICBkZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogREVMQVl9LFxcclxcbiAgICBhc3luY0tleToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxpbWl0OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiA4fSxcXHJcXG4gICAgbWF0Y2hDYXNlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBtYXRjaFN0YXJ0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBvbkhpdDoge1xcclxcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxcclxcbiAgICAgIGRlZmF1bHQgKGl0ZW0pIHsgcmV0dXJuIGl0ZW0gfVxcclxcbiAgICB9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHRlbXBsYXRlOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnfSxcXHJcXG4gICAgdmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFzaWduOiAnJyxcXHJcXG4gICAgICBzaG93RHJvcGRvd246IGZhbHNlLFxcclxcbiAgICAgIG5vUmVzdWx0czogdHJ1ZSxcXHJcXG4gICAgICBjdXJyZW50OiAwLFxcclxcbiAgICAgIGl0ZW1zOiBbXSxcXHJcXG4gICAgICB2YWw6IHRoaXMudmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIHRlbXBsYXRlQ29tcCAoKSB7XFxyXFxuICAgICAgcmV0dXJuIHtcXHJcXG4gICAgICAgIHRlbXBsYXRlOiB0eXBlb2YgdGhpcy50ZW1wbGF0ZSA9PT0gJ3N0cmluZycgPyAnPHNwYW4+JyArIHRoaXMudGVtcGxhdGUgKyAnPC9zcGFuPicgOiAnPHN0cm9uZyB2LWh0bWw9XFxcIml0ZW1cXFwiPjwvc3Ryb25nPicsXFxyXFxuICAgICAgICBwcm9wczogeyBpdGVtOiB7ZGVmYXVsdDogbnVsbH0gfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQgJiYgdmFsICE9PSB0aGlzLmFzaWduKSB0aGlzLl9fdXBkYXRlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7IHRoaXMudmFsID0gdmFsIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2V0SXRlbXMgKGRhdGEpIHtcXHJcXG4gICAgICBpZiAodGhpcy5hc3luYykge1xcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuYXN5bmNLZXkgPyBkYXRhW3RoaXMuYXN5bmNLZXldIDogZGF0YVxcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IChkYXRhIHx8IFtdKS5maWx0ZXIodmFsdWUgPT4ge1xcclxcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgeyByZXR1cm4gdHJ1ZSB9XFxyXFxuICAgICAgICAgIHZhbHVlID0gdGhpcy5tYXRjaENhc2UgPyB2YWx1ZSA6IHZhbHVlLnRvTG93ZXJDYXNlKClcXHJcXG4gICAgICAgICAgdmFyIHF1ZXJ5ID0gdGhpcy5tYXRjaENhc2UgPyB0aGlzLnZhbCA6IHRoaXMudmFsLnRvTG93ZXJDYXNlKClcXHJcXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hTdGFydCA/IHZhbHVlLmluZGV4T2YocXVlcnkpID09PSAwIDogdmFsdWUuaW5kZXhPZihxdWVyeSkgIT09IC0xXFxyXFxuICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KVxcclxcbiAgICAgIH1cXHJcXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMFxcclxcbiAgICB9LFxcclxcbiAgICBzZXRWYWx1ZSAodmFsdWUpIHtcXHJcXG4gICAgICB0aGlzLmFzaWduID0gdmFsdWVcXHJcXG4gICAgICB0aGlzLnZhbCA9IHZhbHVlXFxyXFxuICAgICAgdGhpcy5pdGVtcyA9IFtdXFxyXFxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIHJlc2V0ICgpIHsgdGhpcy5zZXRWYWx1ZShudWxsKSB9LFxcclxcbiAgICBzZXRBY3RpdmUgKGluZGV4KSB7IHRoaXMuY3VycmVudCA9IGluZGV4IH0sXFxyXFxuICAgIGlzQWN0aXZlIChpbmRleCkgeyByZXR1cm4gdGhpcy5jdXJyZW50ID09PSBpbmRleCB9LFxcclxcbiAgICBoaXQgKGUpIHtcXHJcXG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcXHJcXG4gICAgICB0aGlzLnNldFZhbHVlKHRoaXMub25IaXQodGhpcy5pdGVtc1t0aGlzLmN1cnJlbnRdLCB0aGlzKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdXAgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQgPiAwKSB7IHRoaXMuY3VycmVudC0tIH1cXHJcXG4gICAgICBlbHNlIHsgdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgZG93biAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkgeyB0aGlzLmN1cnJlbnQrKyB9XFxyXFxuICAgICAgZWxzZSB7IHRoaXMuY3VycmVudCA9IDAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX191cGRhdGUgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMudmFsKSB7XFxyXFxuICAgICAgICB0aGlzLnJlc2V0KClcXHJcXG4gICAgICAgIHJldHVyblxcclxcbiAgICAgIH1cXHJcXG4gICAgICB0aGlzLmFzaWduID0gJydcXHJcXG4gICAgICBpZiAodGhpcy5hc3luYykge1xcclxcbiAgICAgICAgZ2V0SlNPTih0aGlzLmFzeW5jICsgdGhpcy52YWwpLnRoZW4oZGF0YSA9PiB7XFxyXFxuICAgICAgICAgIHRoaXMuc2V0SXRlbXMoZGF0YSlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEpIHtcXHJcXG4gICAgICAgIHRoaXMuc2V0SXRlbXModGhpcy5kYXRhKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSwgJ2RlbGF5JywgREVMQVkpXFxyXFxuICAgIHRoaXMuX191cGRhdGUoKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTkwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdHlwZW9mMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTkxKTtcblx0XG5cdHZhciBfdHlwZW9mMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3R5cGVvZjIpO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdHZhciBERUxBWSA9IDMwMDsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYXN5bmM6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBkYXRhOiB7IHR5cGU6IEFycmF5IH0sXG5cdCAgICBkZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IERFTEFZIH0sXG5cdCAgICBhc3luY0tleTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogOCB9LFxuXHQgICAgbWF0Y2hDYXNlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBtYXRjaFN0YXJ0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBvbkhpdDoge1xuXHQgICAgICB0eXBlOiBGdW5jdGlvbixcblx0ICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoaXRlbSkge1xuXHQgICAgICAgIHJldHVybiBpdGVtO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0ZW1wbGF0ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCcgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFzaWduOiAnJyxcblx0ICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcblx0ICAgICAgbm9SZXN1bHRzOiB0cnVlLFxuXHQgICAgICBjdXJyZW50OiAwLFxuXHQgICAgICBpdGVtczogW10sXG5cdCAgICAgIHZhbDogdGhpcy52YWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdGVtcGxhdGVDb21wOiBmdW5jdGlvbiB0ZW1wbGF0ZUNvbXAoKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdGVtcGxhdGU6IHR5cGVvZiB0aGlzLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/ICc8c3Bhbj4nICsgdGhpcy50ZW1wbGF0ZSArICc8L3NwYW4+JyA6ICc8c3Ryb25nIHYtaHRtbD1cIml0ZW1cIj48L3N0cm9uZz4nLFxuXHQgICAgICAgIHByb3BzOiB7IGl0ZW06IHsgZGVmYXVsdDogbnVsbCB9IH1cblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCAmJiBfdmFsICE9PSB0aGlzLmFzaWduKSB0aGlzLl9fdXBkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZXRJdGVtczogZnVuY3Rpb24gc2V0SXRlbXMoZGF0YSkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcblx0ICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5hc3luY0tleSA/IGRhdGFbdGhpcy5hc3luY0tleV0gOiBkYXRhO1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkodmFsdWUpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB2YWx1ZSA9IF90aGlzLm1hdGNoQ2FzZSA/IHZhbHVlIDogdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICAgIHZhciBxdWVyeSA9IF90aGlzLm1hdGNoQ2FzZSA/IF90aGlzLnZhbCA6IF90aGlzLnZhbC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMTtcblx0ICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMDtcblx0ICAgIH0sXG5cdCAgICBzZXRWYWx1ZTogZnVuY3Rpb24gc2V0VmFsdWUodmFsdWUpIHtcblx0ICAgICAgdGhpcy5hc2lnbiA9IHZhbHVlO1xuXHQgICAgICB0aGlzLnZhbCA9IHZhbHVlO1xuXHQgICAgICB0aGlzLml0ZW1zID0gW107XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy5zZXRWYWx1ZShudWxsKTtcblx0ICAgIH0sXG5cdCAgICBzZXRBY3RpdmU6IGZ1bmN0aW9uIHNldEFjdGl2ZShpbmRleCkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQgPSBpbmRleDtcblx0ICAgIH0sXG5cdCAgICBpc0FjdGl2ZTogZnVuY3Rpb24gaXNBY3RpdmUoaW5kZXgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY3VycmVudCA9PT0gaW5kZXg7XG5cdCAgICB9LFxuXHQgICAgaGl0OiBmdW5jdGlvbiBoaXQoZSkge1xuXHQgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5vbkhpdCh0aGlzLml0ZW1zW3RoaXMuY3VycmVudF0sIHRoaXMpKTtcblx0ICAgIH0sXG5cdCAgICB1cDogZnVuY3Rpb24gdXAoKSB7XG5cdCAgICAgIGlmICh0aGlzLmN1cnJlbnQgPiAwKSB7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50LS07XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZG93bjogZnVuY3Rpb24gZG93bigpIHtcblx0ICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkge1xuXHQgICAgICAgIHRoaXMuY3VycmVudCsrO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuY3VycmVudCA9IDA7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9fdXBkYXRlID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnZhbCkge1xuXHQgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hc2lnbiA9ICcnO1xuXHQgICAgICBpZiAodGhpcy5hc3luYykge1xuXHQgICAgICAgICgwLCBfdXRpbHMuZ2V0SlNPTikodGhpcy5hc3luYyArIHRoaXMudmFsKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICBfdGhpczIuc2V0SXRlbXMoZGF0YSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG5cdCAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpO1xuXHQgICAgICB9XG5cdCAgICB9LCAnZGVsYXknLCBERUxBWSk7XG5cdCAgICB0aGlzLl9fdXBkYXRlKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHR2YXIgX2l0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cdFxuXHR2YXIgX2l0ZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2l0ZXJhdG9yKTtcblx0XG5cdHZhciBfc3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTIpO1xuXHRcblx0dmFyIF9zeW1ib2wyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltYm9sKTtcblx0XG5cdHZhciBfdHlwZW9mID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgX2l0ZXJhdG9yMi5kZWZhdWx0ID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mKF9pdGVyYXRvcjIuZGVmYXVsdCkgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG5cdCAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xuXHR9IDogZnVuY3Rpb24gKG9iaikge1xuXHQgIHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5MyksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDE5MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxOTQpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjA0KTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMDUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNykuU3ltYm9sO1xuXG4vKioqLyB9LFxuLyogMTk0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdC8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cblx0dmFyIGdsb2JhbCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuXHQgICwgaGFzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgREVTQ1JJUFRPUlMgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KVxuXHQgICwgJGV4cG9ydCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCByZWRlZmluZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpXG5cdCAgLCBNRVRBICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk1KS5LRVlcblx0ICAsICRmYWlscyAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNilcblx0ICAsIHNoYXJlZCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Mylcblx0ICAsIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Nylcblx0ICAsIHVpZCAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NClcblx0ICAsIHdrcyAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OClcblx0ICAsIHdrc0V4dCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSlcblx0ICAsIHdrc0RlZmluZSAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTYpXG5cdCAgLCBrZXlPZiAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk3KVxuXHQgICwgZW51bUtleXMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OClcblx0ICAsIGlzQXJyYXkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDEpXG5cdCAgLCBhbk9iamVjdCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCB0b0lPYmplY3QgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b1ByaW1pdGl2ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG5cdCAgLCBjcmVhdGVEZXNjICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCBfY3JlYXRlICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpXG5cdCAgLCBnT1BORXh0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNjApXG5cdCAgLCAkR09QRCAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjAyKVxuXHQgICwgJERQICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuXHQgICwgJGtleXMgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgZ09QRCAgICAgICAgICAgPSAkR09QRC5mXG5cdCAgLCBkUCAgICAgICAgICAgICA9ICREUC5mXG5cdCAgLCBnT1BOICAgICAgICAgICA9IGdPUE5FeHQuZlxuXHQgICwgJFN5bWJvbCAgICAgICAgPSBnbG9iYWwuU3ltYm9sXG5cdCAgLCAkSlNPTiAgICAgICAgICA9IGdsb2JhbC5KU09OXG5cdCAgLCBfc3RyaW5naWZ5ICAgICA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeVxuXHQgICwgUFJPVE9UWVBFICAgICAgPSAncHJvdG90eXBlJ1xuXHQgICwgSElEREVOICAgICAgICAgPSB3a3MoJ19oaWRkZW4nKVxuXHQgICwgVE9fUFJJTUlUSVZFICAgPSB3a3MoJ3RvUHJpbWl0aXZlJylcblx0ICAsIGlzRW51bSAgICAgICAgID0ge30ucHJvcGVydHlJc0VudW1lcmFibGVcblx0ICAsIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKVxuXHQgICwgQWxsU3ltYm9scyAgICAgPSBzaGFyZWQoJ3N5bWJvbHMnKVxuXHQgICwgT1BTeW1ib2xzICAgICAgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKVxuXHQgICwgT2JqZWN0UHJvdG8gICAgPSBPYmplY3RbUFJPVE9UWVBFXVxuXHQgICwgVVNFX05BVElWRSAgICAgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nXG5cdCAgLCBRT2JqZWN0ICAgICAgICA9IGdsb2JhbC5RT2JqZWN0O1xuXHQvLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcblx0dmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cdFxuXHQvLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcblx0dmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG5cdCAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBkUCh0aGlzLCAnYScsIHt2YWx1ZTogN30pLmE7IH1cblx0ICB9KSkuYSAhPSA3O1xuXHR9KSA/IGZ1bmN0aW9uKGl0LCBrZXksIEQpe1xuXHQgIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuXHQgIGlmKHByb3RvRGVzYylkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcblx0ICBkUChpdCwga2V5LCBEKTtcblx0ICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKWRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG5cdH0gOiBkUDtcblx0XG5cdHZhciB3cmFwID0gZnVuY3Rpb24odGFnKXtcblx0ICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuXHQgIHN5bS5fayA9IHRhZztcblx0ICByZXR1cm4gc3ltO1xuXHR9O1xuXHRcblx0dmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xuXHR9IDogZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG5cdH07XG5cdFxuXHR2YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCl7XG5cdCAgaWYoaXQgPT09IE9iamVjdFByb3RvKSRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG5cdCAgYW5PYmplY3QoaXQpO1xuXHQgIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG5cdCAgYW5PYmplY3QoRCk7XG5cdCAgaWYoaGFzKEFsbFN5bWJvbHMsIGtleSkpe1xuXHQgICAgaWYoIUQuZW51bWVyYWJsZSl7XG5cdCAgICAgIGlmKCFoYXMoaXQsIEhJRERFTikpZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuXHQgICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSlpdFtISURERU5dW2tleV0gPSBmYWxzZTtcblx0ICAgICAgRCA9IF9jcmVhdGUoRCwge2VudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpfSk7XG5cdCAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuXHQgIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xuXHR9O1xuXHR2YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKXtcblx0ICBhbk9iamVjdChpdCk7XG5cdCAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKVxuXHQgICAgLCBpICAgID0gMFxuXHQgICAgLCBsID0ga2V5cy5sZW5ndGhcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKGwgPiBpKSRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblx0dmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApe1xuXHQgIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcblx0fTtcblx0dmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSl7XG5cdCAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcblx0ICBpZih0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSlyZXR1cm4gZmFsc2U7XG5cdCAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xuXHR9O1xuXHR2YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcblx0ICBpdCAgPSB0b0lPYmplY3QoaXQpO1xuXHQgIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG5cdCAgaWYoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybjtcblx0ICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG5cdCAgaWYoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKUQuZW51bWVyYWJsZSA9IHRydWU7XG5cdCAgcmV0dXJuIEQ7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuXHQgIHZhciBuYW1lcyAgPSBnT1BOKHRvSU9iamVjdChpdCkpXG5cdCAgICAsIHJlc3VsdCA9IFtdXG5cdCAgICAsIGkgICAgICA9IDBcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpe1xuXHQgICAgaWYoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKXJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfSByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXHR2YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCl7XG5cdCAgdmFyIElTX09QICA9IGl0ID09PSBPYmplY3RQcm90b1xuXHQgICAgLCBuYW1lcyAgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSlcblx0ICAgICwgcmVzdWx0ID0gW11cblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG5cdCAgICBpZihoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcblx0ICB9IHJldHVybiByZXN1bHQ7XG5cdH07XG5cdFxuXHQvLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcblx0aWYoIVVTRV9OQVRJVkUpe1xuXHQgICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKXtcblx0ICAgIGlmKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKXRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuXHQgICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG5cdCAgICB2YXIgJHNldCA9IGZ1bmN0aW9uKHZhbHVlKXtcblx0ICAgICAgaWYodGhpcyA9PT0gT2JqZWN0UHJvdG8pJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuXHQgICAgICBpZihoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKXRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG5cdCAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG5cdCAgICB9O1xuXHQgICAgaWYoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKXNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8sIHRhZywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0fSk7XG5cdCAgICByZXR1cm4gd3JhcCh0YWcpO1xuXHQgIH07XG5cdCAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuXHQgICAgcmV0dXJuIHRoaXMuX2s7XG5cdCAgfSk7XG5cdFxuXHQgICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXHQgICREUC5mICAgPSAkZGVmaW5lUHJvcGVydHk7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXyg2MSkuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oMjAwKS5mICA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0ICBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OSkuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cdFxuXHQgIGlmKERFU0NSSVBUT1JTICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KSl7XG5cdCAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcblx0ICB9XG5cdFxuXHQgIHdrc0V4dC5mID0gZnVuY3Rpb24obmFtZSl7XG5cdCAgICByZXR1cm4gd3JhcCh3a3MobmFtZSkpO1xuXHQgIH1cblx0fVxuXHRcblx0JGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1N5bWJvbDogJFN5bWJvbH0pO1xuXHRcblx0Zm9yKHZhciBzeW1ib2xzID0gKFxuXHQgIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG5cdCAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuXHQpLnNwbGl0KCcsJyksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3Moc3ltYm9sc1tpKytdKTtcblx0XG5cdGZvcih2YXIgc3ltYm9scyA9ICRrZXlzKHdrcy5zdG9yZSksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3NEZWZpbmUoc3ltYm9sc1tpKytdKTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG5cdCAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG5cdCAgJ2Zvcic6IGZ1bmN0aW9uKGtleSl7XG5cdCAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG5cdCAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuXHQgICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG5cdCAgfSxcblx0ICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcblx0ICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihrZXkpe1xuXHQgICAgaWYoaXNTeW1ib2woa2V5KSlyZXR1cm4ga2V5T2YoU3ltYm9sUmVnaXN0cnksIGtleSk7XG5cdCAgICB0aHJvdyBUeXBlRXJyb3Ioa2V5ICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG5cdCAgfSxcblx0ICB1c2VTZXR0ZXI6IGZ1bmN0aW9uKCl7IHNldHRlciA9IHRydWU7IH0sXG5cdCAgdXNlU2ltcGxlOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSBmYWxzZTsgfVxuXHR9KTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG5cdCAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuXHQgIGNyZWF0ZTogJGNyZWF0ZSxcblx0ICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcblx0ICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuXHQgIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG5cdCAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG5cdCAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuXHQgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcblx0ICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuXHQgIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuXHQgIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcblx0ICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcblx0fSk7XG5cdFxuXHQvLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcblx0JEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uKCl7XG5cdCAgdmFyIFMgPSAkU3ltYm9sKCk7XG5cdCAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cblx0ICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcblx0ICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuXHQgIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7YTogU30pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG5cdH0pKSwgJ0pTT04nLCB7XG5cdCAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpe1xuXHQgICAgaWYoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG5cdCAgICB2YXIgYXJncyA9IFtpdF1cblx0ICAgICAgLCBpICAgID0gMVxuXHQgICAgICAsIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG5cdCAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuXHQgICAgcmVwbGFjZXIgPSBhcmdzWzFdO1xuXHQgICAgaWYodHlwZW9mIHJlcGxhY2VyID09ICdmdW5jdGlvbicpJHJlcGxhY2VyID0gcmVwbGFjZXI7XG5cdCAgICBpZigkcmVwbGFjZXIgfHwgIWlzQXJyYXkocmVwbGFjZXIpKXJlcGxhY2VyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG5cdCAgICAgIGlmKCRyZXBsYWNlcil2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuXHQgICAgICBpZighaXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTtcblx0ICAgIH07XG5cdCAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG5cdCAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG5cdCAgfVxuXHR9KTtcblx0XG5cdC8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcblx0JFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgX193ZWJwYWNrX3JlcXVpcmVfXygxMCkoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcblx0Ly8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG5cdC8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cblx0c2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcblx0Ly8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cblx0c2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG5cbi8qKiovIH0sXG4vKiAxOTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBNRVRBICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDQpKCdtZXRhJylcblx0ICAsIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMylcblx0ICAsIGhhcyAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHNldERlc2MgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZlxuXHQgICwgaWQgICAgICAgPSAwO1xuXHR2YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbigpe1xuXHQgIHJldHVybiB0cnVlO1xuXHR9O1xuXHR2YXIgRlJFRVpFID0gIV9fd2VicGFja19yZXF1aXJlX18oMTYpKGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcblx0fSk7XG5cdHZhciBzZXRNZXRhID0gZnVuY3Rpb24oaXQpe1xuXHQgIHNldERlc2MoaXQsIE1FVEEsIHt2YWx1ZToge1xuXHQgICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG5cdCAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuXHQgIH19KTtcblx0fTtcblx0dmFyIGZhc3RLZXkgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcblx0ICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG5cdCAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuXHQgIGlmKCFoYXMoaXQsIE1FVEEpKXtcblx0ICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG5cdCAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuXHQgICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcblx0ICAgIGlmKCFjcmVhdGUpcmV0dXJuICdFJztcblx0ICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG5cdCAgICBzZXRNZXRhKGl0KTtcblx0ICAvLyByZXR1cm4gb2JqZWN0IElEXG5cdCAgfSByZXR1cm4gaXRbTUVUQV0uaTtcblx0fTtcblx0dmFyIGdldFdlYWsgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcblx0ICBpZighaGFzKGl0LCBNRVRBKSl7XG5cdCAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuXHQgICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuIHRydWU7XG5cdCAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuXHQgICAgaWYoIWNyZWF0ZSlyZXR1cm4gZmFsc2U7XG5cdCAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuXHQgICAgc2V0TWV0YShpdCk7XG5cdCAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcblx0ICB9IHJldHVybiBpdFtNRVRBXS53O1xuXHR9O1xuXHQvLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcblx0dmFyIG9uRnJlZXplID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSlzZXRNZXRhKGl0KTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cdHZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdCAgS0VZOiAgICAgIE1FVEEsXG5cdCAgTkVFRDogICAgIGZhbHNlLFxuXHQgIGZhc3RLZXk6ICBmYXN0S2V5LFxuXHQgIGdldFdlYWs6ICBnZXRXZWFrLFxuXHQgIG9uRnJlZXplOiBvbkZyZWV6ZVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZ2xvYmFsICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBjb3JlICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIExJQlJBUlkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNylcblx0ICAsIHdrc0V4dCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSlcblx0ICAsIGRlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZjtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcblx0ICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuXHQgIGlmKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwge3ZhbHVlOiB3a3NFeHQuZihuYW1lKX0pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZ2V0S2V5cyAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNClcblx0ICAsIHRvSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgZWwpe1xuXHQgIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuXHQgICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG5cdCAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG5cdCAgICAsIGluZGV4ICA9IDBcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKGxlbmd0aCA+IGluZGV4KWlmKE9ba2V5ID0ga2V5c1tpbmRleCsrXV0gPT09IGVsKXJldHVybiBrZXk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG5cdHZhciBnZXRLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNClcblx0ICAsIGdPUFMgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OSlcblx0ICAsIHBJRSAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHZhciByZXN1bHQgICAgID0gZ2V0S2V5cyhpdClcblx0ICAgICwgZ2V0U3ltYm9scyA9IGdPUFMuZjtcblx0ICBpZihnZXRTeW1ib2xzKXtcblx0ICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdClcblx0ICAgICAgLCBpc0VudW0gID0gcElFLmZcblx0ICAgICAgLCBpICAgICAgID0gMFxuXHQgICAgICAsIGtleTtcblx0ICAgIHdoaWxlKHN5bWJvbHMubGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSlyZXN1bHQucHVzaChrZXkpO1xuXHQgIH0gcmV0dXJuIHJlc3VsdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0ZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqKi8gfSxcbi8qIDIwMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0ZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKiovIH0sXG4vKiAyMDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG5cdHZhciBjb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKXtcblx0ICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDIwMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIHBJRSAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDApXG5cdCAgLCBjcmVhdGVEZXNjICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCB0b0lPYmplY3QgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b1ByaW1pdGl2ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBJRThfRE9NX0RFRklORSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpXG5cdCAgLCBnT1BEICAgICAgICAgICA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdFxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCl7XG5cdCAgTyA9IHRvSU9iamVjdChPKTtcblx0ICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG5cdCAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcblx0ICAgIHJldHVybiBnT1BEKE8sIFApO1xuXHQgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblx0ICBpZihoYXMoTywgUCkpcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXG5cbi8qKiovIH0sXG4vKiAyMDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTk2KSgnYXN5bmNJdGVyYXRvcicpO1xuXG4vKioqLyB9LFxuLyogMjA1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE5NikoJ29ic2VydmFibGUnKTtcblxuLyoqKi8gfSxcbi8qIDIwNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICBvcGVuOiBfdm0uc2hvd0Ryb3Bkb3duXG5cdCAgICB9LFxuXHQgICAgc3RhdGljU3R5bGU6IHtcblx0ICAgICAgXCJwb3NpdGlvblwiOiBcInJlbGF0aXZlXCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwibW9kZWxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLnZhbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwidmFsXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uX3MoX3ZtLnZhbClcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImJsdXJcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnNob3dEcm9wZG93biA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwia2V5ZG93blwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJkb3duXCIsIDQwKSkgeyByZXR1cm47IH1cblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uZG93bigkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5oaXQoJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnJlc2V0KCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJ1cFwiLCAzOCkpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnVwKCRldmVudClcblx0ICAgICAgfV0sXG5cdCAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHJlZjogXCJkcm9wZG93blwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZHJvcGRvd24tbWVudVwiXG5cdCAgfSwgX3ZtLl9sKChfdm0uaXRlbXMpLCBmdW5jdGlvbihpdGVtLCBpKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICBhY3RpdmU6IF92bS5pc0FjdGl2ZShpKVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgICB9LFxuXHQgICAgICAgIFwibW91c2Vtb3ZlXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLnNldEFjdGl2ZShpKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fYyhfdm0udGVtcGxhdGVDb21wLCB7XG5cdCAgICAgIHRhZzogXCJjb21wb25lbnRcIixcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcIml0ZW1cIjogaXRlbVxuXHQgICAgICB9XG5cdCAgICB9KV0sIDEpXSlcblx0ICB9KSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi01YjVmNWU5NFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfVxuLyoqKioqKi8gXSlcbn0pO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dnVlLXN0cmFwLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi92dWUtc3RyYXAvZGlzdC92dWUtc3RyYXAuanNcbi8vIG1vZHVsZSBpZCA9IDQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 43 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"// style-loader: Adds some css to the DOM by adding a \" ).appendTo( body );\n\t\t}\n\n\t\tif ( o.opacity ) { // opacity option\n\t\t\tif ( this.helper.css( \"opacity\" ) ) {\n\t\t\t\tthis._storedOpacity = this.helper.css( \"opacity\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"opacity\", o.opacity );\n\t\t}\n\n\t\tif ( o.zIndex ) { // zIndex option\n\t\t\tif ( this.helper.css( \"zIndex\" ) ) {\n\t\t\t\tthis._storedZIndex = this.helper.css( \"zIndex\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"zIndex\", o.zIndex );\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"start\", event, this._uiHash() );\n\n\t\t//Recache the helper size\n\t\tif ( !this._preserveHelperProportions ) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif ( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis._addClass( this.helper, \"ui-sortable-helper\" );\n\n\t\t// Execute the drag once - this causes the helper not to be visiblebefore getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event );\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\tif ( !this.lastPositionAbs ) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif ( this.options.scroll ) {\n\t\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\n\t\t\t\tif ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -\n\t\t\t\t\t\tevent.pageY < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -\n\t\t\t\t\t\tevent.pageX < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Set the helper position\n\t\tif ( !this.options.axis || this.options.axis !== \"y\" ) {\n\t\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( !this.options.axis || this.options.axis !== \"x\" ) {\n\t\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[ i ];\n\t\t\titemElement = item.item[ 0 ];\n\t\t\tintersection = this._intersectsWithPointer( item );\n\t\t\tif ( !intersection ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif ( item.instance !== this.currentContainer ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif ( itemElement !== this.currentItem[ 0 ] &&\n\t\t\t\tthis.placeholder[ intersection === 1 ? \"next\" : \"prev\" ]()[ 0 ] !== itemElement &&\n\t\t\t\t!$.contains( this.placeholder[ 0 ], itemElement ) &&\n\t\t\t\t( this.options.type === \"semi-dynamic\" ?\n\t\t\t\t\t!$.contains( this.element[ 0 ], itemElement ) :\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif ( this.options.tolerance === \"pointer\" || this._intersectsWithSides( item ) ) {\n\t\t\t\t\tthis._rearrange( event, item );\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers( event );\n\n\t\t//Interconnect with droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"sort\", event, this._uiHash() );\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function( event, noPropagation ) {\n\n\t\tif ( !event ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\tif ( this.options.revert ) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollLeft\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollTop\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$( this.helper ).animate(\n\t\t\t\tanimation,\n\t\t\t\tparseInt( this.options.revert, 10 ) || 500,\n\t\t\t\tfunction() {\n\t\t\t\t\tthat._clear( event );\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tthis._clear( event, noPropagation );\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: null } ) );\n\n\t\t\tif ( this.options.helper === \"original\" ) {\n\t\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor ( var i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"deactivate\", null, this._uiHash( this ) );\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", null, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.placeholder ) {\n\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t\t// it unbinds ALL events from the original node!\n\t\t\tif ( this.placeholder[ 0 ].parentNode ) {\n\t\t\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\t\t\t}\n\t\t\tif ( this.options.helper !== \"original\" && this.helper &&\n\t\t\t\t\tthis.helper[ 0 ].parentNode ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t} );\n\n\t\t\tif ( this.domPosition.prev ) {\n\t\t\t\t$( this.domPosition.prev ).after( this.currentItem );\n\t\t\t} else {\n\t\t\t\t$( this.domPosition.parent ).prepend( this.currentItem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$( items ).each( function() {\n\t\t\tvar res = ( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" )\n\t\t\t\t.match( o.expression || ( /(.+)[\\-=_](.+)/ ) );\n\t\t\tif ( res ) {\n\t\t\t\tstr.push(\n\t\t\t\t\t( o.key || res[ 1 ] + \"[]\" ) +\n\t\t\t\t\t\"=\" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );\n\t\t\t}\n\t\t} );\n\n\t\tif ( !str.length && o.key ) {\n\t\t\tstr.push( o.key + \"=\" );\n\t\t}\n\n\t\treturn str.join( \"&\" );\n\n\t},\n\n\ttoArray: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each( function() {\n\t\t\tret.push( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" );\n\t\t} );\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function( item ) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t &&\n\t\t\t\t( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l &&\n\t\t\t\t( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t( this.options.tolerance !== \"pointer\" &&\n\t\t\t\tthis.helperProportions[ this.floating ? \"width\" : \"height\" ] >\n\t\t\t\titem[ this.floating ? \"width\" : \"height\" ] )\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( this.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( this.helperProportions.height / 2 ) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function( item ) {\n\t\tvar verticalDirection, horizontalDirection,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.top + this.offset.click.top, item.top, item.height ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.left + this.offset.click.left, item.left, item.width ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( !isOverElement ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tverticalDirection = this._getDragVerticalDirection();\n\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\treturn this.floating ?\n\t\t\t( ( horizontalDirection === \"right\" || verticalDirection === \"down\" ) ? 2 : 1 )\n\t\t\t: ( verticalDirection && ( verticalDirection === \"down\" ? 2 : 1 ) );\n\n\t},\n\n\t_intersectsWithSides: function( item ) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis( this.positionAbs.top +\n\t\t\t\tthis.offset.click.top, item.top + ( item.height / 2 ), item.height ),\n\t\t\tisOverRightHalf = this._isOverAxis( this.positionAbs.left +\n\t\t\t\tthis.offset.click.left, item.left + ( item.width / 2 ), item.width ),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif ( this.floating && horizontalDirection ) {\n\t\t\treturn ( ( horizontalDirection === \"right\" && isOverRightHalf ) ||\n\t\t\t\t( horizontalDirection === \"left\" && !isOverRightHalf ) );\n\t\t} else {\n\t\t\treturn verticalDirection && ( ( verticalDirection === \"down\" && isOverBottomHalf ) ||\n\t\t\t\t( verticalDirection === \"up\" && !isOverBottomHalf ) );\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && ( delta > 0 ? \"down\" : \"up\" );\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && ( delta > 0 ? \"right\" : \"left\" );\n\t},\n\n\trefresh: function( event ) {\n\t\tthis._refreshItems( event );\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ?\n\t\t\t[ options.connectWith ] :\n\t\t\toptions.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function( connected ) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif ( connectWith && connected ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items.call( inst.element ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-placeholder\" ), inst ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push( [ $.isFunction( this.options.items ) ?\n\t\t\tthis.options.items\n\t\t\t\t.call( this.element, null, { options: this.options, item: this.currentItem } ) :\n\t\t\t$( this.options.items, this.element )\n\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t.not( \".ui-sortable-placeholder\" ), this ] );\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\tqueries[ i ][ 0 ].each( addItems );\n\t\t}\n\n\t\treturn $( items );\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find( \":data(\" + this.widgetName + \"-item)\" );\n\n\t\tthis.items = $.grep( this.items, function( item ) {\n\t\t\tfor ( var j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === item.item[ 0 ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t},\n\n\t_refreshItems: function( event ) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [ this ];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [ [ $.isFunction( this.options.items ) ?\n\t\t\t\tthis.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t$( this.options.items, this.element ), this ] ],\n\t\t\tconnectWith = this._connectWith();\n\n\t\t//Shouldn't be run the first time through due to massive slow-down\n\t\tif ( connectWith && this.ready ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items\n\t\t\t\t\t\t\t\t.call( inst.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element ), inst ] );\n\t\t\t\t\t\tthis.containers.push( inst );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\ttargetData = queries[ i ][ 1 ];\n\t\t\t_queries = queries[ i ][ 0 ];\n\n\t\t\tfor ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {\n\t\t\t\titem = $( _queries[ j ] );\n\n\t\t\t\t// Data for target checking (mouse manager)\n\t\t\t\titem.data( this.widgetName + \"-item\", targetData );\n\n\t\t\t\titems.push( {\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function( fast ) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent,\n\t\t// the offsetParent's position will change\n\t\tif ( this.offsetParent && this.helper ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif ( item.instance !== this.currentContainer && this.currentContainer &&\n\t\t\t\t\titem.item[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ?\n\t\t\t\t$( this.options.toleranceElement, item.item ) :\n\t\t\t\titem.item;\n\n\t\t\tif ( !fast ) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif ( this.options.custom && this.options.custom.refreshContainers ) {\n\t\t\tthis.options.custom.refreshContainers.call( this );\n\t\t} else {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tp = this.containers[ i ].element.offset();\n\t\t\t\tthis.containers[ i ].containerCache.left = p.left;\n\t\t\t\tthis.containers[ i ].containerCache.top = p.top;\n\t\t\t\tthis.containers[ i ].containerCache.width =\n\t\t\t\t\tthis.containers[ i ].element.outerWidth();\n\t\t\t\tthis.containers[ i ].containerCache.height =\n\t\t\t\t\tthis.containers[ i ].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function( that ) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif ( !o.placeholder || o.placeholder.constructor === String ) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[ 0 ] );\n\n\t\t\t\t\t\tthat._addClass( element, \"ui-sortable-placeholder\",\n\t\t\t\t\t\t\t\tclassName || that.currentItem[ 0 ].className )\n\t\t\t\t\t\t\t._removeClass( element, \"ui-sortable-helper\" );\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function( container, p ) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes -\n\t\t\t\t\t// the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n\t\t\t\t\t// class name is specified\n\t\t\t\t\tif ( className && !o.forcePlaceholderSize ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming\n\t\t\t\t\t// from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif ( !p.height() ) {\n\t\t\t\t\t\tp.height(\n\t\t\t\t\t\t\tthat.currentItem.innerHeight() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingTop\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingBottom\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( !p.width() ) {\n\t\t\t\t\t\tp.width(\n\t\t\t\t\t\t\tthat.currentItem.innerWidth() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingLeft\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingRight\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after( that.placeholder );\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update( that, that.placeholder );\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each( function() {\n\t\t\t$( \" \", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t} );\n\t},\n\n\t_contactContainers: function( event ) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,\n\t\t\tfloating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// Get innermost container that intersects with item\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\n\t\t\t// Never consider a container that's located within the item itself\n\t\t\tif ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this._intersectsWith( this.containers[ i ].containerCache ) ) {\n\n\t\t\t\t// If we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif ( innermostContainer &&\n\t\t\t\t\t\t$.contains(\n\t\t\t\t\t\t\tthis.containers[ i ].element[ 0 ],\n\t\t\t\t\t\t\tinnermostContainer.element[ 0 ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[ i ];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", event, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// If no intersecting containers found, return\n\t\tif ( !innermostContainer ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the item into the container if it's not there already\n\t\tif ( this.containers.length === 1 ) {\n\t\t\tif ( !this.containers[ innermostIndex ].containerCache.over ) {\n\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// When entering a new container, we will find the item with the least distance and\n\t\t\t// append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating( this.currentItem );\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"pageX\" : \"pageY\";\n\n\t\t\tfor ( j = this.items.length - 1; j >= 0; j-- ) {\n\t\t\t\tif ( !$.contains(\n\t\t\t\t\t\tthis.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[ j ].item.offset()[ posProperty ];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\" : \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.currentContainer === this.containers[ innermostIndex ] ) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ?\n\t\t\t\tthis._rearrange( event, itemWithLeastDistance, null, true ) :\n\t\t\t\tthis._rearrange( event, null, this.containers[ innermostIndex ].element, true );\n\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"change\", event, this._uiHash( this ) );\n\t\t\tthis.currentContainer = this.containers[ innermostIndex ];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update( this.currentContainer, this.placeholder );\n\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t}\n\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction( o.helper ) ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem );\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\t$( o.appendTo !== \"parent\" ?\n\t\t\t\to.appendTo :\n\t\t\t\tthis.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );\n\t\t}\n\n\t\tif ( helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tthis._storedCSS = {\n\t\t\t\twidth: this.currentItem[ 0 ].style.width,\n\t\t\t\theight: this.currentItem[ 0 ].style.height,\n\t\t\t\tposition: this.currentItem.css( \"position\" ),\n\t\t\t\ttop: this.currentItem.css( \"top\" ),\n\t\t\t\tleft: this.currentItem.css( \"left\" )\n\t\t\t};\n\t\t}\n\n\t\tif ( !helper[ 0 ].style.width || o.forceHelperSize ) {\n\t\t\thelper.width( this.currentItem.width() );\n\t\t}\n\t\tif ( !helper[ 0 ].style.height || o.forceHelperSize ) {\n\t\t\thelper.height( this.currentItem.height() );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( $.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this\n\t\t// information with an ugly IE fix\n\t\tif ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||\n\t\t\t\t( this.offsetParent[ 0 ].tagName &&\n\t\t\t\tthis.offsetParent[ 0 ].tagName.toLowerCase() === \"html\" && $.ui.ie ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif ( this.cssPosition === \"relative\" ) {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.currentItem.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.currentItem.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\t\tif ( o.containment === \"document\" || o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ?\n\t\t\t\t\tthis.document.width() :\n\t\t\t\t\tthis.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( o.containment === \"document\" ?\n\t\t\t\t\t( this.document.height() || document.body.parentNode.scrollHeight ) :\n\t\t\t\t\tthis.window.height() || this.document[ 0 ].body.parentNode.scrollHeight\n\t\t\t\t) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {\n\t\t\tce = $( o.containment )[ 0 ];\n\t\t\tco = $( o.containment ).offset();\n\t\t\tover = ( $( ce ).css( \"overflow\" ) !== \"hidden\" );\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + ( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingLeft\" ), 10 ) || 0 ) - this.margins.left,\n\t\t\t\tco.top + ( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingTop\" ), 10 ) || 0 ) - this.margins.top,\n\t\t\t\tco.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\tco.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :\n\t\t\t\t\tscroll.scrollLeft() ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event ) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif ( this.cssPosition === \"relative\" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif ( this.originalPosition ) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {\n\t\t\t\t\tpageX = this.containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {\n\t\t\t\t\tpageY = this.containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {\n\t\t\t\t\tpageX = this.containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {\n\t\t\t\t\tpageY = this.containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\t\t\t\ttop = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /\n\t\t\t\t\to.grid[ 1 ] ) * o.grid[ 1 ];\n\t\t\t\tpageY = this.containment ?\n\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] &&\n\t\t\t\t\t\ttop - this.offset.click.top <= this.containment[ 3 ] ) ?\n\t\t\t\t\t\t\ttop :\n\t\t\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?\n\t\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :\n\t\t\t\t\t\t\t\ttop;\n\n\t\t\t\tleft = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /\n\t\t\t\t\to.grid[ 0 ] ) * o.grid[ 0 ];\n\t\t\t\tpageX = this.containment ?\n\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] &&\n\t\t\t\t\t\tleft - this.offset.click.left <= this.containment[ 2 ] ) ?\n\t\t\t\t\t\t\tleft :\n\t\t\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?\n\t\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :\n\t\t\t\t\t\t\t\tleft;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() :\n\t\t\t\t\tscrollIsRootNode ? 0 : scroll.scrollLeft() ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function( event, i, a, hardRefresh ) {\n\n\t\ta ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :\n\t\t\ti.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],\n\t\t\t\t( this.direction === \"down\" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout,\n\t\t// if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay( function() {\n\t\t\tif ( counter === this.counter ) {\n\n\t\t\t\t//Precompute after each DOM insertion, NOT on mousemove\n\t\t\t\tthis.refreshPositions( !hardRefresh );\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_clear: function( event, noPropagation ) {\n\n\t\tthis.reverting = false;\n\n\t\t// We delay all events that have to be triggered to after the point where the placeholder\n\t\t// has been removed and everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets\n\t\t// reappended (see #4088)\n\t\tif ( !this._noFinalSort && this.currentItem.parent().length ) {\n\t\t\tthis.placeholder.before( this.currentItem );\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tfor ( i in this._storedCSS ) {\n\t\t\t\tif ( this._storedCSS[ i ] === \"auto\" || this._storedCSS[ i ] === \"static\" ) {\n\t\t\t\t\tthis._storedCSS[ i ] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif ( this.fromOutside && !noPropagation ) {\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"receive\", event, this._uiHash( this.fromOutside ) );\n\t\t\t} );\n\t\t}\n\t\tif ( ( this.fromOutside ||\n\t\t\t\tthis.domPosition.prev !==\n\t\t\t\tthis.currentItem.prev().not( \".ui-sortable-helper\" )[ 0 ] ||\n\t\t\t\tthis.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {\n\n\t\t\t// Trigger update callback if the DOM position has changed\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"update\", event, this._uiHash() );\n\t\t\t} );\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif ( this !== this.currentContainer ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\t\tthis._trigger( \"remove\", event, this._uiHash() );\n\t\t\t\t} );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"receive\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"update\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif ( this._storedOpacity ) {\n\t\t\tthis.helper.css( \"opacity\", this._storedOpacity );\n\t\t}\n\t\tif ( this._storedZIndex ) {\n\t\t\tthis.helper.css( \"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex );\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif ( !noPropagation ) {\n\t\t\tthis._trigger( \"beforeStop\", event, this._uiHash() );\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t// it unbinds ALL events from the original node!\n\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif ( !noPropagation ) {\n\t\t\tfor ( i = 0; i < delayedTriggers.length; i++ ) {\n\n\t\t\t\t// Trigger all delayed events\n\t\t\t\tdelayedTriggers[ i ].call( this, event );\n\t\t\t}\n\t\t\tthis._trigger( \"stop\", event, this._uiHash() );\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function( _inst ) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $( [] ),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n} );\n\n\n/*!\n * jQuery UI Spinner 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Spinner\n//>>group: Widgets\n//>>description: Displays buttons to easily input numbers via the keyboard or mouse.\n//>>docs: http://api.jqueryui.com/spinner/\n//>>demos: http://jqueryui.com/spinner/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/spinner.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nfunction spinnerModifer( fn ) {\n\treturn function() {\n\t\tvar previous = this.element.val();\n\t\tfn.apply( this, arguments );\n\t\tthis._refresh();\n\t\tif ( previous !== this.element.val() ) {\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t};\n}\n\n$.widget( \"ui.spinner\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"\",\n\twidgetEventPrefix: \"spin\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-spinner\": \"ui-corner-all\",\n\t\t\t\"ui-spinner-down\": \"ui-corner-br\",\n\t\t\t\"ui-spinner-up\": \"ui-corner-tr\"\n\t\t},\n\t\tculture: null,\n\t\ticons: {\n\t\t\tdown: \"ui-icon-triangle-1-s\",\n\t\t\tup: \"ui-icon-triangle-1-n\"\n\t\t},\n\t\tincremental: true,\n\t\tmax: null,\n\t\tmin: null,\n\t\tnumberFormat: null,\n\t\tpage: 10,\n\t\tstep: 1,\n\n\t\tchange: null,\n\t\tspin: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\n\t\t// handle string values that need to be parsed\n\t\tthis._setOption( \"max\", this.options.max );\n\t\tthis._setOption( \"min\", this.options.min );\n\t\tthis._setOption( \"step\", this.options.step );\n\n\t\t// Only format if there is a value, prevents the field from being marked\n\t\t// as invalid in Firefox, see #9573.\n\t\tif ( this.value() !== \"\" ) {\n\n\t\t\t// Format the value, but don't constrain.\n\t\t\tthis._value( this.element.val(), true );\n\t\t}\n\n\t\tthis._draw();\n\t\tthis._on( this._events );\n\t\tthis._refresh();\n\n\t\t// Turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = this._super();\n\t\tvar element = this.element;\n\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\n\t\t\tvar value = element.attr( option );\n\t\t\tif ( value != null && value.length ) {\n\t\t\t\toptions[ option ] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn options;\n\t},\n\n\t_events: {\n\t\tkeydown: function( event ) {\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\tkeyup: \"_stop\",\n\t\tfocus: function() {\n\t\t\tthis.previous = this.element.val();\n\t\t},\n\t\tblur: function( event ) {\n\t\t\tif ( this.cancelBlur ) {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._stop();\n\t\t\tthis._refresh();\n\t\t\tif ( this.previous !== this.element.val() ) {\n\t\t\t\tthis._trigger( \"change\", event );\n\t\t\t}\n\t\t},\n\t\tmousewheel: function( event, delta ) {\n\t\t\tif ( !delta ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );\n\t\t\tclearTimeout( this.mousewheelTimer );\n\t\t\tthis.mousewheelTimer = this._delay( function() {\n\t\t\t\tif ( this.spinning ) {\n\t\t\t\t\tthis._stop( event );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t\tevent.preventDefault();\n\t\t},\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\n\t\t\tvar previous;\n\n\t\t\t// We never want the buttons to have focus; whenever the user is\n\t\t\t// interacting with the spinner, the focus should be on the input.\n\t\t\t// If the input is focused then this.previous is properly set from\n\t\t\t// when the input first received focus. If the input is not focused\n\t\t\t// then we need to set this.previous based on the value before spinning.\n\t\t\tprevious = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?\n\t\t\t\tthis.previous : this.element.val();\n\t\t\tfunction checkFocus() {\n\t\t\t\tvar isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );\n\t\t\t\tif ( !isActive ) {\n\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\tthis.previous = previous;\n\n\t\t\t\t\t// support: IE\n\t\t\t\t\t// IE sets focus asynchronously, so we need to check if focus\n\t\t\t\t\t// moved off of the input because the user clicked on the button.\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure focus is on (or stays on) the text field\n\t\t\tevent.preventDefault();\n\t\t\tcheckFocus.call( this );\n\n\t\t\t// Support: IE\n\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t// and check (again) if focus moved off of the input.\n\t\t\tthis.cancelBlur = true;\n\t\t\tthis._delay( function() {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\tcheckFocus.call( this );\n\t\t\t} );\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\n\n\t\t\t// button will add ui-state-active if mouse was down while mouseleave and kept down\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\n\t\t// TODO: do we really want to consider this a stop?\n\t\t// shouldn't we just stop the repeater and wait until mouseup before\n\t\t// we trigger the stop event?\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\n\t},\n\n\t// Support mobile enhanced option and make backcompat more sane\n\t_enhance: function() {\n\t\tthis.uiSpinner = this.element\n\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t.wrap( \"\" )\n\t\t\t.parent()\n\n\t\t\t\t// Add buttons\n\t\t\t\t.append(\n\t\t\t\t\t\"
\"\n\t\t\t\t);\n\t},\n\n\t_draw: function() {\n\t\tthis._enhance();\n\n\t\tthis._addClass( this.uiSpinner, \"ui-spinner\", \"ui-widget ui-widget-content\" );\n\t\tthis._addClass( \"ui-spinner-input\" );\n\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\n\n\t\t// Button bindings\n\t\tthis.buttons = this.uiSpinner.children( \"a\" )\n\t\t\t.attr( \"tabIndex\", -1 )\n\t\t\t.attr( \"aria-hidden\", true )\n\t\t\t.button( {\n\t\t\t\tclasses: {\n\t\t\t\t\t\"ui-button\": \"\"\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// TODO: Right now button does not support classes this is already updated in button PR\n\t\tthis._removeClass( this.buttons, \"ui-corner-all\" );\n\n\t\tthis._addClass( this.buttons.first(), \"ui-spinner-button ui-spinner-up\" );\n\t\tthis._addClass( this.buttons.last(), \"ui-spinner-button ui-spinner-down\" );\n\t\tthis.buttons.first().button( {\n\t\t\t\"icon\": this.options.icons.up,\n\t\t\t\"showLabel\": false\n\t\t} );\n\t\tthis.buttons.last().button( {\n\t\t\t\"icon\": this.options.icons.down,\n\t\t\t\"showLabel\": false\n\t\t} );\n\n\t\t// IE 6 doesn't understand height: 50% for the buttons\n\t\t// unless the wrapper has an explicit height\n\t\tif ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&\n\t\t\t\tthis.uiSpinner.height() > 0 ) {\n\t\t\tthis.uiSpinner.height( this.uiSpinner.height() );\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar options = this.options,\n\t\t\tkeyCode = $.ui.keyCode;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.UP:\n\t\t\tthis._repeat( null, 1, event );\n\t\t\treturn true;\n\t\tcase keyCode.DOWN:\n\t\t\tthis._repeat( null, -1, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_UP:\n\t\t\tthis._repeat( null, options.page, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_DOWN:\n\t\t\tthis._repeat( null, -options.page, event );\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_start: function( event ) {\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\t\tthis.spinning = true;\n\t\treturn true;\n\t},\n\n\t_repeat: function( i, steps, event ) {\n\t\ti = i || 500;\n\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay( function() {\n\t\t\tthis._repeat( 40, steps, event );\n\t\t}, i );\n\n\t\tthis._spin( steps * this.options.step, event );\n\t},\n\n\t_spin: function( step, event ) {\n\t\tvar value = this.value() || 0;\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\n\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false ) {\n\t\t\tthis._value( value );\n\t\t\tthis.counter++;\n\t\t}\n\t},\n\n\t_increment: function( i ) {\n\t\tvar incremental = this.options.incremental;\n\n\t\tif ( incremental ) {\n\t\t\treturn $.isFunction( incremental ) ?\n\t\t\t\tincremental( i ) :\n\t\t\t\tMath.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_adjustValue: function( value ) {\n\t\tvar base, aboveMin,\n\t\t\toptions = this.options;\n\n\t\t// Make sure we're at a valid step\n\t\t// - find out where we are relative to the base (min or 0)\n\t\tbase = options.min !== null ? options.min : 0;\n\t\taboveMin = value - base;\n\n\t\t// - round to the nearest step\n\t\taboveMin = Math.round( aboveMin / options.step ) * options.step;\n\n\t\t// - rounding is based on 0, so adjust back to our base\n\t\tvalue = base + aboveMin;\n\n\t\t// Fix precision from bad JS floating point math\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\n\n\t\t// Clamp the value\n\t\tif ( options.max !== null && value > options.max ) {\n\t\t\treturn options.max;\n\t\t}\n\t\tif ( options.min !== null && value < options.min ) {\n\t\t\treturn options.min;\n\t\t}\n\n\t\treturn value;\n\t},\n\n\t_stop: function( event ) {\n\t\tif ( !this.spinning ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( this.timer );\n\t\tclearTimeout( this.mousewheelTimer );\n\t\tthis.counter = 0;\n\t\tthis.spinning = false;\n\t\tthis._trigger( \"stop\", event );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar prevValue, first, last;\n\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\n\t\t\tprevValue = this._parse( this.element.val() );\n\t\t\tthis.options[ key ] = value;\n\t\t\tthis.element.val( this._format( prevValue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\n\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\tvalue = this._parse( value );\n\t\t\t}\n\t\t}\n\t\tif ( key === \"icons\" ) {\n\t\t\tfirst = this.buttons.first().find( \".ui-icon\" );\n\t\t\tthis._removeClass( first, null, this.options.icons.up );\n\t\t\tthis._addClass( first, null, value.up );\n\t\t\tlast = this.buttons.last().find( \".ui-icon\" );\n\t\t\tthis._removeClass( last, null, this.options.icons.down );\n\t\t\tthis._addClass( last, null, value.down );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis._toggleClass( this.uiSpinner, null, \"ui-state-disabled\", !!value );\n\t\tthis.element.prop( \"disabled\", !!value );\n\t\tthis.buttons.button( value ? \"disable\" : \"enable\" );\n\t},\n\n\t_setOptions: spinnerModifer( function( options ) {\n\t\tthis._super( options );\n\t} ),\n\n\t_parse: function( val ) {\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\n\t\t\tval = window.Globalize && this.options.numberFormat ?\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\n\t\t}\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\n\t},\n\n\t_format: function( value ) {\n\t\tif ( value === \"\" ) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn window.Globalize && this.options.numberFormat ?\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\n\t\t\tvalue;\n\t},\n\n\t_refresh: function() {\n\t\tthis.element.attr( {\n\t\t\t\"aria-valuemin\": this.options.min,\n\t\t\t\"aria-valuemax\": this.options.max,\n\n\t\t\t// TODO: what should we do with values that can't be parsed?\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\n\t\t} );\n\t},\n\n\tisValid: function() {\n\t\tvar value = this.value();\n\n\t\t// Null is invalid\n\t\tif ( value === null ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If value gets adjusted, it's invalid\n\t\treturn value === this._adjustValue( value );\n\t},\n\n\t// Update the value without triggering change\n\t_value: function( value, allowAny ) {\n\t\tvar parsed;\n\t\tif ( value !== \"\" ) {\n\t\t\tparsed = this._parse( value );\n\t\t\tif ( parsed !== null ) {\n\t\t\t\tif ( !allowAny ) {\n\t\t\t\t\tparsed = this._adjustValue( parsed );\n\t\t\t\t}\n\t\t\t\tvalue = this._format( parsed );\n\t\t\t}\n\t\t}\n\t\tthis.element.val( value );\n\t\tthis._refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.prop( \"disabled\", false )\n\t\t\t.removeAttr( \"autocomplete role aria-valuemin aria-valuemax aria-valuenow\" );\n\n\t\tthis.uiSpinner.replaceWith( this.element );\n\t},\n\n\tstepUp: spinnerModifer( function( steps ) {\n\t\tthis._stepUp( steps );\n\t} ),\n\t_stepUp: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tstepDown: spinnerModifer( function( steps ) {\n\t\tthis._stepDown( steps );\n\t} ),\n\t_stepDown: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * -this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tpageUp: spinnerModifer( function( pages ) {\n\t\tthis._stepUp( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tpageDown: spinnerModifer( function( pages ) {\n\t\tthis._stepDown( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tvalue: function( newVal ) {\n\t\tif ( !arguments.length ) {\n\t\t\treturn this._parse( this.element.val() );\n\t\t}\n\t\tspinnerModifer( this._value ).call( this, newVal );\n\t},\n\n\twidget: function() {\n\t\treturn this.uiSpinner;\n\t}\n} );\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for spinner html extension points\n\t$.widget( \"ui.spinner\", $.ui.spinner, {\n\t\t_enhance: function() {\n\t\t\tthis.uiSpinner = this.element\n\t\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t\t.wrap( this._uiSpinnerHtml() )\n\t\t\t\t.parent()\n\n\t\t\t\t\t// Add buttons\n\t\t\t\t\t.append( this._buttonHtml() );\n\t\t},\n\t\t_uiSpinnerHtml: function() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t_buttonHtml: function() {\n\t\t\treturn \"\";\n\t\t}\n\t} );\n}\n\nvar widgetsSpinner = $.ui.spinner;\n\n\n/*!\n * jQuery UI Tabs 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tabs\n//>>group: Widgets\n//>>description: Transforms a set of container elements into a tab structure.\n//>>docs: http://api.jqueryui.com/tabs/\n//>>demos: http://jqueryui.com/tabs/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tabs.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tabs\", {\n\tversion: \"1.12.1\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tclasses: {\n\t\t\t\"ui-tabs\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-nav\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-panel\": \"ui-corner-bottom\",\n\t\t\t\"ui-tabs-tab\": \"ui-corner-top\"\n\t\t},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_isLocal: ( function() {\n\t\tvar rhash = /#.*$/;\n\n\t\treturn function( anchor ) {\n\t\t\tvar anchorUrl, locationUrl;\n\n\t\t\tanchorUrl = anchor.href.replace( rhash, \"\" );\n\t\t\tlocationUrl = location.href.replace( rhash, \"\" );\n\n\t\t\t// Decoding may throw an error if the URL isn't UTF-8 (#9518)\n\t\t\ttry {\n\t\t\t\tanchorUrl = decodeURIComponent( anchorUrl );\n\t\t\t} catch ( error ) {}\n\t\t\ttry {\n\t\t\t\tlocationUrl = decodeURIComponent( locationUrl );\n\t\t\t} catch ( error ) {}\n\n\t\t\treturn anchor.hash.length > 1 && anchorUrl === locationUrl;\n\t\t};\n\t} )(),\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis._addClass( \"ui-tabs\", \"ui-widget ui-widget-content\" );\n\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, options.collapsible );\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t// Take disabling tabs via class attribute from HTML\n\t\t// into account and update option properly.\n\t\tif ( $.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t} )\n\t\t\t) ).sort();\n\t\t}\n\n\t\t// Check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\n\t\t\t// check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each( function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t// No active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t// Handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t// Don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\tvar focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.RIGHT:\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tselectedIndex++;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tgoingForward = false;\n\t\t\tselectedIndex--;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tselectedIndex = 0;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.SPACE:\n\n\t\t\t// Activate only, no collapsing\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\t\t\tthis._activate( selectedIndex );\n\t\t\treturn;\n\t\tcase $.ui.keyCode.ENTER:\n\n\t\t\t// Toggle (cancel delayed activation, allow collapsing)\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\n\t\t\t// Determine if we should collapse or activate\n\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\treturn;\n\t\tdefault:\n\t\t\treturn;\n\t\t}\n\n\t\t// Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t// Navigating with control/command key will prevent automatic activation\n\t\tif ( !event.ctrlKey && !event.metaKey ) {\n\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay( function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.trigger( \"focus\" );\n\t\t}\n\t},\n\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).trigger( \"focus\" );\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, value );\n\n\t\t\t// Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t// Get disabled tabs from class attribute from HTML\n\t\t// this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t} );\n\n\t\tthis._processTabs();\n\n\t\t// Was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\n\t\t// was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\n\t\t\t// all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\n\t\t\t// activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\n\t\t// was active, active tab still exists\n\t\t} else {\n\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setOptionDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\ttabIndex: -1\n\t\t} );\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr( {\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t} );\n\n\t\t// Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t} );\n\t\t\tthis._addClass( this.active, \"ui-tabs-active\", \"ui-state-active\" );\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this,\n\t\t\tprevTabs = this.tabs,\n\t\t\tprevAnchors = this.anchors,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.tablist = this._getList().attr( \"role\", \"tablist\" );\n\t\tthis._addClass( this.tablist, \"ui-tabs-nav\",\n\t\t\t\"ui-helper-reset ui-helper-clearfix ui-widget-header\" );\n\n\t\t// Prevent users from focusing disabled tabs via click\n\t\tthis.tablist\n\t\t\t.on( \"mousedown\" + this.eventNamespace, \"> li\", function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} )\n\n\t\t\t// Support: IE <9\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\n\t\t\t// We don't have to worry about focusing the previously focused\n\t\t\t// element since clicking on a non-focusable element should focus\n\t\t\t// the body anyway.\n\t\t\t.on( \"focus\" + this.eventNamespace, \".ui-tabs-anchor\", function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.tabs, \"ui-tabs-tab\", \"ui-state-default\" );\n\n\t\tthis.anchors = this.tabs.map( function() {\n\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t} )\n\t\t\t.attr( {\n\t\t\t\trole: \"presentation\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.anchors, \"ui-tabs-anchor\" );\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each( function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t// Inline tab\n\t\t\tif ( that._isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanelId = selector.substring( 1 );\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\n\t\t\t// remote tab\n\t\t\t} else {\n\n\t\t\t\t// If the tab doesn't already have aria-controls,\n\t\t\t\t// generate an id by using a throw-away element\n\t\t\t\tpanelId = tab.attr( \"aria-controls\" ) || $( {} ).uniqueId()[ 0 ].id;\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length ) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr( {\n\t\t\t\t\"aria-controls\": panelId,\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t} );\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t} );\n\n\t\tthis.panels.attr( \"role\", \"tabpanel\" );\n\t\tthis._addClass( this.panels, \"ui-tabs-panel\", \"ui-widget-content\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevTabs ) {\n\t\t\tthis._off( prevTabs.not( this.tabs ) );\n\t\t\tthis._off( prevAnchors.not( this.anchors ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t// Allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.tablist || this.element.find( \"ol, ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"
\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setOptionDisabled: function( disabled ) {\n\t\tvar currentItem, li, i;\n\n\t\tif ( $.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t// Disable tabs\n\t\tfor ( i = 0; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tcurrentItem = $( li );\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\tcurrentItem.attr( \"aria-disabled\", \"true\" );\n\t\t\t\tthis._addClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t} else {\n\t\t\t\tcurrentItem.removeAttr( \"aria-disabled\" );\n\t\t\t\tthis._removeClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null,\n\t\t\tdisabled === true );\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t} );\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\n\t\t// Always prevent the default action, even when disabled\n\t\tthis._on( true, this.anchors, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each( function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.element.children().not( this.panels ).each( function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.panels.each( function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t} )\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each( function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t} ).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\n\t\t\t\t// tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\n\t\t\t\t// can't switch durning an animation\n\t\t\t\tthis.running ||\n\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t// Handles show/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\tthat._addClass( eventData.newTab.closest( \"li\" ), \"ui-tabs-active\", \"ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t// Start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\tthat._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t} );\n\t\t} else {\n\t\t\tthis._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr( \"aria-hidden\", \"true\" );\n\t\teventData.oldTab.attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t} );\n\n\t\t// If we're switching tabs, remove the old tab from the tab order.\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter( function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t} )\n\t\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr( \"aria-hidden\", \"false\" );\n\t\teventData.newTab.attr( {\n\t\t\t\"aria-selected\": \"true\",\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\ttabIndex: 0\n\t\t} );\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t// Trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler( {\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t} );\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" +\n\t\t\t\t$.ui.escapeSelector( index ) + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.tablist\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.off( this.eventNamespace );\n\n\t\tthis.anchors\n\t\t\t.removeAttr( \"role tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tabs.add( this.panels ).each( function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this ).removeAttr( \"role tabIndex \" +\n\t\t\t\t\t\"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.tabs.each( function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t},\n\t\t\tcomplete = function( jqXHR, status ) {\n\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t}\n\n\t\t\t\tthat._removeClass( tab, \"ui-tabs-loading\" );\n\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\tdelete that.xhr;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Not remote\n\t\tif ( this._isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t// Support: jQuery <1.8\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\tthis._addClass( tab, \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.done( function( response, status, jqXHR ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} )\n\t\t\t\t.fail( function( jqXHR, status ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\n\t\t\t// Support: IE <11 only\n\t\t\t// Strip any hash that exists to prevent errors with the Ajax request\n\t\t\turl: anchor.attr( \"href\" ).replace( /#.*$/, \"\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for ui-tab class (now ui-tabs-tab)\n\t$.widget( \"ui.tabs\", $.ui.tabs, {\n\t\t_processTabs: function() {\n\t\t\tthis._superApply( arguments );\n\t\t\tthis._addClass( this.tabs, \"ui-tab\" );\n\t\t}\n\t} );\n}\n\nvar widgetsTabs = $.ui.tabs;\n\n\n/*!\n * jQuery UI Tooltip 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tooltip\n//>>group: Widgets\n//>>description: Shows additional information for any element on hover or focus.\n//>>docs: http://api.jqueryui.com/tooltip/\n//>>demos: http://jqueryui.com/tooltip/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tooltip.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tooltip\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-tooltip\": \"ui-corner-all ui-widget-shadow\"\n\t\t},\n\t\tcontent: function() {\n\n\t\t\t// support: IE<9, Opera in jQuery <1.7\n\t\t\t// .text() can't accept undefined, so coerce to a string\n\t\t\tvar title = $( this ).attr( \"title\" ) || \"\";\n\n\t\t\t// Escape title, since we're going from an attribute to raw HTML\n\t\t\treturn $( \"\" ).text( title ).html();\n\t\t},\n\t\thide: true,\n\n\t\t// Disabled elements have inconsistent behavior across browsers (#8661)\n\t\titems: \"[title]:not([disabled])\",\n\t\tposition: {\n\t\t\tmy: \"left top+15\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"flipfit flip\"\n\t\t},\n\t\tshow: true,\n\t\ttrack: false,\n\n\t\t// Callbacks\n\t\tclose: null,\n\t\topen: null\n\t},\n\n\t_addDescribedBy: function( elem, id ) {\n\t\tvar describedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ );\n\t\tdescribedby.push( id );\n\t\telem\n\t\t\t.data( \"ui-tooltip-id\", id )\n\t\t\t.attr( \"aria-describedby\", $.trim( describedby.join( \" \" ) ) );\n\t},\n\n\t_removeDescribedBy: function( elem ) {\n\t\tvar id = elem.data( \"ui-tooltip-id\" ),\n\t\t\tdescribedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ ),\n\t\t\tindex = $.inArray( id, describedby );\n\n\t\tif ( index !== -1 ) {\n\t\t\tdescribedby.splice( index, 1 );\n\t\t}\n\n\t\telem.removeData( \"ui-tooltip-id\" );\n\t\tdescribedby = $.trim( describedby.join( \" \" ) );\n\t\tif ( describedby ) {\n\t\t\telem.attr( \"aria-describedby\", describedby );\n\t\t} else {\n\t\t\telem.removeAttr( \"aria-describedby\" );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._on( {\n\t\t\tmouseover: \"open\",\n\t\t\tfocusin: \"open\"\n\t\t} );\n\n\t\t// IDs of generated tooltips, needed for destroy\n\t\tthis.tooltips = {};\n\n\t\t// IDs of parent tooltips where we removed the title attribute\n\t\tthis.parents = {};\n\n\t\t// Append the aria-live region so tooltips announce correctly\n\t\tthis.liveRegion = $( \"
\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"log\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t} )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\t\tthis._addClass( this.liveRegion, null, \"ui-helper-hidden-accessible\" );\n\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar that = this;\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"content\" ) {\n\t\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t\tthat._updateContent( tooltipData.element );\n\t\t\t} );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\n\t},\n\n\t_disable: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = tooltipData.element[ 0 ];\n\t\t\tthat.close( event, true );\n\t\t} );\n\n\t\t// Remove title attributes to prevent native tooltips\n\t\tthis.disabledTitles = this.disabledTitles.add(\n\t\t\tthis.element.find( this.options.items ).addBack()\n\t\t\t\t.filter( function() {\n\t\t\t\t\tvar element = $( this );\n\t\t\t\t\tif ( element.is( \"[title]\" ) ) {\n\t\t\t\t\t\treturn element\n\t\t\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\n\t\t\t\t\t\t\t.removeAttr( \"title\" );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t);\n\t},\n\n\t_enable: function() {\n\n\t\t// restore title attributes\n\t\tthis.disabledTitles.each( function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t}\n\t\t} );\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\topen: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.target : this.element )\n\n\t\t\t\t// we need closest here due to mouseover bubbling,\n\t\t\t\t// but always pointing at the same event target\n\t\t\t\t.closest( this.options.items );\n\n\t\t// No element to show a tooltip for or the tooltip is already open\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( target.attr( \"title\" ) ) {\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\n\t\t}\n\n\t\ttarget.data( \"ui-tooltip-open\", true );\n\n\t\t// Kill parent tooltips, custom or native, for hover\n\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\ttarget.parents().each( function() {\n\t\t\t\tvar parent = $( this ),\n\t\t\t\t\tblurEvent;\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\n\t\t\t\t\tthat.close( blurEvent, true );\n\t\t\t\t}\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\n\t\t\t\t\tparent.uniqueId();\n\t\t\t\t\tthat.parents[ this.id ] = {\n\t\t\t\t\t\telement: this,\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\n\t\t\t\t\t};\n\t\t\t\t\tparent.attr( \"title\", \"\" );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis._registerCloseHandlers( event, target );\n\t\tthis._updateContent( target, event );\n\t},\n\n\t_updateContent: function( target, event ) {\n\t\tvar content,\n\t\t\tcontentOption = this.options.content,\n\t\t\tthat = this,\n\t\t\teventType = event ? event.type : null;\n\n\t\tif ( typeof contentOption === \"string\" || contentOption.nodeType ||\n\t\t\t\tcontentOption.jquery ) {\n\t\t\treturn this._open( event, target, contentOption );\n\t\t}\n\n\t\tcontent = contentOption.call( target[ 0 ], function( response ) {\n\n\t\t\t// IE may instantly serve a cached response for ajax requests\n\t\t\t// delay this call to _open so the other call to _open runs first\n\t\t\tthat._delay( function() {\n\n\t\t\t\t// Ignore async response if tooltip was closed already\n\t\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// JQuery creates a special event for focusin when it doesn't\n\t\t\t\t// exist natively. To improve performance, the native event\n\t\t\t\t// object is reused and the type is changed. Therefore, we can't\n\t\t\t\t// rely on the type being correct after the event finished\n\t\t\t\t// bubbling, so we set it back to the previous value. (#8740)\n\t\t\t\tif ( event ) {\n\t\t\t\t\tevent.type = eventType;\n\t\t\t\t}\n\t\t\t\tthis._open( event, target, response );\n\t\t\t} );\n\t\t} );\n\t\tif ( content ) {\n\t\t\tthis._open( event, target, content );\n\t\t}\n\t},\n\n\t_open: function( event, target, content ) {\n\t\tvar tooltipData, tooltip, delayedShow, a11yContent,\n\t\t\tpositionOption = $.extend( {}, this.options.position );\n\n\t\tif ( !content ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Content can be updated multiple times. If the tooltip already\n\t\t// exists, then just update the content and bail.\n\t\ttooltipData = this._find( target );\n\t\tif ( tooltipData ) {\n\t\t\ttooltipData.tooltip.find( \".ui-tooltip-content\" ).html( content );\n\t\t\treturn;\n\t\t}\n\n\t\t// If we have a title, clear it to prevent the native tooltip\n\t\t// we have to check first to avoid defining a title if none exists\n\t\t// (we don't want to cause an element to start matching [title])\n\t\t//\n\t\t// We use removeAttr only for key events, to allow IE to export the correct\n\t\t// accessible attributes. For mouse events, set to empty string to avoid\n\t\t// native tooltip showing up (happens only when removing inside mouseover).\n\t\tif ( target.is( \"[title]\" ) ) {\n\t\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\t\ttarget.attr( \"title\", \"\" );\n\t\t\t} else {\n\t\t\t\ttarget.removeAttr( \"title\" );\n\t\t\t}\n\t\t}\n\n\t\ttooltipData = this._tooltip( target );\n\t\ttooltip = tooltipData.tooltip;\n\t\tthis._addDescribedBy( target, tooltip.attr( \"id\" ) );\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\n\t\t// Support: Voiceover on OS X, JAWS on IE <= 9\n\t\t// JAWS announces deletions even when aria-relevant=\"additions\"\n\t\t// Voiceover will sometimes re-read the entire log region's contents from the beginning\n\t\tthis.liveRegion.children().hide();\n\t\ta11yContent = $( \"
\" ).html( tooltip.find( \".ui-tooltip-content\" ).html() );\n\t\ta11yContent.removeAttr( \"name\" ).find( \"[name]\" ).removeAttr( \"name\" );\n\t\ta11yContent.removeAttr( \"id\" ).find( \"[id]\" ).removeAttr( \"id\" );\n\t\ta11yContent.appendTo( this.liveRegion );\n\n\t\tfunction position( event ) {\n\t\t\tpositionOption.of = event;\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttooltip.position( positionOption );\n\t\t}\n\t\tif ( this.options.track && event && /^mouse/.test( event.type ) ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\tmousemove: position\n\t\t\t} );\n\n\t\t\t// trigger once to override element-relative positioning\n\t\t\tposition( event );\n\t\t} else {\n\t\t\ttooltip.position( $.extend( {\n\t\t\t\tof: target\n\t\t\t}, this.options.position ) );\n\t\t}\n\n\t\ttooltip.hide();\n\n\t\tthis._show( tooltip, this.options.show );\n\n\t\t// Handle tracking tooltips that are shown with a delay (#8644). As soon\n\t\t// as the tooltip is visible, position the tooltip using the most recent\n\t\t// event.\n\t\t// Adds the check to add the timers only when both delay and track options are set (#14682)\n\t\tif ( this.options.track && this.options.show && this.options.show.delay ) {\n\t\t\tdelayedShow = this.delayedShow = setInterval( function() {\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\n\t\t\t\t\tposition( positionOption.of );\n\t\t\t\t\tclearInterval( delayedShow );\n\t\t\t\t}\n\t\t\t}, $.fx.interval );\n\t\t}\n\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\n\t},\n\n\t_registerCloseHandlers: function( event, target ) {\n\t\tvar events = {\n\t\t\tkeyup: function( event ) {\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tvar fakeEvent = $.Event( event );\n\t\t\t\t\tfakeEvent.currentTarget = target[ 0 ];\n\t\t\t\t\tthis.close( fakeEvent, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Only bind remove handler for delegated targets. Non-delegated\n\t\t// tooltips will handle this in destroy.\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tevents.remove = function() {\n\t\t\t\tthis._removeTooltip( this._find( target ).tooltip );\n\t\t\t};\n\t\t}\n\n\t\tif ( !event || event.type === \"mouseover\" ) {\n\t\t\tevents.mouseleave = \"close\";\n\t\t}\n\t\tif ( !event || event.type === \"focusin\" ) {\n\t\t\tevents.focusout = \"close\";\n\t\t}\n\t\tthis._on( true, target, events );\n\t},\n\n\tclose: function( event ) {\n\t\tvar tooltip,\n\t\t\tthat = this,\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\n\t\t\ttooltipData = this._find( target );\n\n\t\t// The tooltip may already be closed\n\t\tif ( !tooltipData ) {\n\n\t\t\t// We set ui-tooltip-open immediately upon open (in open()), but only set the\n\t\t\t// additional data once there's actually content to show (in _open()). So even if the\n\t\t\t// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\n\t\t\t// the period between open() and _open().\n\t\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\t\treturn;\n\t\t}\n\n\t\ttooltip = tooltipData.tooltip;\n\n\t\t// Disabling closes the tooltip, so we need to track when we're closing\n\t\t// to avoid an infinite loop in case the tooltip becomes disabled on close\n\t\tif ( tooltipData.closing ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\t// Only set title if we had one before (see comment in _open())\n\t\t// If the title attribute has changed since open(), don't restore\n\t\tif ( target.data( \"ui-tooltip-title\" ) && !target.attr( \"title\" ) ) {\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\n\t\t}\n\n\t\tthis._removeDescribedBy( target );\n\n\t\ttooltipData.hiding = true;\n\t\ttooltip.stop( true );\n\t\tthis._hide( tooltip, this.options.hide, function() {\n\t\t\tthat._removeTooltip( $( this ) );\n\t\t} );\n\n\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\n\n\t\t// Remove 'remove' binding only on delegated targets\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tthis._off( target, \"remove\" );\n\t\t}\n\t\tthis._off( this.document, \"mousemove\" );\n\n\t\tif ( event && event.type === \"mouseleave\" ) {\n\t\t\t$.each( this.parents, function( id, parent ) {\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\n\t\t\t\tdelete that.parents[ id ];\n\t\t\t} );\n\t\t}\n\n\t\ttooltipData.closing = true;\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\n\t\tif ( !tooltipData.hiding ) {\n\t\t\ttooltipData.closing = false;\n\t\t}\n\t},\n\n\t_tooltip: function( element ) {\n\t\tvar tooltip = $( \"
\" ).attr( \"role\", \"tooltip\" ),\n\t\t\tcontent = $( \"
\" ).appendTo( tooltip ),\n\t\t\tid = tooltip.uniqueId().attr( \"id\" );\n\n\t\tthis._addClass( content, \"ui-tooltip-content\" );\n\t\tthis._addClass( tooltip, \"ui-tooltip\", \"ui-widget ui-widget-content\" );\n\n\t\ttooltip.appendTo( this._appendTo( element ) );\n\n\t\treturn this.tooltips[ id ] = {\n\t\t\telement: element,\n\t\t\ttooltip: tooltip\n\t\t};\n\t},\n\n\t_find: function( target ) {\n\t\tvar id = target.data( \"ui-tooltip-id\" );\n\t\treturn id ? this.tooltips[ id ] : null;\n\t},\n\n\t_removeTooltip: function( tooltip ) {\n\t\ttooltip.remove();\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\n\t},\n\n\t_appendTo: function( target ) {\n\t\tvar element = target.closest( \".ui-front, dialog\" );\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_destroy: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\n\t\t\t// Delegate to close method to handle common cleanup\n\t\t\tvar event = $.Event( \"blur\" ),\n\t\t\t\telement = tooltipData.element;\n\t\t\tevent.target = event.currentTarget = element[ 0 ];\n\t\t\tthat.close( event, true );\n\n\t\t\t// Remove immediately; destroying an open tooltip doesn't use the\n\t\t\t// hide animation\n\t\t\t$( \"#\" + id ).remove();\n\n\t\t\t// Restore the title\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\n\t\t\t\t// If the title attribute has changed since open(), don't restore\n\t\t\t\tif ( !element.attr( \"title\" ) ) {\n\t\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t\t}\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\n\t\t\t}\n\t\t} );\n\t\tthis.liveRegion.remove();\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for tooltipClass option\n\t$.widget( \"ui.tooltip\", $.ui.tooltip, {\n\t\toptions: {\n\t\t\ttooltipClass: null\n\t\t},\n\t\t_tooltip: function() {\n\t\t\tvar tooltipData = this._superApply( arguments );\n\t\t\tif ( this.options.tooltipClass ) {\n\t\t\t\ttooltipData.tooltip.addClass( this.options.tooltipClass );\n\t\t\t}\n\t\t\treturn tooltipData;\n\t\t}\n\t} );\n}\n\nvar widgetsTooltip = $.ui.tooltip;\n\n\n\n\n}));","/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)\n * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)\n * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\n *\n * Version: 1.3.8\n *\n */\n(function($) {\n\n $.fn.extend({\n slimScroll: function(options) {\n\n var defaults = {\n\n // width in pixels of the visible scroll area\n width : 'auto',\n\n // height in pixels of the visible scroll area\n height : '250px',\n\n // width in pixels of the scrollbar and rail\n size : '7px',\n\n // scrollbar color, accepts any hex/color value\n color: '#000',\n\n // scrollbar position - left/right\n position : 'right',\n\n // distance in pixels between the side edge and the scrollbar\n distance : '1px',\n\n // default scroll position on load - top / bottom / $('selector')\n start : 'top',\n\n // sets scrollbar opacity\n opacity : .4,\n\n // enables always-on mode for the scrollbar\n alwaysVisible : false,\n\n // check if we should hide the scrollbar when user is hovering over\n disableFadeOut : false,\n\n // sets visibility of the rail\n railVisible : false,\n\n // sets rail color\n railColor : '#333',\n\n // sets rail opacity\n railOpacity : .2,\n\n // whether we should use jQuery UI Draggable to enable bar dragging\n railDraggable : true,\n\n // defautlt CSS class of the slimscroll rail\n railClass : 'slimScrollRail',\n\n // defautlt CSS class of the slimscroll bar\n barClass : 'slimScrollBar',\n\n // defautlt CSS class of the slimscroll wrapper\n wrapperClass : 'slimScrollDiv',\n\n // check if mousewheel should scroll the window if we reach top/bottom\n allowPageScroll : false,\n\n // scroll amount applied to each mouse wheel step\n wheelStep : 20,\n\n // scroll amount applied when user is using gestures\n touchScrollStep : 200,\n\n // sets border radius\n borderRadius: '7px',\n\n // sets border radius of the rail\n railBorderRadius : '7px'\n };\n\n var o = $.extend(defaults, options);\n\n // do it for every element that matches selector\n this.each(function(){\n\n var isOverPanel, isOverBar, isDragg, queueHide, touchDif,\n barHeight, percentScroll, lastScroll,\n divS = '
',\n minBarHeight = 30,\n releaseScroll = false;\n\n // used in event handlers and for better minification\n var me = $(this);\n\n // ensure we are not binding it again\n if (me.parent().hasClass(o.wrapperClass))\n {\n // start from last bar position\n var offset = me.scrollTop();\n\n // find bar and rail\n bar = me.siblings('.' + o.barClass);\n rail = me.siblings('.' + o.railClass);\n\n getBarHeight();\n\n // check if we should scroll existing instance\n if ($.isPlainObject(options))\n {\n // Pass height: auto to an existing slimscroll object to force a resize after contents have changed\n if ( 'height' in options && options.height == 'auto' ) {\n me.parent().css('height', 'auto');\n me.css('height', 'auto');\n var height = me.parent().parent().height();\n me.parent().css('height', height);\n me.css('height', height);\n } else if ('height' in options) {\n var h = options.height;\n me.parent().css('height', h);\n me.css('height', h);\n }\n\n if ('scrollTo' in options)\n {\n // jump to a static point\n offset = parseInt(o.scrollTo);\n }\n else if ('scrollBy' in options)\n {\n // jump by value pixels\n offset += parseInt(o.scrollBy);\n }\n else if ('destroy' in options)\n {\n // remove slimscroll elements\n bar.remove();\n rail.remove();\n me.unwrap();\n return;\n }\n\n // scroll content by the given offset\n scrollContent(offset, false, true);\n }\n\n return;\n }\n else if ($.isPlainObject(options))\n {\n if ('destroy' in options)\n {\n \treturn;\n }\n }\n\n // optionally set height to the parent's height\n o.height = (o.height == 'auto') ? me.parent().height() : o.height;\n\n // wrap content\n var wrapper = $(divS)\n .addClass(o.wrapperClass)\n .css({\n position: 'relative',\n overflow: 'hidden',\n width: o.width,\n height: o.height\n });\n\n // update style for the div\n me.css({\n overflow: 'hidden',\n width: o.width,\n height: o.height\n });\n\n // create scrollbar rail\n var rail = $(divS)\n .addClass(o.railClass)\n .css({\n width: o.size,\n height: '100%',\n position: 'absolute',\n top: 0,\n display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',\n 'border-radius': o.railBorderRadius,\n background: o.railColor,\n opacity: o.railOpacity,\n zIndex: 90\n });\n\n // create scrollbar\n var bar = $(divS)\n .addClass(o.barClass)\n .css({\n background: o.color,\n width: o.size,\n position: 'absolute',\n top: 0,\n opacity: o.opacity,\n display: o.alwaysVisible ? 'block' : 'none',\n 'border-radius' : o.borderRadius,\n BorderRadius: o.borderRadius,\n MozBorderRadius: o.borderRadius,\n WebkitBorderRadius: o.borderRadius,\n zIndex: 99\n });\n\n // set position\n var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance };\n rail.css(posCss);\n bar.css(posCss);\n\n // wrap it\n me.wrap(wrapper);\n\n // append to parent div\n me.parent().append(bar);\n me.parent().append(rail);\n\n // make it draggable and no longer dependent on the jqueryUI\n if (o.railDraggable){\n bar.bind(\"mousedown\", function(e) {\n var $doc = $(document);\n isDragg = true;\n t = parseFloat(bar.css('top'));\n pageY = e.pageY;\n\n $doc.bind(\"mousemove.slimscroll\", function(e){\n currTop = t + e.pageY - pageY;\n bar.css('top', currTop);\n scrollContent(0, bar.position().top, false);// scroll content\n });\n\n $doc.bind(\"mouseup.slimscroll\", function(e) {\n isDragg = false;hideBar();\n $doc.unbind('.slimscroll');\n });\n return false;\n }).bind(\"selectstart.slimscroll\", function(e){\n e.stopPropagation();\n e.preventDefault();\n return false;\n });\n }\n\n // on rail over\n rail.hover(function(){\n showBar();\n }, function(){\n hideBar();\n });\n\n // on bar over\n bar.hover(function(){\n isOverBar = true;\n }, function(){\n isOverBar = false;\n });\n\n // show on parent mouseover\n me.hover(function(){\n isOverPanel = true;\n showBar();\n hideBar();\n }, function(){\n isOverPanel = false;\n hideBar();\n });\n\n // support for mobile\n me.bind('touchstart', function(e,b){\n if (e.originalEvent.touches.length)\n {\n // record where touch started\n touchDif = e.originalEvent.touches[0].pageY;\n }\n });\n\n me.bind('touchmove', function(e){\n // prevent scrolling the page if necessary\n if(!releaseScroll)\n {\n \t\t e.originalEvent.preventDefault();\n\t\t }\n if (e.originalEvent.touches.length)\n {\n // see how far user swiped\n var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;\n // scroll content\n scrollContent(diff, true);\n touchDif = e.originalEvent.touches[0].pageY;\n }\n });\n\n // set up initial height\n getBarHeight();\n\n // check start position\n if (o.start === 'bottom')\n {\n // scroll content to bottom\n bar.css({ top: me.outerHeight() - bar.outerHeight() });\n scrollContent(0, true);\n }\n else if (o.start !== 'top')\n {\n // assume jQuery selector\n scrollContent($(o.start).position().top, null, true);\n\n // make sure bar stays hidden\n if (!o.alwaysVisible) { bar.hide(); }\n }\n\n // attach scroll events\n attachWheel(this);\n\n function _onWheel(e)\n {\n // use mouse wheel only when mouse is over\n if (!isOverPanel) { return; }\n\n var e = e || window.event;\n\n var delta = 0;\n if (e.wheelDelta) { delta = -e.wheelDelta/120; }\n if (e.detail) { delta = e.detail / 3; }\n\n var target = e.target || e.srcTarget || e.srcElement;\n if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {\n // scroll content\n scrollContent(delta, true);\n }\n\n // stop window scroll\n if (e.preventDefault && !releaseScroll) { e.preventDefault(); }\n if (!releaseScroll) { e.returnValue = false; }\n }\n\n function scrollContent(y, isWheel, isJump)\n {\n releaseScroll = false;\n var delta = y;\n var maxTop = me.outerHeight() - bar.outerHeight();\n\n if (isWheel)\n {\n // move bar with mouse wheel\n delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();\n\n // move bar, make sure it doesn't go out\n delta = Math.min(Math.max(delta, 0), maxTop);\n\n // if scrolling down, make sure a fractional change to the\n // scroll position isn't rounded away when the scrollbar's CSS is set\n // this flooring of delta would happened automatically when\n // bar.css is set below, but we floor here for clarity\n delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);\n\n // scroll the scrollbar\n bar.css({ top: delta + 'px' });\n }\n\n // calculate actual scroll amount\n percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());\n delta = percentScroll * (me[0].scrollHeight - me.outerHeight());\n\n if (isJump)\n {\n delta = y;\n var offsetTop = delta / me[0].scrollHeight * me.outerHeight();\n offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);\n bar.css({ top: offsetTop + 'px' });\n }\n\n // scroll content\n me.scrollTop(delta);\n\n // fire scrolling event\n me.trigger('slimscrolling', ~~delta);\n\n // ensure bar is visible\n showBar();\n\n // trigger hide when scroll is stopped\n hideBar();\n }\n\n function attachWheel(target)\n {\n if (window.addEventListener)\n {\n target.addEventListener('DOMMouseScroll', _onWheel, false );\n target.addEventListener('mousewheel', _onWheel, false );\n }\n else\n {\n document.attachEvent(\"onmousewheel\", _onWheel)\n }\n }\n\n function getBarHeight()\n {\n // calculate scrollbar height and make sure it is not too small\n barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);\n bar.css({ height: barHeight + 'px' });\n\n // hide scrollbar if content is not long enough\n var display = barHeight == me.outerHeight() ? 'none' : 'block';\n bar.css({ display: display });\n }\n\n function showBar()\n {\n // recalculate bar height\n getBarHeight();\n clearTimeout(queueHide);\n\n // when bar reached top or bottom\n if (percentScroll == ~~percentScroll)\n {\n //release wheel\n releaseScroll = o.allowPageScroll;\n\n // publish approporiate event\n if (lastScroll != percentScroll)\n {\n var msg = (~~percentScroll == 0) ? 'top' : 'bottom';\n me.trigger('slimscroll', msg);\n }\n }\n else\n {\n releaseScroll = false;\n }\n lastScroll = percentScroll;\n\n // show only when required\n if(barHeight >= me.outerHeight()) {\n //allow window scroll\n releaseScroll = true;\n return;\n }\n bar.stop(true,true).fadeIn('fast');\n if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); }\n }\n\n function hideBar()\n {\n // only hide when options allow it\n if (!o.alwaysVisible)\n {\n queueHide = setTimeout(function(){\n if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)\n {\n bar.fadeOut('slow');\n rail.fadeOut('slow');\n }\n }, 1000);\n }\n }\n\n });\n\n // maintain chainability\n return this;\n }\n });\n\n $.fn.extend({\n slimscroll: $.fn.slimScroll\n });\n\n})(jQuery);\n","// This [jQuery](https://jquery.com/) plugin implements an `\");\n\n // The first load event gets fired after the iframe has been injected\n // into the DOM, and is used to prepare the actual submission.\n iframe.one(\"load\", function() {\n\n // The second load event gets fired when the response to the form\n // submission is received. The implementation detects whether the\n // actual payload is embedded in a `\\\";\\n\\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\\n} )();\\nvar documentElement = document.documentElement;\\n\\n\\n\\nvar\\n\\trkeyEvent = /^key/,\\n\\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\\n\\trtypenamespace = /^([^.]*)(?:\\\\.(.+)|)/;\\n\\nfunction returnTrue() {\\n\\treturn true;\\n}\\n\\nfunction returnFalse() {\\n\\treturn false;\\n}\\n\\n// Support: IE <=9 only\\n// See #13393 for more info\\nfunction safeActiveElement() {\\n\\ttry {\\n\\t\\treturn document.activeElement;\\n\\t} catch ( err ) { }\\n}\\n\\nfunction on( elem, types, selector, data, fn, one ) {\\n\\tvar origFn, type;\\n\\n\\t// Types can be a map of types/handlers\\n\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t// ( types-Object, selector, data )\\n\\t\\tif ( typeof selector !== \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types-Object, data )\\n\\t\\t\\tdata = data || selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tfor ( type in types ) {\\n\\t\\t\\ton( elem, type, selector, data, types[ type ], one );\\n\\t\\t}\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( data == null && fn == null ) {\\n\\n\\t\\t// ( types, fn )\\n\\t\\tfn = selector;\\n\\t\\tdata = selector = undefined;\\n\\t} else if ( fn == null ) {\\n\\t\\tif ( typeof selector === \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types, selector, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t} else {\\n\\n\\t\\t\\t// ( types, data, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t}\\n\\tif ( fn === false ) {\\n\\t\\tfn = returnFalse;\\n\\t} else if ( !fn ) {\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( one === 1 ) {\\n\\t\\torigFn = fn;\\n\\t\\tfn = function( event ) {\\n\\n\\t\\t\\t// Can use an empty set, since event contains the info\\n\\t\\t\\tjQuery().off( event );\\n\\t\\t\\treturn origFn.apply( this, arguments );\\n\\t\\t};\\n\\n\\t\\t// Use same guid so caller can remove using origFn\\n\\t\\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\\n\\t}\\n\\treturn elem.each( function() {\\n\\t\\tjQuery.event.add( this, types, fn, data, selector );\\n\\t} );\\n}\\n\\n/*\\n * Helper functions for managing events -- not part of the public interface.\\n * Props to Dean Edwards' addEvent library for many of the ideas.\\n */\\njQuery.event = {\\n\\n\\tglobal: {},\\n\\n\\tadd: function( elem, types, handler, data, selector ) {\\n\\n\\t\\tvar handleObjIn, eventHandle, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.get( elem );\\n\\n\\t\\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\\n\\t\\tif ( !elemData ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Caller can pass in an object of custom data in lieu of the handler\\n\\t\\tif ( handler.handler ) {\\n\\t\\t\\thandleObjIn = handler;\\n\\t\\t\\thandler = handleObjIn.handler;\\n\\t\\t\\tselector = handleObjIn.selector;\\n\\t\\t}\\n\\n\\t\\t// Ensure that invalid selectors throw exceptions at attach time\\n\\t\\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\\n\\t\\tif ( selector ) {\\n\\t\\t\\tjQuery.find.matchesSelector( documentElement, selector );\\n\\t\\t}\\n\\n\\t\\t// Make sure that the handler has a unique ID, used to find/remove it later\\n\\t\\tif ( !handler.guid ) {\\n\\t\\t\\thandler.guid = jQuery.guid++;\\n\\t\\t}\\n\\n\\t\\t// Init the element's event structure and main handler, if this is the first\\n\\t\\tif ( !( events = elemData.events ) ) {\\n\\t\\t\\tevents = elemData.events = {};\\n\\t\\t}\\n\\t\\tif ( !( eventHandle = elemData.handle ) ) {\\n\\t\\t\\teventHandle = elemData.handle = function( e ) {\\n\\n\\t\\t\\t\\t// Discard the second event of a jQuery.event.trigger() and\\n\\t\\t\\t\\t// when an event is called after a page has unloaded\\n\\t\\t\\t\\treturn typeof jQuery !== \\\"undefined\\\" && jQuery.event.triggered !== e.type ?\\n\\t\\t\\t\\t\\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\\n\\t\\t\\t};\\n\\t\\t}\\n\\n\\t\\t// Handle multiple events separated by a space\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// There *must* be a type, no attaching namespace-only handlers\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If event changes its type, use the special event handlers for the changed type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// If selector defined, determine special event api type, otherwise given type\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\n\\t\\t\\t// Update special based on newly reset type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// handleObj is passed to all event handlers\\n\\t\\t\\thandleObj = jQuery.extend( {\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\torigType: origType,\\n\\t\\t\\t\\tdata: data,\\n\\t\\t\\t\\thandler: handler,\\n\\t\\t\\t\\tguid: handler.guid,\\n\\t\\t\\t\\tselector: selector,\\n\\t\\t\\t\\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\\n\\t\\t\\t\\tnamespace: namespaces.join( \\\".\\\" )\\n\\t\\t\\t}, handleObjIn );\\n\\n\\t\\t\\t// Init the event handler queue if we're the first\\n\\t\\t\\tif ( !( handlers = events[ type ] ) ) {\\n\\t\\t\\t\\thandlers = events[ type ] = [];\\n\\t\\t\\t\\thandlers.delegateCount = 0;\\n\\n\\t\\t\\t\\t// Only use addEventListener if the special events handler returns false\\n\\t\\t\\t\\tif ( !special.setup ||\\n\\t\\t\\t\\t\\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\\n\\n\\t\\t\\t\\t\\tif ( elem.addEventListener ) {\\n\\t\\t\\t\\t\\t\\telem.addEventListener( type, eventHandle );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( special.add ) {\\n\\t\\t\\t\\tspecial.add.call( elem, handleObj );\\n\\n\\t\\t\\t\\tif ( !handleObj.handler.guid ) {\\n\\t\\t\\t\\t\\thandleObj.handler.guid = handler.guid;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add to the element's handler list, delegates in front\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\thandlers.splice( handlers.delegateCount++, 0, handleObj );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\thandlers.push( handleObj );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Keep track of which events have ever been used, for event optimization\\n\\t\\t\\tjQuery.event.global[ type ] = true;\\n\\t\\t}\\n\\n\\t},\\n\\n\\t// Detach an event or set of events from an element\\n\\tremove: function( elem, types, handler, selector, mappedTypes ) {\\n\\n\\t\\tvar j, origCount, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\\n\\n\\t\\tif ( !elemData || !( events = elemData.events ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Once for each type.namespace in types; type may be omitted\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// Unbind all events (on this namespace, if provided) for the element\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\t\\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\t\\t\\thandlers = events[ type ] || [];\\n\\t\\t\\ttmp = tmp[ 2 ] &&\\n\\t\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" );\\n\\n\\t\\t\\t// Remove matching events\\n\\t\\t\\torigCount = j = handlers.length;\\n\\t\\t\\twhile ( j-- ) {\\n\\t\\t\\t\\thandleObj = handlers[ j ];\\n\\n\\t\\t\\t\\tif ( ( mappedTypes || origType === handleObj.origType ) &&\\n\\t\\t\\t\\t\\t( !handler || handler.guid === handleObj.guid ) &&\\n\\t\\t\\t\\t\\t( !tmp || tmp.test( handleObj.namespace ) ) &&\\n\\t\\t\\t\\t\\t( !selector || selector === handleObj.selector ||\\n\\t\\t\\t\\t\\t\\tselector === \\\"**\\\" && handleObj.selector ) ) {\\n\\t\\t\\t\\t\\thandlers.splice( j, 1 );\\n\\n\\t\\t\\t\\t\\tif ( handleObj.selector ) {\\n\\t\\t\\t\\t\\t\\thandlers.delegateCount--;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( special.remove ) {\\n\\t\\t\\t\\t\\t\\tspecial.remove.call( elem, handleObj );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Remove generic event handler if we removed something and no more handlers exist\\n\\t\\t\\t// (avoids potential for endless recursion during removal of special event handlers)\\n\\t\\t\\tif ( origCount && !handlers.length ) {\\n\\t\\t\\t\\tif ( !special.teardown ||\\n\\t\\t\\t\\t\\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\\n\\n\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, elemData.handle );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tdelete events[ type ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Remove data and the expando if it's no longer used\\n\\t\\tif ( jQuery.isEmptyObject( events ) ) {\\n\\t\\t\\tdataPriv.remove( elem, \\\"handle events\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tdispatch: function( nativeEvent ) {\\n\\n\\t\\t// Make a writable jQuery.Event from the native event object\\n\\t\\tvar event = jQuery.event.fix( nativeEvent );\\n\\n\\t\\tvar i, j, ret, matched, handleObj, handlerQueue,\\n\\t\\t\\targs = new Array( arguments.length ),\\n\\t\\t\\thandlers = ( dataPriv.get( this, \\\"events\\\" ) || {} )[ event.type ] || [],\\n\\t\\t\\tspecial = jQuery.event.special[ event.type ] || {};\\n\\n\\t\\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\\n\\t\\targs[ 0 ] = event;\\n\\n\\t\\tfor ( i = 1; i < arguments.length; i++ ) {\\n\\t\\t\\targs[ i ] = arguments[ i ];\\n\\t\\t}\\n\\n\\t\\tevent.delegateTarget = this;\\n\\n\\t\\t// Call the preDispatch hook for the mapped type, and let it bail if desired\\n\\t\\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine handlers\\n\\t\\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\\n\\n\\t\\t// Run delegates first; they may want to stop propagation beneath us\\n\\t\\ti = 0;\\n\\t\\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\t\\t\\tevent.currentTarget = matched.elem;\\n\\n\\t\\t\\tj = 0;\\n\\t\\t\\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\\n\\t\\t\\t\\t!event.isImmediatePropagationStopped() ) {\\n\\n\\t\\t\\t\\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\\n\\t\\t\\t\\t// a subset or equal to those in the bound event (both can have no namespace).\\n\\t\\t\\t\\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\\n\\n\\t\\t\\t\\t\\tevent.handleObj = handleObj;\\n\\t\\t\\t\\t\\tevent.data = handleObj.data;\\n\\n\\t\\t\\t\\t\\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\\n\\t\\t\\t\\t\\t\\thandleObj.handler ).apply( matched.elem, args );\\n\\n\\t\\t\\t\\t\\tif ( ret !== undefined ) {\\n\\t\\t\\t\\t\\t\\tif ( ( event.result = ret ) === false ) {\\n\\t\\t\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Call the postDispatch hook for the mapped type\\n\\t\\tif ( special.postDispatch ) {\\n\\t\\t\\tspecial.postDispatch.call( this, event );\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\thandlers: function( event, handlers ) {\\n\\t\\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\\n\\t\\t\\thandlerQueue = [],\\n\\t\\t\\tdelegateCount = handlers.delegateCount,\\n\\t\\t\\tcur = event.target;\\n\\n\\t\\t// Find delegate handlers\\n\\t\\tif ( delegateCount &&\\n\\n\\t\\t\\t// Support: IE <=9\\n\\t\\t\\t// Black-hole SVG instance trees (trac-13180)\\n\\t\\t\\tcur.nodeType &&\\n\\n\\t\\t\\t// Support: Firefox <=42\\n\\t\\t\\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\\n\\t\\t\\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\\n\\t\\t\\t// Support: IE 11 only\\n\\t\\t\\t// ...but not arrow key \\\"clicks\\\" of radio inputs, which can have `button` -1 (gh-2343)\\n\\t\\t\\t!( event.type === \\\"click\\\" && event.button >= 1 ) ) {\\n\\n\\t\\t\\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\\n\\n\\t\\t\\t\\t// Don't check non-elements (#13208)\\n\\t\\t\\t\\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\\n\\t\\t\\t\\tif ( cur.nodeType === 1 && !( event.type === \\\"click\\\" && cur.disabled === true ) ) {\\n\\t\\t\\t\\t\\tmatchedHandlers = [];\\n\\t\\t\\t\\t\\tmatchedSelectors = {};\\n\\t\\t\\t\\t\\tfor ( i = 0; i < delegateCount; i++ ) {\\n\\t\\t\\t\\t\\t\\thandleObj = handlers[ i ];\\n\\n\\t\\t\\t\\t\\t\\t// Don't conflict with Object.prototype properties (#13203)\\n\\t\\t\\t\\t\\t\\tsel = handleObj.selector + \\\" \\\";\\n\\n\\t\\t\\t\\t\\t\\tif ( matchedSelectors[ sel ] === undefined ) {\\n\\t\\t\\t\\t\\t\\t\\tmatchedSelectors[ sel ] = handleObj.needsContext ?\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery( sel, this ).index( cur ) > -1 :\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.find( sel, this, null, [ cur ] ).length;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif ( matchedSelectors[ sel ] ) {\\n\\t\\t\\t\\t\\t\\t\\tmatchedHandlers.push( handleObj );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( matchedHandlers.length ) {\\n\\t\\t\\t\\t\\t\\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Add the remaining (directly-bound) handlers\\n\\t\\tcur = this;\\n\\t\\tif ( delegateCount < handlers.length ) {\\n\\t\\t\\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\\n\\t\\t}\\n\\n\\t\\treturn handlerQueue;\\n\\t},\\n\\n\\taddProp: function( name, hook ) {\\n\\t\\tObject.defineProperty( jQuery.Event.prototype, name, {\\n\\t\\t\\tenumerable: true,\\n\\t\\t\\tconfigurable: true,\\n\\n\\t\\t\\tget: jQuery.isFunction( hook ) ?\\n\\t\\t\\t\\tfunction() {\\n\\t\\t\\t\\t\\tif ( this.originalEvent ) {\\n\\t\\t\\t\\t\\t\\t\\treturn hook( this.originalEvent );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} :\\n\\t\\t\\t\\tfunction() {\\n\\t\\t\\t\\t\\tif ( this.originalEvent ) {\\n\\t\\t\\t\\t\\t\\t\\treturn this.originalEvent[ name ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\tset: function( value ) {\\n\\t\\t\\t\\tObject.defineProperty( this, name, {\\n\\t\\t\\t\\t\\tenumerable: true,\\n\\t\\t\\t\\t\\tconfigurable: true,\\n\\t\\t\\t\\t\\twritable: true,\\n\\t\\t\\t\\t\\tvalue: value\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tfix: function( originalEvent ) {\\n\\t\\treturn originalEvent[ jQuery.expando ] ?\\n\\t\\t\\toriginalEvent :\\n\\t\\t\\tnew jQuery.Event( originalEvent );\\n\\t},\\n\\n\\tspecial: {\\n\\t\\tload: {\\n\\n\\t\\t\\t// Prevent triggered image.load events from bubbling to window.load\\n\\t\\t\\tnoBubble: true\\n\\t\\t},\\n\\t\\tfocus: {\\n\\n\\t\\t\\t// Fire native event if possible so blur/focus sequence is correct\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this !== safeActiveElement() && this.focus ) {\\n\\t\\t\\t\\t\\tthis.focus();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusin\\\"\\n\\t\\t},\\n\\t\\tblur: {\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this === safeActiveElement() && this.blur ) {\\n\\t\\t\\t\\t\\tthis.blur();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusout\\\"\\n\\t\\t},\\n\\t\\tclick: {\\n\\n\\t\\t\\t// For checkbox, fire native event so checked state will be right\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this.type === \\\"checkbox\\\" && this.click && nodeName( this, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tthis.click();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\t// For cross-browser consistency, don't fire native .click() on links\\n\\t\\t\\t_default: function( event ) {\\n\\t\\t\\t\\treturn nodeName( event.target, \\\"a\\\" );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tbeforeunload: {\\n\\t\\t\\tpostDispatch: function( event ) {\\n\\n\\t\\t\\t\\t// Support: Firefox 20+\\n\\t\\t\\t\\t// Firefox doesn't alert if the returnValue field is not set.\\n\\t\\t\\t\\tif ( event.result !== undefined && event.originalEvent ) {\\n\\t\\t\\t\\t\\tevent.originalEvent.returnValue = event.result;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.removeEvent = function( elem, type, handle ) {\\n\\n\\t// This \\\"if\\\" is needed for plain objects\\n\\tif ( elem.removeEventListener ) {\\n\\t\\telem.removeEventListener( type, handle );\\n\\t}\\n};\\n\\njQuery.Event = function( src, props ) {\\n\\n\\t// Allow instantiation without the 'new' keyword\\n\\tif ( !( this instanceof jQuery.Event ) ) {\\n\\t\\treturn new jQuery.Event( src, props );\\n\\t}\\n\\n\\t// Event object\\n\\tif ( src && src.type ) {\\n\\t\\tthis.originalEvent = src;\\n\\t\\tthis.type = src.type;\\n\\n\\t\\t// Events bubbling up the document may have been marked as prevented\\n\\t\\t// by a handler lower down the tree; reflect the correct value.\\n\\t\\tthis.isDefaultPrevented = src.defaultPrevented ||\\n\\t\\t\\t\\tsrc.defaultPrevented === undefined &&\\n\\n\\t\\t\\t\\t// Support: Android <=2.3 only\\n\\t\\t\\t\\tsrc.returnValue === false ?\\n\\t\\t\\treturnTrue :\\n\\t\\t\\treturnFalse;\\n\\n\\t\\t// Create target properties\\n\\t\\t// Support: Safari <=6 - 7 only\\n\\t\\t// Target should not be a text node (#504, #13143)\\n\\t\\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\\n\\t\\t\\tsrc.target.parentNode :\\n\\t\\t\\tsrc.target;\\n\\n\\t\\tthis.currentTarget = src.currentTarget;\\n\\t\\tthis.relatedTarget = src.relatedTarget;\\n\\n\\t// Event type\\n\\t} else {\\n\\t\\tthis.type = src;\\n\\t}\\n\\n\\t// Put explicitly provided properties onto the event object\\n\\tif ( props ) {\\n\\t\\tjQuery.extend( this, props );\\n\\t}\\n\\n\\t// Create a timestamp if incoming event doesn't have one\\n\\tthis.timeStamp = src && src.timeStamp || jQuery.now();\\n\\n\\t// Mark it as fixed\\n\\tthis[ jQuery.expando ] = true;\\n};\\n\\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\\njQuery.Event.prototype = {\\n\\tconstructor: jQuery.Event,\\n\\tisDefaultPrevented: returnFalse,\\n\\tisPropagationStopped: returnFalse,\\n\\tisImmediatePropagationStopped: returnFalse,\\n\\tisSimulated: false,\\n\\n\\tpreventDefault: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isDefaultPrevented = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.preventDefault();\\n\\t\\t}\\n\\t},\\n\\tstopPropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isPropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopPropagation();\\n\\t\\t}\\n\\t},\\n\\tstopImmediatePropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isImmediatePropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopImmediatePropagation();\\n\\t\\t}\\n\\n\\t\\tthis.stopPropagation();\\n\\t}\\n};\\n\\n// Includes all common event props including KeyEvent and MouseEvent specific props\\njQuery.each( {\\n\\taltKey: true,\\n\\tbubbles: true,\\n\\tcancelable: true,\\n\\tchangedTouches: true,\\n\\tctrlKey: true,\\n\\tdetail: true,\\n\\teventPhase: true,\\n\\tmetaKey: true,\\n\\tpageX: true,\\n\\tpageY: true,\\n\\tshiftKey: true,\\n\\tview: true,\\n\\t\\\"char\\\": true,\\n\\tcharCode: true,\\n\\tkey: true,\\n\\tkeyCode: true,\\n\\tbutton: true,\\n\\tbuttons: true,\\n\\tclientX: true,\\n\\tclientY: true,\\n\\toffsetX: true,\\n\\toffsetY: true,\\n\\tpointerId: true,\\n\\tpointerType: true,\\n\\tscreenX: true,\\n\\tscreenY: true,\\n\\ttargetTouches: true,\\n\\ttoElement: true,\\n\\ttouches: true,\\n\\n\\twhich: function( event ) {\\n\\t\\tvar button = event.button;\\n\\n\\t\\t// Add which for key events\\n\\t\\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\\n\\t\\t\\treturn event.charCode != null ? event.charCode : event.keyCode;\\n\\t\\t}\\n\\n\\t\\t// Add which for click: 1 === left; 2 === middle; 3 === right\\n\\t\\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\\n\\t\\t\\tif ( button & 1 ) {\\n\\t\\t\\t\\treturn 1;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( button & 2 ) {\\n\\t\\t\\t\\treturn 3;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( button & 4 ) {\\n\\t\\t\\t\\treturn 2;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\n\\t\\treturn event.which;\\n\\t}\\n}, jQuery.event.addProp );\\n\\n// Create mouseenter/leave events using mouseover/out and event-time checks\\n// so that event delegation works in jQuery.\\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\\n//\\n// Support: Safari 7 only\\n// Safari sends mouseenter too often; see:\\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\\n// for the description of the bug (it existed in older Chrome versions as well).\\njQuery.each( {\\n\\tmouseenter: \\\"mouseover\\\",\\n\\tmouseleave: \\\"mouseout\\\",\\n\\tpointerenter: \\\"pointerover\\\",\\n\\tpointerleave: \\\"pointerout\\\"\\n}, function( orig, fix ) {\\n\\tjQuery.event.special[ orig ] = {\\n\\t\\tdelegateType: fix,\\n\\t\\tbindType: fix,\\n\\n\\t\\thandle: function( event ) {\\n\\t\\t\\tvar ret,\\n\\t\\t\\t\\ttarget = this,\\n\\t\\t\\t\\trelated = event.relatedTarget,\\n\\t\\t\\t\\thandleObj = event.handleObj;\\n\\n\\t\\t\\t// For mouseenter/leave call the handler if related is outside the target.\\n\\t\\t\\t// NB: No relatedTarget if the mouse left/entered the browser window\\n\\t\\t\\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\\n\\t\\t\\t\\tevent.type = handleObj.origType;\\n\\t\\t\\t\\tret = handleObj.handler.apply( this, arguments );\\n\\t\\t\\t\\tevent.type = fix;\\n\\t\\t\\t}\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\ton: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn );\\n\\t},\\n\\tone: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn, 1 );\\n\\t},\\n\\toff: function( types, selector, fn ) {\\n\\t\\tvar handleObj, type;\\n\\t\\tif ( types && types.preventDefault && types.handleObj ) {\\n\\n\\t\\t\\t// ( event ) dispatched jQuery.Event\\n\\t\\t\\thandleObj = types.handleObj;\\n\\t\\t\\tjQuery( types.delegateTarget ).off(\\n\\t\\t\\t\\thandleObj.namespace ?\\n\\t\\t\\t\\t\\thandleObj.origType + \\\".\\\" + handleObj.namespace :\\n\\t\\t\\t\\t\\thandleObj.origType,\\n\\t\\t\\t\\thandleObj.selector,\\n\\t\\t\\t\\thandleObj.handler\\n\\t\\t\\t);\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t\\t// ( types-object [, selector] )\\n\\t\\t\\tfor ( type in types ) {\\n\\t\\t\\t\\tthis.off( type, selector, types[ type ] );\\n\\t\\t\\t}\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( selector === false || typeof selector === \\\"function\\\" ) {\\n\\n\\t\\t\\t// ( types [, fn] )\\n\\t\\t\\tfn = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tif ( fn === false ) {\\n\\t\\t\\tfn = returnFalse;\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.remove( this, types, fn, selector );\\n\\t\\t} );\\n\\t}\\n} );\\n\\n\\nvar\\n\\n\\t/* eslint-disable max-len */\\n\\n\\t// See https://github.com/eslint/eslint/issues/3229\\n\\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\\\/\\\\0>\\\\x20\\\\t\\\\r\\\\n\\\\f]*)[^>]*)\\\\/>/gi,\\n\\n\\t/* eslint-enable */\\n\\n\\t// Support: IE <=10 - 11, Edge 12 - 13\\n\\t// In IE/Edge using regex groups here causes severe slowdowns.\\n\\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\\n\\trnoInnerhtml = /\\\\s*$/g;\\n\\n// Prefer a tbody over its parent table for containing new rows\\nfunction manipulationTarget( elem, content ) {\\n\\tif ( nodeName( elem, \\\"table\\\" ) &&\\n\\t\\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \\\"tr\\\" ) ) {\\n\\n\\t\\treturn jQuery( \\\">tbody\\\", elem )[ 0 ] || elem;\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\n// Replace/restore the type attribute of script elements for safe DOM manipulation\\nfunction disableScript( elem ) {\\n\\telem.type = ( elem.getAttribute( \\\"type\\\" ) !== null ) + \\\"/\\\" + elem.type;\\n\\treturn elem;\\n}\\nfunction restoreScript( elem ) {\\n\\tvar match = rscriptTypeMasked.exec( elem.type );\\n\\n\\tif ( match ) {\\n\\t\\telem.type = match[ 1 ];\\n\\t} else {\\n\\t\\telem.removeAttribute( \\\"type\\\" );\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\nfunction cloneCopyEvent( src, dest ) {\\n\\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\\n\\n\\tif ( dest.nodeType !== 1 ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// 1. Copy private data: events, handlers, etc.\\n\\tif ( dataPriv.hasData( src ) ) {\\n\\t\\tpdataOld = dataPriv.access( src );\\n\\t\\tpdataCur = dataPriv.set( dest, pdataOld );\\n\\t\\tevents = pdataOld.events;\\n\\n\\t\\tif ( events ) {\\n\\t\\t\\tdelete pdataCur.handle;\\n\\t\\t\\tpdataCur.events = {};\\n\\n\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tjQuery.event.add( dest, type, events[ type ][ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// 2. Copy user data\\n\\tif ( dataUser.hasData( src ) ) {\\n\\t\\tudataOld = dataUser.access( src );\\n\\t\\tudataCur = jQuery.extend( {}, udataOld );\\n\\n\\t\\tdataUser.set( dest, udataCur );\\n\\t}\\n}\\n\\n// Fix IE bugs, see support tests\\nfunction fixInput( src, dest ) {\\n\\tvar nodeName = dest.nodeName.toLowerCase();\\n\\n\\t// Fails to persist the checked state of a cloned checkbox or radio button.\\n\\tif ( nodeName === \\\"input\\\" && rcheckableType.test( src.type ) ) {\\n\\t\\tdest.checked = src.checked;\\n\\n\\t// Fails to return the selected option to the default selected state when cloning options\\n\\t} else if ( nodeName === \\\"input\\\" || nodeName === \\\"textarea\\\" ) {\\n\\t\\tdest.defaultValue = src.defaultValue;\\n\\t}\\n}\\n\\nfunction domManip( collection, args, callback, ignored ) {\\n\\n\\t// Flatten any nested arrays\\n\\targs = concat.apply( [], args );\\n\\n\\tvar fragment, first, scripts, hasScripts, node, doc,\\n\\t\\ti = 0,\\n\\t\\tl = collection.length,\\n\\t\\tiNoClone = l - 1,\\n\\t\\tvalue = args[ 0 ],\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t// We can't cloneNode fragments that contain checked, in WebKit\\n\\tif ( isFunction ||\\n\\t\\t\\t( l > 1 && typeof value === \\\"string\\\" &&\\n\\t\\t\\t\\t!support.checkClone && rchecked.test( value ) ) ) {\\n\\t\\treturn collection.each( function( index ) {\\n\\t\\t\\tvar self = collection.eq( index );\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\targs[ 0 ] = value.call( this, index, self.html() );\\n\\t\\t\\t}\\n\\t\\t\\tdomManip( self, args, callback, ignored );\\n\\t\\t} );\\n\\t}\\n\\n\\tif ( l ) {\\n\\t\\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\\n\\t\\tfirst = fragment.firstChild;\\n\\n\\t\\tif ( fragment.childNodes.length === 1 ) {\\n\\t\\t\\tfragment = first;\\n\\t\\t}\\n\\n\\t\\t// Require either new content or an interest in ignored elements to invoke the callback\\n\\t\\tif ( first || ignored ) {\\n\\t\\t\\tscripts = jQuery.map( getAll( fragment, \\\"script\\\" ), disableScript );\\n\\t\\t\\thasScripts = scripts.length;\\n\\n\\t\\t\\t// Use the original fragment for the last item\\n\\t\\t\\t// instead of the first because it can end up\\n\\t\\t\\t// being emptied incorrectly in certain situations (#8070).\\n\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\tnode = fragment;\\n\\n\\t\\t\\t\\tif ( i !== iNoClone ) {\\n\\t\\t\\t\\t\\tnode = jQuery.clone( node, true, true );\\n\\n\\t\\t\\t\\t\\t// Keep references to cloned scripts for later restoration\\n\\t\\t\\t\\t\\tif ( hasScripts ) {\\n\\n\\t\\t\\t\\t\\t\\t// Support: Android <=4.0 only, PhantomJS 1 only\\n\\t\\t\\t\\t\\t\\t// push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\t\\t\\t\\tjQuery.merge( scripts, getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tcallback.call( collection[ i ], node, i );\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hasScripts ) {\\n\\t\\t\\t\\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\\n\\n\\t\\t\\t\\t// Reenable scripts\\n\\t\\t\\t\\tjQuery.map( scripts, restoreScript );\\n\\n\\t\\t\\t\\t// Evaluate executable scripts on first document insertion\\n\\t\\t\\t\\tfor ( i = 0; i < hasScripts; i++ ) {\\n\\t\\t\\t\\t\\tnode = scripts[ i ];\\n\\t\\t\\t\\t\\tif ( rscriptType.test( node.type || \\\"\\\" ) &&\\n\\t\\t\\t\\t\\t\\t!dataPriv.access( node, \\\"globalEval\\\" ) &&\\n\\t\\t\\t\\t\\t\\tjQuery.contains( doc, node ) ) {\\n\\n\\t\\t\\t\\t\\t\\tif ( node.src ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Optional AJAX dependency, but won't run scripts if not present\\n\\t\\t\\t\\t\\t\\t\\tif ( jQuery._evalUrl ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery._evalUrl( node.src );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tDOMEval( node.textContent.replace( rcleanScript, \\\"\\\" ), doc );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn collection;\\n}\\n\\nfunction remove( elem, selector, keepData ) {\\n\\tvar node,\\n\\t\\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\\n\\t\\ti = 0;\\n\\n\\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\\n\\t\\tif ( !keepData && node.nodeType === 1 ) {\\n\\t\\t\\tjQuery.cleanData( getAll( node ) );\\n\\t\\t}\\n\\n\\t\\tif ( node.parentNode ) {\\n\\t\\t\\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\\n\\t\\t\\t\\tsetGlobalEval( getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t}\\n\\t\\t\\tnode.parentNode.removeChild( node );\\n\\t\\t}\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\njQuery.extend( {\\n\\thtmlPrefilter: function( html ) {\\n\\t\\treturn html.replace( rxhtmlTag, \\\"<$1>\\\" );\\n\\t},\\n\\n\\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\\n\\t\\tvar i, l, srcElements, destElements,\\n\\t\\t\\tclone = elem.cloneNode( true ),\\n\\t\\t\\tinPage = jQuery.contains( elem.ownerDocument, elem );\\n\\n\\t\\t// Fix IE cloning issues\\n\\t\\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\\n\\t\\t\\t\\t!jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\\n\\t\\t\\tdestElements = getAll( clone );\\n\\t\\t\\tsrcElements = getAll( elem );\\n\\n\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\tfixInput( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Copy the events from the original to the clone\\n\\t\\tif ( dataAndEvents ) {\\n\\t\\t\\tif ( deepDataAndEvents ) {\\n\\t\\t\\t\\tsrcElements = srcElements || getAll( elem );\\n\\t\\t\\t\\tdestElements = destElements || getAll( clone );\\n\\n\\t\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcloneCopyEvent( elem, clone );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Preserve script evaluation history\\n\\t\\tdestElements = getAll( clone, \\\"script\\\" );\\n\\t\\tif ( destElements.length > 0 ) {\\n\\t\\t\\tsetGlobalEval( destElements, !inPage && getAll( elem, \\\"script\\\" ) );\\n\\t\\t}\\n\\n\\t\\t// Return the cloned set\\n\\t\\treturn clone;\\n\\t},\\n\\n\\tcleanData: function( elems ) {\\n\\t\\tvar data, elem, type,\\n\\t\\t\\tspecial = jQuery.event.special,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\\n\\t\\t\\tif ( acceptData( elem ) ) {\\n\\t\\t\\t\\tif ( ( data = elem[ dataPriv.expando ] ) ) {\\n\\t\\t\\t\\t\\tif ( data.events ) {\\n\\t\\t\\t\\t\\t\\tfor ( type in data.events ) {\\n\\t\\t\\t\\t\\t\\t\\tif ( special[ type ] ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.event.remove( elem, type );\\n\\n\\t\\t\\t\\t\\t\\t\\t// This is a shortcut to avoid jQuery.event.remove's overhead\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, data.handle );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <=35 - 45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataPriv.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif ( elem[ dataUser.expando ] ) {\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <=35 - 45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataUser.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tdetach: function( selector ) {\\n\\t\\treturn remove( this, selector, true );\\n\\t},\\n\\n\\tremove: function( selector ) {\\n\\t\\treturn remove( this, selector );\\n\\t},\\n\\n\\ttext: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\treturn value === undefined ?\\n\\t\\t\\t\\tjQuery.text( this ) :\\n\\t\\t\\t\\tthis.empty().each( function() {\\n\\t\\t\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\t\\t\\tthis.textContent = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\tappend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.appendChild( elem );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tprepend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.insertBefore( elem, target.firstChild );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tbefore: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tafter: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this.nextSibling );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tempty: function() {\\n\\t\\tvar elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\\n\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\n\\t\\t\\t\\t// Prevent memory leaks\\n\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\n\\t\\t\\t\\t// Remove any remaining nodes\\n\\t\\t\\t\\telem.textContent = \\\"\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tclone: function( dataAndEvents, deepDataAndEvents ) {\\n\\t\\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\\n\\t\\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\\n\\n\\t\\treturn this.map( function() {\\n\\t\\t\\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\\n\\t\\t} );\\n\\t},\\n\\n\\thtml: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\tvar elem = this[ 0 ] || {},\\n\\t\\t\\t\\ti = 0,\\n\\t\\t\\t\\tl = this.length;\\n\\n\\t\\t\\tif ( value === undefined && elem.nodeType === 1 ) {\\n\\t\\t\\t\\treturn elem.innerHTML;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// See if we can take a shortcut and just use innerHTML\\n\\t\\t\\tif ( typeof value === \\\"string\\\" && !rnoInnerhtml.test( value ) &&\\n\\t\\t\\t\\t!wrapMap[ ( rtagName.exec( value ) || [ \\\"\\\", \\\"\\\" ] )[ 1 ].toLowerCase() ] ) {\\n\\n\\t\\t\\t\\tvalue = jQuery.htmlPrefilter( value );\\n\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\t\\t\\telem = this[ i ] || {};\\n\\n\\t\\t\\t\\t\\t\\t// Remove element nodes and prevent memory leaks\\n\\t\\t\\t\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\t\\t\\t\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\t\\t\\t\\t\\t\\t\\telem.innerHTML = value;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\telem = 0;\\n\\n\\t\\t\\t\\t// If using innerHTML throws an exception, use the fallback method\\n\\t\\t\\t\\t} catch ( e ) {}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\tthis.empty().append( value );\\n\\t\\t\\t}\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\treplaceWith: function() {\\n\\t\\tvar ignored = [];\\n\\n\\t\\t// Make the changes, replacing each non-ignored context element with the new content\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tvar parent = this.parentNode;\\n\\n\\t\\t\\tif ( jQuery.inArray( this, ignored ) < 0 ) {\\n\\t\\t\\t\\tjQuery.cleanData( getAll( this ) );\\n\\t\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\t\\tparent.replaceChild( elem, this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t// Force callback invocation\\n\\t\\t}, ignored );\\n\\t}\\n} );\\n\\njQuery.each( {\\n\\tappendTo: \\\"append\\\",\\n\\tprependTo: \\\"prepend\\\",\\n\\tinsertBefore: \\\"before\\\",\\n\\tinsertAfter: \\\"after\\\",\\n\\treplaceAll: \\\"replaceWith\\\"\\n}, function( name, original ) {\\n\\tjQuery.fn[ name ] = function( selector ) {\\n\\t\\tvar elems,\\n\\t\\t\\tret = [],\\n\\t\\t\\tinsert = jQuery( selector ),\\n\\t\\t\\tlast = insert.length - 1,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; i <= last; i++ ) {\\n\\t\\t\\telems = i === last ? this : this.clone( true );\\n\\t\\t\\tjQuery( insert[ i ] )[ original ]( elems );\\n\\n\\t\\t\\t// Support: Android <=4.0 only, PhantomJS 1 only\\n\\t\\t\\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\tpush.apply( ret, elems.get() );\\n\\t\\t}\\n\\n\\t\\treturn this.pushStack( ret );\\n\\t};\\n} );\\nvar rmargin = ( /^margin/ );\\n\\nvar rnumnonpx = new RegExp( \\\"^(\\\" + pnum + \\\")(?!px)[a-z%]+$\\\", \\\"i\\\" );\\n\\nvar getStyles = function( elem ) {\\n\\n\\t\\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\\n\\t\\t// IE throws on elements created in popups\\n\\t\\t// FF meanwhile throws on frame elements through \\\"defaultView.getComputedStyle\\\"\\n\\t\\tvar view = elem.ownerDocument.defaultView;\\n\\n\\t\\tif ( !view || !view.opener ) {\\n\\t\\t\\tview = window;\\n\\t\\t}\\n\\n\\t\\treturn view.getComputedStyle( elem );\\n\\t};\\n\\n\\n\\n( function() {\\n\\n\\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\\n\\t// so they're executed at the same time to save the second computation.\\n\\tfunction computeStyleTests() {\\n\\n\\t\\t// This is a singleton, we need to execute it only once\\n\\t\\tif ( !div ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tdiv.style.cssText =\\n\\t\\t\\t\\\"box-sizing:border-box;\\\" +\\n\\t\\t\\t\\\"position:relative;display:block;\\\" +\\n\\t\\t\\t\\\"margin:auto;border:1px;padding:1px;\\\" +\\n\\t\\t\\t\\\"top:1%;width:50%\\\";\\n\\t\\tdiv.innerHTML = \\\"\\\";\\n\\t\\tdocumentElement.appendChild( container );\\n\\n\\t\\tvar divStyle = window.getComputedStyle( div );\\n\\t\\tpixelPositionVal = divStyle.top !== \\\"1%\\\";\\n\\n\\t\\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\\n\\t\\treliableMarginLeftVal = divStyle.marginLeft === \\\"2px\\\";\\n\\t\\tboxSizingReliableVal = divStyle.width === \\\"4px\\\";\\n\\n\\t\\t// Support: Android 4.0 - 4.3 only\\n\\t\\t// Some styles come back with percentage values, even though they shouldn't\\n\\t\\tdiv.style.marginRight = \\\"50%\\\";\\n\\t\\tpixelMarginRightVal = divStyle.marginRight === \\\"4px\\\";\\n\\n\\t\\tdocumentElement.removeChild( container );\\n\\n\\t\\t// Nullify the div so it wouldn't be stored in the memory and\\n\\t\\t// it will also be a sign that checks already performed\\n\\t\\tdiv = null;\\n\\t}\\n\\n\\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\\n\\t\\tcontainer = document.createElement( \\\"div\\\" ),\\n\\t\\tdiv = document.createElement( \\\"div\\\" );\\n\\n\\t// Finish early in limited (non-browser) environments\\n\\tif ( !div.style ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// Support: IE <=9 - 11 only\\n\\t// Style of cloned element affects source element cloned (#8908)\\n\\tdiv.style.backgroundClip = \\\"content-box\\\";\\n\\tdiv.cloneNode( true ).style.backgroundClip = \\\"\\\";\\n\\tsupport.clearCloneStyle = div.style.backgroundClip === \\\"content-box\\\";\\n\\n\\tcontainer.style.cssText = \\\"border:0;width:8px;height:0;top:0;left:-9999px;\\\" +\\n\\t\\t\\\"padding:0;margin-top:1px;position:absolute\\\";\\n\\tcontainer.appendChild( div );\\n\\n\\tjQuery.extend( support, {\\n\\t\\tpixelPosition: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn pixelPositionVal;\\n\\t\\t},\\n\\t\\tboxSizingReliable: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn boxSizingReliableVal;\\n\\t\\t},\\n\\t\\tpixelMarginRight: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn pixelMarginRightVal;\\n\\t\\t},\\n\\t\\treliableMarginLeft: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn reliableMarginLeftVal;\\n\\t\\t}\\n\\t} );\\n} )();\\n\\n\\nfunction curCSS( elem, name, computed ) {\\n\\tvar width, minWidth, maxWidth, ret,\\n\\n\\t\\t// Support: Firefox 51+\\n\\t\\t// Retrieving style before computed somehow\\n\\t\\t// fixes an issue with getting wrong values\\n\\t\\t// on detached elements\\n\\t\\tstyle = elem.style;\\n\\n\\tcomputed = computed || getStyles( elem );\\n\\n\\t// getPropertyValue is needed for:\\n\\t// .css('filter') (IE 9 only, #12537)\\n\\t// .css('--customProperty) (#3144)\\n\\tif ( computed ) {\\n\\t\\tret = computed.getPropertyValue( name ) || computed[ name ];\\n\\n\\t\\tif ( ret === \\\"\\\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\\n\\t\\t\\tret = jQuery.style( elem, name );\\n\\t\\t}\\n\\n\\t\\t// A tribute to the \\\"awesome hack by Dean Edwards\\\"\\n\\t\\t// Android Browser returns percentage for some values,\\n\\t\\t// but width seems to be reliably pixels.\\n\\t\\t// This is against the CSSOM draft spec:\\n\\t\\t// https://drafts.csswg.org/cssom/#resolved-values\\n\\t\\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\\n\\n\\t\\t\\t// Remember the original values\\n\\t\\t\\twidth = style.width;\\n\\t\\t\\tminWidth = style.minWidth;\\n\\t\\t\\tmaxWidth = style.maxWidth;\\n\\n\\t\\t\\t// Put in the new values to get a computed value out\\n\\t\\t\\tstyle.minWidth = style.maxWidth = style.width = ret;\\n\\t\\t\\tret = computed.width;\\n\\n\\t\\t\\t// Revert the changed values\\n\\t\\t\\tstyle.width = width;\\n\\t\\t\\tstyle.minWidth = minWidth;\\n\\t\\t\\tstyle.maxWidth = maxWidth;\\n\\t\\t}\\n\\t}\\n\\n\\treturn ret !== undefined ?\\n\\n\\t\\t// Support: IE <=9 - 11 only\\n\\t\\t// IE returns zIndex value as an integer.\\n\\t\\tret + \\\"\\\" :\\n\\t\\tret;\\n}\\n\\n\\nfunction addGetHookIf( conditionFn, hookFn ) {\\n\\n\\t// Define the hook, we'll check on the first run if it's really needed.\\n\\treturn {\\n\\t\\tget: function() {\\n\\t\\t\\tif ( conditionFn() ) {\\n\\n\\t\\t\\t\\t// Hook not needed (or it's not possible to use it due\\n\\t\\t\\t\\t// to missing dependency), remove it.\\n\\t\\t\\t\\tdelete this.get;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Hook needed; redefine it so that the support test is not executed again.\\n\\t\\t\\treturn ( this.get = hookFn ).apply( this, arguments );\\n\\t\\t}\\n\\t};\\n}\\n\\n\\nvar\\n\\n\\t// Swappable if display is none or starts with table\\n\\t// except \\\"table\\\", \\\"table-cell\\\", or \\\"table-caption\\\"\\n\\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\\n\\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\\n\\trcustomProp = /^--/,\\n\\tcssShow = { position: \\\"absolute\\\", visibility: \\\"hidden\\\", display: \\\"block\\\" },\\n\\tcssNormalTransform = {\\n\\t\\tletterSpacing: \\\"0\\\",\\n\\t\\tfontWeight: \\\"400\\\"\\n\\t},\\n\\n\\tcssPrefixes = [ \\\"Webkit\\\", \\\"Moz\\\", \\\"ms\\\" ],\\n\\temptyStyle = document.createElement( \\\"div\\\" ).style;\\n\\n// Return a css property mapped to a potentially vendor prefixed property\\nfunction vendorPropName( name ) {\\n\\n\\t// Shortcut for names that are not vendor prefixed\\n\\tif ( name in emptyStyle ) {\\n\\t\\treturn name;\\n\\t}\\n\\n\\t// Check for vendor prefixed names\\n\\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\\n\\t\\ti = cssPrefixes.length;\\n\\n\\twhile ( i-- ) {\\n\\t\\tname = cssPrefixes[ i ] + capName;\\n\\t\\tif ( name in emptyStyle ) {\\n\\t\\t\\treturn name;\\n\\t\\t}\\n\\t}\\n}\\n\\n// Return a property mapped along what jQuery.cssProps suggests or to\\n// a vendor prefixed property.\\nfunction finalPropName( name ) {\\n\\tvar ret = jQuery.cssProps[ name ];\\n\\tif ( !ret ) {\\n\\t\\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\\n\\t}\\n\\treturn ret;\\n}\\n\\nfunction setPositiveNumber( elem, value, subtract ) {\\n\\n\\t// Any relative (+/-) values have already been\\n\\t// normalized at this point\\n\\tvar matches = rcssNum.exec( value );\\n\\treturn matches ?\\n\\n\\t\\t// Guard against undefined \\\"subtract\\\", e.g., when used as in cssHooks\\n\\t\\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \\\"px\\\" ) :\\n\\t\\tvalue;\\n}\\n\\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\\n\\tvar i,\\n\\t\\tval = 0;\\n\\n\\t// If we already have the right measurement, avoid augmentation\\n\\tif ( extra === ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ) ) {\\n\\t\\ti = 4;\\n\\n\\t// Otherwise initialize for horizontal or vertical properties\\n\\t} else {\\n\\t\\ti = name === \\\"width\\\" ? 1 : 0;\\n\\t}\\n\\n\\tfor ( ; i < 4; i += 2 ) {\\n\\n\\t\\t// Both box models exclude margin, so add it if we want it\\n\\t\\tif ( extra === \\\"margin\\\" ) {\\n\\t\\t\\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\\n\\t\\t}\\n\\n\\t\\tif ( isBorderBox ) {\\n\\n\\t\\t\\t// border-box includes padding, so remove it if we want content\\n\\t\\t\\tif ( extra === \\\"content\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// At this point, extra isn't border nor margin, so remove border\\n\\t\\t\\tif ( extra !== \\\"margin\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// At this point, extra isn't content, so add padding\\n\\t\\t\\tval += jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\n\\t\\t\\t// At this point, extra isn't content nor padding, so add border\\n\\t\\t\\tif ( extra !== \\\"padding\\\" ) {\\n\\t\\t\\t\\tval += jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn val;\\n}\\n\\nfunction getWidthOrHeight( elem, name, extra ) {\\n\\n\\t// Start with computed style\\n\\tvar valueIsBorderBox,\\n\\t\\tstyles = getStyles( elem ),\\n\\t\\tval = curCSS( elem, name, styles ),\\n\\t\\tisBorderBox = jQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\";\\n\\n\\t// Computed unit is not pixels. Stop here and return.\\n\\tif ( rnumnonpx.test( val ) ) {\\n\\t\\treturn val;\\n\\t}\\n\\n\\t// Check for style in case a browser which returns unreliable values\\n\\t// for getComputedStyle silently falls back to the reliable elem.style\\n\\tvalueIsBorderBox = isBorderBox &&\\n\\t\\t( support.boxSizingReliable() || val === elem.style[ name ] );\\n\\n\\t// Fall back to offsetWidth/Height when value is \\\"auto\\\"\\n\\t// This happens for inline elements with no explicit setting (gh-3571)\\n\\tif ( val === \\\"auto\\\" ) {\\n\\t\\tval = elem[ \\\"offset\\\" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];\\n\\t}\\n\\n\\t// Normalize \\\"\\\", auto, and prepare for extra\\n\\tval = parseFloat( val ) || 0;\\n\\n\\t// Use the active box-sizing model to add/subtract irrelevant styles\\n\\treturn ( val +\\n\\t\\taugmentWidthOrHeight(\\n\\t\\t\\telem,\\n\\t\\t\\tname,\\n\\t\\t\\textra || ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ),\\n\\t\\t\\tvalueIsBorderBox,\\n\\t\\t\\tstyles\\n\\t\\t)\\n\\t) + \\\"px\\\";\\n}\\n\\njQuery.extend( {\\n\\n\\t// Add in style property hooks for overriding the default\\n\\t// behavior of getting and setting a style property\\n\\tcssHooks: {\\n\\t\\topacity: {\\n\\t\\t\\tget: function( elem, computed ) {\\n\\t\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t\\t// We should always get a number back from opacity\\n\\t\\t\\t\\t\\tvar ret = curCSS( elem, \\\"opacity\\\" );\\n\\t\\t\\t\\t\\treturn ret === \\\"\\\" ? \\\"1\\\" : ret;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\t// Don't automatically add \\\"px\\\" to these possibly-unitless properties\\n\\tcssNumber: {\\n\\t\\t\\\"animationIterationCount\\\": true,\\n\\t\\t\\\"columnCount\\\": true,\\n\\t\\t\\\"fillOpacity\\\": true,\\n\\t\\t\\\"flexGrow\\\": true,\\n\\t\\t\\\"flexShrink\\\": true,\\n\\t\\t\\\"fontWeight\\\": true,\\n\\t\\t\\\"lineHeight\\\": true,\\n\\t\\t\\\"opacity\\\": true,\\n\\t\\t\\\"order\\\": true,\\n\\t\\t\\\"orphans\\\": true,\\n\\t\\t\\\"widows\\\": true,\\n\\t\\t\\\"zIndex\\\": true,\\n\\t\\t\\\"zoom\\\": true\\n\\t},\\n\\n\\t// Add in properties whose names you wish to fix before\\n\\t// setting or getting the value\\n\\tcssProps: {\\n\\t\\t\\\"float\\\": \\\"cssFloat\\\"\\n\\t},\\n\\n\\t// Get and set the style property on a DOM Node\\n\\tstyle: function( elem, name, value, extra ) {\\n\\n\\t\\t// Don't set styles on text and comment nodes\\n\\t\\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Make sure that we're working with the right name\\n\\t\\tvar ret, type, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name ),\\n\\t\\t\\tisCustomProp = rcustomProp.test( name ),\\n\\t\\t\\tstyle = elem.style;\\n\\n\\t\\t// Make sure that we're working with the right name. We don't\\n\\t\\t// want to query the value if it is a CSS custom property\\n\\t\\t// since they are user-defined.\\n\\t\\tif ( !isCustomProp ) {\\n\\t\\t\\tname = finalPropName( origName );\\n\\t\\t}\\n\\n\\t\\t// Gets hook for the prefixed version, then unprefixed version\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// Check if we're setting a value\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\ttype = typeof value;\\n\\n\\t\\t\\t// Convert \\\"+=\\\" or \\\"-=\\\" to relative numbers (#7345)\\n\\t\\t\\tif ( type === \\\"string\\\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\\n\\t\\t\\t\\tvalue = adjustCSS( elem, name, ret );\\n\\n\\t\\t\\t\\t// Fixes bug #9237\\n\\t\\t\\t\\ttype = \\\"number\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Make sure that null and NaN values aren't set (#7116)\\n\\t\\t\\tif ( value == null || value !== value ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a number was passed in, add the unit (except for certain CSS properties)\\n\\t\\t\\tif ( type === \\\"number\\\" ) {\\n\\t\\t\\t\\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \\\"\\\" : \\\"px\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// background-* props affect original clone's values\\n\\t\\t\\tif ( !support.clearCloneStyle && value === \\\"\\\" && name.indexOf( \\\"background\\\" ) === 0 ) {\\n\\t\\t\\t\\tstyle[ name ] = \\\"inherit\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a hook was provided, use that value, otherwise just set the specified value\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) ||\\n\\t\\t\\t\\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\tif ( isCustomProp ) {\\n\\t\\t\\t\\t\\tstyle.setProperty( name, value );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tstyle[ name ] = value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// If a hook was provided get the non-computed value from there\\n\\t\\t\\tif ( hooks && \\\"get\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Otherwise just get the value from the style object\\n\\t\\t\\treturn style[ name ];\\n\\t\\t}\\n\\t},\\n\\n\\tcss: function( elem, name, extra, styles ) {\\n\\t\\tvar val, num, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name ),\\n\\t\\t\\tisCustomProp = rcustomProp.test( name );\\n\\n\\t\\t// Make sure that we're working with the right name. We don't\\n\\t\\t// want to modify the value if it is a CSS custom property\\n\\t\\t// since they are user-defined.\\n\\t\\tif ( !isCustomProp ) {\\n\\t\\t\\tname = finalPropName( origName );\\n\\t\\t}\\n\\n\\t\\t// Try prefixed name followed by the unprefixed name\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// If a hook was provided get the computed value from there\\n\\t\\tif ( hooks && \\\"get\\\" in hooks ) {\\n\\t\\t\\tval = hooks.get( elem, true, extra );\\n\\t\\t}\\n\\n\\t\\t// Otherwise, if a way to get the computed value exists, use that\\n\\t\\tif ( val === undefined ) {\\n\\t\\t\\tval = curCSS( elem, name, styles );\\n\\t\\t}\\n\\n\\t\\t// Convert \\\"normal\\\" to computed value\\n\\t\\tif ( val === \\\"normal\\\" && name in cssNormalTransform ) {\\n\\t\\t\\tval = cssNormalTransform[ name ];\\n\\t\\t}\\n\\n\\t\\t// Make numeric if forced or a qualifier was provided and val looks numeric\\n\\t\\tif ( extra === \\\"\\\" || extra ) {\\n\\t\\t\\tnum = parseFloat( val );\\n\\t\\t\\treturn extra === true || isFinite( num ) ? num || 0 : val;\\n\\t\\t}\\n\\n\\t\\treturn val;\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"height\\\", \\\"width\\\" ], function( i, name ) {\\n\\tjQuery.cssHooks[ name ] = {\\n\\t\\tget: function( elem, computed, extra ) {\\n\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t// Certain elements can have dimension info if we invisibly show them\\n\\t\\t\\t\\t// but it must have a current display style that would benefit\\n\\t\\t\\t\\treturn rdisplayswap.test( jQuery.css( elem, \\\"display\\\" ) ) &&\\n\\n\\t\\t\\t\\t\\t// Support: Safari 8+\\n\\t\\t\\t\\t\\t// Table columns in Safari have non-zero offsetWidth & zero\\n\\t\\t\\t\\t\\t// getBoundingClientRect().width unless display is changed.\\n\\t\\t\\t\\t\\t// Support: IE <=11 only\\n\\t\\t\\t\\t\\t// Running getBoundingClientRect on a disconnected node\\n\\t\\t\\t\\t\\t// in IE throws an error.\\n\\t\\t\\t\\t\\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\\n\\t\\t\\t\\t\\t\\tswap( elem, cssShow, function() {\\n\\t\\t\\t\\t\\t\\t\\treturn getWidthOrHeight( elem, name, extra );\\n\\t\\t\\t\\t\\t\\t} ) :\\n\\t\\t\\t\\t\\t\\tgetWidthOrHeight( elem, name, extra );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tset: function( elem, value, extra ) {\\n\\t\\t\\tvar matches,\\n\\t\\t\\t\\tstyles = extra && getStyles( elem ),\\n\\t\\t\\t\\tsubtract = extra && augmentWidthOrHeight(\\n\\t\\t\\t\\t\\telem,\\n\\t\\t\\t\\t\\tname,\\n\\t\\t\\t\\t\\textra,\\n\\t\\t\\t\\t\\tjQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\",\\n\\t\\t\\t\\t\\tstyles\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t// Convert to pixels if value adjustment is needed\\n\\t\\t\\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\\n\\t\\t\\t\\t( matches[ 3 ] || \\\"px\\\" ) !== \\\"px\\\" ) {\\n\\n\\t\\t\\t\\telem.style[ name ] = value;\\n\\t\\t\\t\\tvalue = jQuery.css( elem, name );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn setPositiveNumber( elem, value, subtract );\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\\n\\tfunction( elem, computed ) {\\n\\t\\tif ( computed ) {\\n\\t\\t\\treturn ( parseFloat( curCSS( elem, \\\"marginLeft\\\" ) ) ||\\n\\t\\t\\t\\telem.getBoundingClientRect().left -\\n\\t\\t\\t\\t\\tswap( elem, { marginLeft: 0 }, function() {\\n\\t\\t\\t\\t\\t\\treturn elem.getBoundingClientRect().left;\\n\\t\\t\\t\\t\\t} )\\n\\t\\t\\t\\t) + \\\"px\\\";\\n\\t\\t}\\n\\t}\\n);\\n\\n// These hooks are used by animate to expand properties\\njQuery.each( {\\n\\tmargin: \\\"\\\",\\n\\tpadding: \\\"\\\",\\n\\tborder: \\\"Width\\\"\\n}, function( prefix, suffix ) {\\n\\tjQuery.cssHooks[ prefix + suffix ] = {\\n\\t\\texpand: function( value ) {\\n\\t\\t\\tvar i = 0,\\n\\t\\t\\t\\texpanded = {},\\n\\n\\t\\t\\t\\t// Assumes a single number if not a string\\n\\t\\t\\t\\tparts = typeof value === \\\"string\\\" ? value.split( \\\" \\\" ) : [ value ];\\n\\n\\t\\t\\tfor ( ; i < 4; i++ ) {\\n\\t\\t\\t\\texpanded[ prefix + cssExpand[ i ] + suffix ] =\\n\\t\\t\\t\\t\\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn expanded;\\n\\t\\t}\\n\\t};\\n\\n\\tif ( !rmargin.test( prefix ) ) {\\n\\t\\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tcss: function( name, value ) {\\n\\t\\treturn access( this, function( elem, name, value ) {\\n\\t\\t\\tvar styles, len,\\n\\t\\t\\t\\tmap = {},\\n\\t\\t\\t\\ti = 0;\\n\\n\\t\\t\\tif ( Array.isArray( name ) ) {\\n\\t\\t\\t\\tstyles = getStyles( elem );\\n\\t\\t\\t\\tlen = name.length;\\n\\n\\t\\t\\t\\tfor ( ; i < len; i++ ) {\\n\\t\\t\\t\\t\\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn map;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn value !== undefined ?\\n\\t\\t\\t\\tjQuery.style( elem, name, value ) :\\n\\t\\t\\t\\tjQuery.css( elem, name );\\n\\t\\t}, name, value, arguments.length > 1 );\\n\\t}\\n} );\\n\\n\\nfunction Tween( elem, options, prop, end, easing ) {\\n\\treturn new Tween.prototype.init( elem, options, prop, end, easing );\\n}\\njQuery.Tween = Tween;\\n\\nTween.prototype = {\\n\\tconstructor: Tween,\\n\\tinit: function( elem, options, prop, end, easing, unit ) {\\n\\t\\tthis.elem = elem;\\n\\t\\tthis.prop = prop;\\n\\t\\tthis.easing = easing || jQuery.easing._default;\\n\\t\\tthis.options = options;\\n\\t\\tthis.start = this.now = this.cur();\\n\\t\\tthis.end = end;\\n\\t\\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \\\"\\\" : \\\"px\\\" );\\n\\t},\\n\\tcur: function() {\\n\\t\\tvar hooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\treturn hooks && hooks.get ?\\n\\t\\t\\thooks.get( this ) :\\n\\t\\t\\tTween.propHooks._default.get( this );\\n\\t},\\n\\trun: function( percent ) {\\n\\t\\tvar eased,\\n\\t\\t\\thooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\tif ( this.options.duration ) {\\n\\t\\t\\tthis.pos = eased = jQuery.easing[ this.easing ](\\n\\t\\t\\t\\tpercent, this.options.duration * percent, 0, 1, this.options.duration\\n\\t\\t\\t);\\n\\t\\t} else {\\n\\t\\t\\tthis.pos = eased = percent;\\n\\t\\t}\\n\\t\\tthis.now = ( this.end - this.start ) * eased + this.start;\\n\\n\\t\\tif ( this.options.step ) {\\n\\t\\t\\tthis.options.step.call( this.elem, this.now, this );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && hooks.set ) {\\n\\t\\t\\thooks.set( this );\\n\\t\\t} else {\\n\\t\\t\\tTween.propHooks._default.set( this );\\n\\t\\t}\\n\\t\\treturn this;\\n\\t}\\n};\\n\\nTween.prototype.init.prototype = Tween.prototype;\\n\\nTween.propHooks = {\\n\\t_default: {\\n\\t\\tget: function( tween ) {\\n\\t\\t\\tvar result;\\n\\n\\t\\t\\t// Use a property on the element directly when it is not a DOM element,\\n\\t\\t\\t// or when there is no matching style property that exists.\\n\\t\\t\\tif ( tween.elem.nodeType !== 1 ||\\n\\t\\t\\t\\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\\n\\t\\t\\t\\treturn tween.elem[ tween.prop ];\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Passing an empty string as a 3rd parameter to .css will automatically\\n\\t\\t\\t// attempt a parseFloat and fallback to a string if the parse fails.\\n\\t\\t\\t// Simple values such as \\\"10px\\\" are parsed to Float;\\n\\t\\t\\t// complex values such as \\\"rotate(1rad)\\\" are returned as-is.\\n\\t\\t\\tresult = jQuery.css( tween.elem, tween.prop, \\\"\\\" );\\n\\n\\t\\t\\t// Empty strings, null, undefined and \\\"auto\\\" are converted to 0.\\n\\t\\t\\treturn !result || result === \\\"auto\\\" ? 0 : result;\\n\\t\\t},\\n\\t\\tset: function( tween ) {\\n\\n\\t\\t\\t// Use step hook for back compat.\\n\\t\\t\\t// Use cssHook if its there.\\n\\t\\t\\t// Use .style if available and use plain properties where available.\\n\\t\\t\\tif ( jQuery.fx.step[ tween.prop ] ) {\\n\\t\\t\\t\\tjQuery.fx.step[ tween.prop ]( tween );\\n\\t\\t\\t} else if ( tween.elem.nodeType === 1 &&\\n\\t\\t\\t\\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\\n\\t\\t\\t\\t\\tjQuery.cssHooks[ tween.prop ] ) ) {\\n\\t\\t\\t\\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\n// Support: IE <=9 only\\n// Panic based approach to setting things on disconnected nodes\\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\\n\\tset: function( tween ) {\\n\\t\\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\\n\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.easing = {\\n\\tlinear: function( p ) {\\n\\t\\treturn p;\\n\\t},\\n\\tswing: function( p ) {\\n\\t\\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\\n\\t},\\n\\t_default: \\\"swing\\\"\\n};\\n\\njQuery.fx = Tween.prototype.init;\\n\\n// Back compat <1.8 extension point\\njQuery.fx.step = {};\\n\\n\\n\\n\\nvar\\n\\tfxNow, inProgress,\\n\\trfxtypes = /^(?:toggle|show|hide)$/,\\n\\trrun = /queueHooks$/;\\n\\nfunction schedule() {\\n\\tif ( inProgress ) {\\n\\t\\tif ( document.hidden === false && window.requestAnimationFrame ) {\\n\\t\\t\\twindow.requestAnimationFrame( schedule );\\n\\t\\t} else {\\n\\t\\t\\twindow.setTimeout( schedule, jQuery.fx.interval );\\n\\t\\t}\\n\\n\\t\\tjQuery.fx.tick();\\n\\t}\\n}\\n\\n// Animations created synchronously will run synchronously\\nfunction createFxNow() {\\n\\twindow.setTimeout( function() {\\n\\t\\tfxNow = undefined;\\n\\t} );\\n\\treturn ( fxNow = jQuery.now() );\\n}\\n\\n// Generate parameters to create a standard animation\\nfunction genFx( type, includeWidth ) {\\n\\tvar which,\\n\\t\\ti = 0,\\n\\t\\tattrs = { height: type };\\n\\n\\t// If we include width, step value is 1 to do all cssExpand values,\\n\\t// otherwise step value is 2 to skip over Left and Right\\n\\tincludeWidth = includeWidth ? 1 : 0;\\n\\tfor ( ; i < 4; i += 2 - includeWidth ) {\\n\\t\\twhich = cssExpand[ i ];\\n\\t\\tattrs[ \\\"margin\\\" + which ] = attrs[ \\\"padding\\\" + which ] = type;\\n\\t}\\n\\n\\tif ( includeWidth ) {\\n\\t\\tattrs.opacity = attrs.width = type;\\n\\t}\\n\\n\\treturn attrs;\\n}\\n\\nfunction createTween( value, prop, animation ) {\\n\\tvar tween,\\n\\t\\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \\\"*\\\" ] ),\\n\\t\\tindex = 0,\\n\\t\\tlength = collection.length;\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\\n\\n\\t\\t\\t// We're done with this property\\n\\t\\t\\treturn tween;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction defaultPrefilter( elem, props, opts ) {\\n\\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\\n\\t\\tisBox = \\\"width\\\" in props || \\\"height\\\" in props,\\n\\t\\tanim = this,\\n\\t\\torig = {},\\n\\t\\tstyle = elem.style,\\n\\t\\thidden = elem.nodeType && isHiddenWithinTree( elem ),\\n\\t\\tdataShow = dataPriv.get( elem, \\\"fxshow\\\" );\\n\\n\\t// Queue-skipping animations hijack the fx hooks\\n\\tif ( !opts.queue ) {\\n\\t\\thooks = jQuery._queueHooks( elem, \\\"fx\\\" );\\n\\t\\tif ( hooks.unqueued == null ) {\\n\\t\\t\\thooks.unqueued = 0;\\n\\t\\t\\toldfire = hooks.empty.fire;\\n\\t\\t\\thooks.empty.fire = function() {\\n\\t\\t\\t\\tif ( !hooks.unqueued ) {\\n\\t\\t\\t\\t\\toldfire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t}\\n\\t\\thooks.unqueued++;\\n\\n\\t\\tanim.always( function() {\\n\\n\\t\\t\\t// Ensure the complete handler is called before this completes\\n\\t\\t\\tanim.always( function() {\\n\\t\\t\\t\\thooks.unqueued--;\\n\\t\\t\\t\\tif ( !jQuery.queue( elem, \\\"fx\\\" ).length ) {\\n\\t\\t\\t\\t\\thooks.empty.fire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t} );\\n\\t}\\n\\n\\t// Detect show/hide animations\\n\\tfor ( prop in props ) {\\n\\t\\tvalue = props[ prop ];\\n\\t\\tif ( rfxtypes.test( value ) ) {\\n\\t\\t\\tdelete props[ prop ];\\n\\t\\t\\ttoggle = toggle || value === \\\"toggle\\\";\\n\\t\\t\\tif ( value === ( hidden ? \\\"hide\\\" : \\\"show\\\" ) ) {\\n\\n\\t\\t\\t\\t// Pretend to be hidden if this is a \\\"show\\\" and\\n\\t\\t\\t\\t// there is still data from a stopped show/hide\\n\\t\\t\\t\\tif ( value === \\\"show\\\" && dataShow && dataShow[ prop ] !== undefined ) {\\n\\t\\t\\t\\t\\thidden = true;\\n\\n\\t\\t\\t\\t// Ignore all other no-op show/hide data\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\\n\\t\\t}\\n\\t}\\n\\n\\t// Bail out if this is a no-op like .hide().hide()\\n\\tpropTween = !jQuery.isEmptyObject( props );\\n\\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// Restrict \\\"overflow\\\" and \\\"display\\\" styles during box animations\\n\\tif ( isBox && elem.nodeType === 1 ) {\\n\\n\\t\\t// Support: IE <=9 - 11, Edge 12 - 13\\n\\t\\t// Record all 3 overflow attributes because IE does not infer the shorthand\\n\\t\\t// from identically-valued overflowX and overflowY\\n\\t\\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\\n\\n\\t\\t// Identify a display type, preferring old show/hide data over the CSS cascade\\n\\t\\trestoreDisplay = dataShow && dataShow.display;\\n\\t\\tif ( restoreDisplay == null ) {\\n\\t\\t\\trestoreDisplay = dataPriv.get( elem, \\\"display\\\" );\\n\\t\\t}\\n\\t\\tdisplay = jQuery.css( elem, \\\"display\\\" );\\n\\t\\tif ( display === \\\"none\\\" ) {\\n\\t\\t\\tif ( restoreDisplay ) {\\n\\t\\t\\t\\tdisplay = restoreDisplay;\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Get nonempty value(s) by temporarily forcing visibility\\n\\t\\t\\t\\tshowHide( [ elem ], true );\\n\\t\\t\\t\\trestoreDisplay = elem.style.display || restoreDisplay;\\n\\t\\t\\t\\tdisplay = jQuery.css( elem, \\\"display\\\" );\\n\\t\\t\\t\\tshowHide( [ elem ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Animate inline elements as inline-block\\n\\t\\tif ( display === \\\"inline\\\" || display === \\\"inline-block\\\" && restoreDisplay != null ) {\\n\\t\\t\\tif ( jQuery.css( elem, \\\"float\\\" ) === \\\"none\\\" ) {\\n\\n\\t\\t\\t\\t// Restore the original display value at the end of pure show/hide animations\\n\\t\\t\\t\\tif ( !propTween ) {\\n\\t\\t\\t\\t\\tanim.done( function() {\\n\\t\\t\\t\\t\\t\\tstyle.display = restoreDisplay;\\n\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\tif ( restoreDisplay == null ) {\\n\\t\\t\\t\\t\\t\\tdisplay = style.display;\\n\\t\\t\\t\\t\\t\\trestoreDisplay = display === \\\"none\\\" ? \\\"\\\" : display;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tstyle.display = \\\"inline-block\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tif ( opts.overflow ) {\\n\\t\\tstyle.overflow = \\\"hidden\\\";\\n\\t\\tanim.always( function() {\\n\\t\\t\\tstyle.overflow = opts.overflow[ 0 ];\\n\\t\\t\\tstyle.overflowX = opts.overflow[ 1 ];\\n\\t\\t\\tstyle.overflowY = opts.overflow[ 2 ];\\n\\t\\t} );\\n\\t}\\n\\n\\t// Implement show/hide animations\\n\\tpropTween = false;\\n\\tfor ( prop in orig ) {\\n\\n\\t\\t// General show/hide setup for this element animation\\n\\t\\tif ( !propTween ) {\\n\\t\\t\\tif ( dataShow ) {\\n\\t\\t\\t\\tif ( \\\"hidden\\\" in dataShow ) {\\n\\t\\t\\t\\t\\thidden = dataShow.hidden;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdataShow = dataPriv.access( elem, \\\"fxshow\\\", { display: restoreDisplay } );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Store hidden/visible for toggle so `.stop().toggle()` \\\"reverses\\\"\\n\\t\\t\\tif ( toggle ) {\\n\\t\\t\\t\\tdataShow.hidden = !hidden;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Show elements before animating them\\n\\t\\t\\tif ( hidden ) {\\n\\t\\t\\t\\tshowHide( [ elem ], true );\\n\\t\\t\\t}\\n\\n\\t\\t\\t/* eslint-disable no-loop-func */\\n\\n\\t\\t\\tanim.done( function() {\\n\\n\\t\\t\\t/* eslint-enable no-loop-func */\\n\\n\\t\\t\\t\\t// The final step of a \\\"hide\\\" animation is actually hiding the element\\n\\t\\t\\t\\tif ( !hidden ) {\\n\\t\\t\\t\\t\\tshowHide( [ elem ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataPriv.remove( elem, \\\"fxshow\\\" );\\n\\t\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\t\\tjQuery.style( elem, prop, orig[ prop ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\t// Per-property setup\\n\\t\\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\\n\\t\\tif ( !( prop in dataShow ) ) {\\n\\t\\t\\tdataShow[ prop ] = propTween.start;\\n\\t\\t\\tif ( hidden ) {\\n\\t\\t\\t\\tpropTween.end = propTween.start;\\n\\t\\t\\t\\tpropTween.start = 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction propFilter( props, specialEasing ) {\\n\\tvar index, name, easing, value, hooks;\\n\\n\\t// camelCase, specialEasing and expand cssHook pass\\n\\tfor ( index in props ) {\\n\\t\\tname = jQuery.camelCase( index );\\n\\t\\teasing = specialEasing[ name ];\\n\\t\\tvalue = props[ index ];\\n\\t\\tif ( Array.isArray( value ) ) {\\n\\t\\t\\teasing = value[ 1 ];\\n\\t\\t\\tvalue = props[ index ] = value[ 0 ];\\n\\t\\t}\\n\\n\\t\\tif ( index !== name ) {\\n\\t\\t\\tprops[ name ] = value;\\n\\t\\t\\tdelete props[ index ];\\n\\t\\t}\\n\\n\\t\\thooks = jQuery.cssHooks[ name ];\\n\\t\\tif ( hooks && \\\"expand\\\" in hooks ) {\\n\\t\\t\\tvalue = hooks.expand( value );\\n\\t\\t\\tdelete props[ name ];\\n\\n\\t\\t\\t// Not quite $.extend, this won't overwrite existing keys.\\n\\t\\t\\t// Reusing 'index' because we have the correct \\\"name\\\"\\n\\t\\t\\tfor ( index in value ) {\\n\\t\\t\\t\\tif ( !( index in props ) ) {\\n\\t\\t\\t\\t\\tprops[ index ] = value[ index ];\\n\\t\\t\\t\\t\\tspecialEasing[ index ] = easing;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tspecialEasing[ name ] = easing;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction Animation( elem, properties, options ) {\\n\\tvar result,\\n\\t\\tstopped,\\n\\t\\tindex = 0,\\n\\t\\tlength = Animation.prefilters.length,\\n\\t\\tdeferred = jQuery.Deferred().always( function() {\\n\\n\\t\\t\\t// Don't match elem in the :animated selector\\n\\t\\t\\tdelete tick.elem;\\n\\t\\t} ),\\n\\t\\ttick = function() {\\n\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\tvar currentTime = fxNow || createFxNow(),\\n\\t\\t\\t\\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\\n\\n\\t\\t\\t\\t// Support: Android 2.3 only\\n\\t\\t\\t\\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\\n\\t\\t\\t\\ttemp = remaining / animation.duration || 0,\\n\\t\\t\\t\\tpercent = 1 - temp,\\n\\t\\t\\t\\tindex = 0,\\n\\t\\t\\t\\tlength = animation.tweens.length;\\n\\n\\t\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\t\\tanimation.tweens[ index ].run( percent );\\n\\t\\t\\t}\\n\\n\\t\\t\\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\\n\\n\\t\\t\\t// If there's more to do, yield\\n\\t\\t\\tif ( percent < 1 && length ) {\\n\\t\\t\\t\\treturn remaining;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If this was an empty animation, synthesize a final progress notification\\n\\t\\t\\tif ( !length ) {\\n\\t\\t\\t\\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Resolve the animation and report its conclusion\\n\\t\\t\\tdeferred.resolveWith( elem, [ animation ] );\\n\\t\\t\\treturn false;\\n\\t\\t},\\n\\t\\tanimation = deferred.promise( {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tprops: jQuery.extend( {}, properties ),\\n\\t\\t\\topts: jQuery.extend( true, {\\n\\t\\t\\t\\tspecialEasing: {},\\n\\t\\t\\t\\teasing: jQuery.easing._default\\n\\t\\t\\t}, options ),\\n\\t\\t\\toriginalProperties: properties,\\n\\t\\t\\toriginalOptions: options,\\n\\t\\t\\tstartTime: fxNow || createFxNow(),\\n\\t\\t\\tduration: options.duration,\\n\\t\\t\\ttweens: [],\\n\\t\\t\\tcreateTween: function( prop, end ) {\\n\\t\\t\\t\\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\\n\\t\\t\\t\\t\\t\\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\\n\\t\\t\\t\\tanimation.tweens.push( tween );\\n\\t\\t\\t\\treturn tween;\\n\\t\\t\\t},\\n\\t\\t\\tstop: function( gotoEnd ) {\\n\\t\\t\\t\\tvar index = 0,\\n\\n\\t\\t\\t\\t\\t// If we are going to the end, we want to run all the tweens\\n\\t\\t\\t\\t\\t// otherwise we skip this part\\n\\t\\t\\t\\t\\tlength = gotoEnd ? animation.tweens.length : 0;\\n\\t\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tstopped = true;\\n\\t\\t\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\t\\t\\tanimation.tweens[ index ].run( 1 );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Resolve when we played the last frame; otherwise, reject\\n\\t\\t\\t\\tif ( gotoEnd ) {\\n\\t\\t\\t\\t\\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\\n\\t\\t\\t\\t\\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t}\\n\\t\\t} ),\\n\\t\\tprops = animation.props;\\n\\n\\tpropFilter( props, animation.opts.specialEasing );\\n\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\\n\\t\\tif ( result ) {\\n\\t\\t\\tif ( jQuery.isFunction( result.stop ) ) {\\n\\t\\t\\t\\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\\n\\t\\t\\t\\t\\tjQuery.proxy( result.stop, result );\\n\\t\\t\\t}\\n\\t\\t\\treturn result;\\n\\t\\t}\\n\\t}\\n\\n\\tjQuery.map( props, createTween, animation );\\n\\n\\tif ( jQuery.isFunction( animation.opts.start ) ) {\\n\\t\\tanimation.opts.start.call( elem, animation );\\n\\t}\\n\\n\\t// Attach callbacks from options\\n\\tanimation\\n\\t\\t.progress( animation.opts.progress )\\n\\t\\t.done( animation.opts.done, animation.opts.complete )\\n\\t\\t.fail( animation.opts.fail )\\n\\t\\t.always( animation.opts.always );\\n\\n\\tjQuery.fx.timer(\\n\\t\\tjQuery.extend( tick, {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tanim: animation,\\n\\t\\t\\tqueue: animation.opts.queue\\n\\t\\t} )\\n\\t);\\n\\n\\treturn animation;\\n}\\n\\njQuery.Animation = jQuery.extend( Animation, {\\n\\n\\ttweeners: {\\n\\t\\t\\\"*\\\": [ function( prop, value ) {\\n\\t\\t\\tvar tween = this.createTween( prop, value );\\n\\t\\t\\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\\n\\t\\t\\treturn tween;\\n\\t\\t} ]\\n\\t},\\n\\n\\ttweener: function( props, callback ) {\\n\\t\\tif ( jQuery.isFunction( props ) ) {\\n\\t\\t\\tcallback = props;\\n\\t\\t\\tprops = [ \\\"*\\\" ];\\n\\t\\t} else {\\n\\t\\t\\tprops = props.match( rnothtmlwhite );\\n\\t\\t}\\n\\n\\t\\tvar prop,\\n\\t\\t\\tindex = 0,\\n\\t\\t\\tlength = props.length;\\n\\n\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\tprop = props[ index ];\\n\\t\\t\\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\\n\\t\\t\\tAnimation.tweeners[ prop ].unshift( callback );\\n\\t\\t}\\n\\t},\\n\\n\\tprefilters: [ defaultPrefilter ],\\n\\n\\tprefilter: function( callback, prepend ) {\\n\\t\\tif ( prepend ) {\\n\\t\\t\\tAnimation.prefilters.unshift( callback );\\n\\t\\t} else {\\n\\t\\t\\tAnimation.prefilters.push( callback );\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.speed = function( speed, easing, fn ) {\\n\\tvar opt = speed && typeof speed === \\\"object\\\" ? jQuery.extend( {}, speed ) : {\\n\\t\\tcomplete: fn || !fn && easing ||\\n\\t\\t\\tjQuery.isFunction( speed ) && speed,\\n\\t\\tduration: speed,\\n\\t\\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\\n\\t};\\n\\n\\t// Go to the end state if fx are off\\n\\tif ( jQuery.fx.off ) {\\n\\t\\topt.duration = 0;\\n\\n\\t} else {\\n\\t\\tif ( typeof opt.duration !== \\\"number\\\" ) {\\n\\t\\t\\tif ( opt.duration in jQuery.fx.speeds ) {\\n\\t\\t\\t\\topt.duration = jQuery.fx.speeds[ opt.duration ];\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\topt.duration = jQuery.fx.speeds._default;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Normalize opt.queue - true/undefined/null -> \\\"fx\\\"\\n\\tif ( opt.queue == null || opt.queue === true ) {\\n\\t\\topt.queue = \\\"fx\\\";\\n\\t}\\n\\n\\t// Queueing\\n\\topt.old = opt.complete;\\n\\n\\topt.complete = function() {\\n\\t\\tif ( jQuery.isFunction( opt.old ) ) {\\n\\t\\t\\topt.old.call( this );\\n\\t\\t}\\n\\n\\t\\tif ( opt.queue ) {\\n\\t\\t\\tjQuery.dequeue( this, opt.queue );\\n\\t\\t}\\n\\t};\\n\\n\\treturn opt;\\n};\\n\\njQuery.fn.extend( {\\n\\tfadeTo: function( speed, to, easing, callback ) {\\n\\n\\t\\t// Show any hidden elements after setting opacity to 0\\n\\t\\treturn this.filter( isHiddenWithinTree ).css( \\\"opacity\\\", 0 ).show()\\n\\n\\t\\t\\t// Animate to the value specified\\n\\t\\t\\t.end().animate( { opacity: to }, speed, easing, callback );\\n\\t},\\n\\tanimate: function( prop, speed, easing, callback ) {\\n\\t\\tvar empty = jQuery.isEmptyObject( prop ),\\n\\t\\t\\toptall = jQuery.speed( speed, easing, callback ),\\n\\t\\t\\tdoAnimation = function() {\\n\\n\\t\\t\\t\\t// Operate on a copy of prop so per-property easing won't be lost\\n\\t\\t\\t\\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\\n\\n\\t\\t\\t\\t// Empty animations, or finishing resolves immediately\\n\\t\\t\\t\\tif ( empty || dataPriv.get( this, \\\"finish\\\" ) ) {\\n\\t\\t\\t\\t\\tanim.stop( true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t\\tdoAnimation.finish = doAnimation;\\n\\n\\t\\treturn empty || optall.queue === false ?\\n\\t\\t\\tthis.each( doAnimation ) :\\n\\t\\t\\tthis.queue( optall.queue, doAnimation );\\n\\t},\\n\\tstop: function( type, clearQueue, gotoEnd ) {\\n\\t\\tvar stopQueue = function( hooks ) {\\n\\t\\t\\tvar stop = hooks.stop;\\n\\t\\t\\tdelete hooks.stop;\\n\\t\\t\\tstop( gotoEnd );\\n\\t\\t};\\n\\n\\t\\tif ( typeof type !== \\\"string\\\" ) {\\n\\t\\t\\tgotoEnd = clearQueue;\\n\\t\\t\\tclearQueue = type;\\n\\t\\t\\ttype = undefined;\\n\\t\\t}\\n\\t\\tif ( clearQueue && type !== false ) {\\n\\t\\t\\tthis.queue( type || \\\"fx\\\", [] );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar dequeue = true,\\n\\t\\t\\t\\tindex = type != null && type + \\\"queueHooks\\\",\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tdata = dataPriv.get( this );\\n\\n\\t\\t\\tif ( index ) {\\n\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop ) {\\n\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tfor ( index in data ) {\\n\\t\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\\n\\t\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this &&\\n\\t\\t\\t\\t\\t( type == null || timers[ index ].queue === type ) ) {\\n\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( gotoEnd );\\n\\t\\t\\t\\t\\tdequeue = false;\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Start the next in the queue if the last step wasn't forced.\\n\\t\\t\\t// Timers currently will call their complete callbacks, which\\n\\t\\t\\t// will dequeue but only if they were gotoEnd.\\n\\t\\t\\tif ( dequeue || !gotoEnd ) {\\n\\t\\t\\t\\tjQuery.dequeue( this, type );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\tfinish: function( type ) {\\n\\t\\tif ( type !== false ) {\\n\\t\\t\\ttype = type || \\\"fx\\\";\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar index,\\n\\t\\t\\t\\tdata = dataPriv.get( this ),\\n\\t\\t\\t\\tqueue = data[ type + \\\"queue\\\" ],\\n\\t\\t\\t\\thooks = data[ type + \\\"queueHooks\\\" ],\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tlength = queue ? queue.length : 0;\\n\\n\\t\\t\\t// Enable finishing flag on private data\\n\\t\\t\\tdata.finish = true;\\n\\n\\t\\t\\t// Empty the queue first\\n\\t\\t\\tjQuery.queue( this, type, [] );\\n\\n\\t\\t\\tif ( hooks && hooks.stop ) {\\n\\t\\t\\t\\thooks.stop.call( this, true );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any active animations, and finish them\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( true );\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any animations in the old queue and finish them\\n\\t\\t\\tfor ( index = 0; index < length; index++ ) {\\n\\t\\t\\t\\tif ( queue[ index ] && queue[ index ].finish ) {\\n\\t\\t\\t\\t\\tqueue[ index ].finish.call( this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Turn off finishing flag\\n\\t\\t\\tdelete data.finish;\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"toggle\\\", \\\"show\\\", \\\"hide\\\" ], function( i, name ) {\\n\\tvar cssFn = jQuery.fn[ name ];\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn speed == null || typeof speed === \\\"boolean\\\" ?\\n\\t\\t\\tcssFn.apply( this, arguments ) :\\n\\t\\t\\tthis.animate( genFx( name, true ), speed, easing, callback );\\n\\t};\\n} );\\n\\n// Generate shortcuts for custom animations\\njQuery.each( {\\n\\tslideDown: genFx( \\\"show\\\" ),\\n\\tslideUp: genFx( \\\"hide\\\" ),\\n\\tslideToggle: genFx( \\\"toggle\\\" ),\\n\\tfadeIn: { opacity: \\\"show\\\" },\\n\\tfadeOut: { opacity: \\\"hide\\\" },\\n\\tfadeToggle: { opacity: \\\"toggle\\\" }\\n}, function( name, props ) {\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn this.animate( props, speed, easing, callback );\\n\\t};\\n} );\\n\\njQuery.timers = [];\\njQuery.fx.tick = function() {\\n\\tvar timer,\\n\\t\\ti = 0,\\n\\t\\ttimers = jQuery.timers;\\n\\n\\tfxNow = jQuery.now();\\n\\n\\tfor ( ; i < timers.length; i++ ) {\\n\\t\\ttimer = timers[ i ];\\n\\n\\t\\t// Run the timer and safely remove it when done (allowing for external removal)\\n\\t\\tif ( !timer() && timers[ i ] === timer ) {\\n\\t\\t\\ttimers.splice( i--, 1 );\\n\\t\\t}\\n\\t}\\n\\n\\tif ( !timers.length ) {\\n\\t\\tjQuery.fx.stop();\\n\\t}\\n\\tfxNow = undefined;\\n};\\n\\njQuery.fx.timer = function( timer ) {\\n\\tjQuery.timers.push( timer );\\n\\tjQuery.fx.start();\\n};\\n\\njQuery.fx.interval = 13;\\njQuery.fx.start = function() {\\n\\tif ( inProgress ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\tinProgress = true;\\n\\tschedule();\\n};\\n\\njQuery.fx.stop = function() {\\n\\tinProgress = null;\\n};\\n\\njQuery.fx.speeds = {\\n\\tslow: 600,\\n\\tfast: 200,\\n\\n\\t// Default speed\\n\\t_default: 400\\n};\\n\\n\\n// Based off of the plugin by Clint Helfers, with permission.\\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\\njQuery.fn.delay = function( time, type ) {\\n\\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\\n\\ttype = type || \\\"fx\\\";\\n\\n\\treturn this.queue( type, function( next, hooks ) {\\n\\t\\tvar timeout = window.setTimeout( next, time );\\n\\t\\thooks.stop = function() {\\n\\t\\t\\twindow.clearTimeout( timeout );\\n\\t\\t};\\n\\t} );\\n};\\n\\n\\n( function() {\\n\\tvar input = document.createElement( \\\"input\\\" ),\\n\\t\\tselect = document.createElement( \\\"select\\\" ),\\n\\t\\topt = select.appendChild( document.createElement( \\\"option\\\" ) );\\n\\n\\tinput.type = \\\"checkbox\\\";\\n\\n\\t// Support: Android <=4.3 only\\n\\t// Default value for a checkbox should be \\\"on\\\"\\n\\tsupport.checkOn = input.value !== \\\"\\\";\\n\\n\\t// Support: IE <=11 only\\n\\t// Must access selectedIndex to make default options select\\n\\tsupport.optSelected = opt.selected;\\n\\n\\t// Support: IE <=11 only\\n\\t// An input loses its value after becoming a radio\\n\\tinput = document.createElement( \\\"input\\\" );\\n\\tinput.value = \\\"t\\\";\\n\\tinput.type = \\\"radio\\\";\\n\\tsupport.radioValue = input.value === \\\"t\\\";\\n} )();\\n\\n\\nvar boolHook,\\n\\tattrHandle = jQuery.expr.attrHandle;\\n\\njQuery.fn.extend( {\\n\\tattr: function( name, value ) {\\n\\t\\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveAttr: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.removeAttr( this, name );\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tattr: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set attributes on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Fallback to prop when attributes are not supported\\n\\t\\tif ( typeof elem.getAttribute === \\\"undefined\\\" ) {\\n\\t\\t\\treturn jQuery.prop( elem, name, value );\\n\\t\\t}\\n\\n\\t\\t// Attribute hooks are determined by the lowercase version\\n\\t\\t// Grab necessary hook if one is defined\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\t\\t\\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\\n\\t\\t\\t\\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( value === null ) {\\n\\t\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\telem.setAttribute( name, value + \\\"\\\" );\\n\\t\\t\\treturn value;\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\tret = jQuery.find.attr( elem, name );\\n\\n\\t\\t// Non-existent attributes return null, we normalize to undefined\\n\\t\\treturn ret == null ? undefined : ret;\\n\\t},\\n\\n\\tattrHooks: {\\n\\t\\ttype: {\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tif ( !support.radioValue && value === \\\"radio\\\" &&\\n\\t\\t\\t\\t\\tnodeName( elem, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tvar val = elem.value;\\n\\t\\t\\t\\t\\telem.setAttribute( \\\"type\\\", value );\\n\\t\\t\\t\\t\\tif ( val ) {\\n\\t\\t\\t\\t\\t\\telem.value = val;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tremoveAttr: function( elem, value ) {\\n\\t\\tvar name,\\n\\t\\t\\ti = 0,\\n\\n\\t\\t\\t// Attribute names can contain non-HTML whitespace characters\\n\\t\\t\\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\\n\\t\\t\\tattrNames = value && value.match( rnothtmlwhite );\\n\\n\\t\\tif ( attrNames && elem.nodeType === 1 ) {\\n\\t\\t\\twhile ( ( name = attrNames[ i++ ] ) ) {\\n\\t\\t\\t\\telem.removeAttribute( name );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Hooks for boolean attributes\\nboolHook = {\\n\\tset: function( elem, value, name ) {\\n\\t\\tif ( value === false ) {\\n\\n\\t\\t\\t// Remove boolean attributes when set to false\\n\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t} else {\\n\\t\\t\\telem.setAttribute( name, name );\\n\\t\\t}\\n\\t\\treturn name;\\n\\t}\\n};\\n\\njQuery.each( jQuery.expr.match.bool.source.match( /\\\\w+/g ), function( i, name ) {\\n\\tvar getter = attrHandle[ name ] || jQuery.find.attr;\\n\\n\\tattrHandle[ name ] = function( elem, name, isXML ) {\\n\\t\\tvar ret, handle,\\n\\t\\t\\tlowercaseName = name.toLowerCase();\\n\\n\\t\\tif ( !isXML ) {\\n\\n\\t\\t\\t// Avoid an infinite loop by temporarily removing this function from the getter\\n\\t\\t\\thandle = attrHandle[ lowercaseName ];\\n\\t\\t\\tattrHandle[ lowercaseName ] = ret;\\n\\t\\t\\tret = getter( elem, name, isXML ) != null ?\\n\\t\\t\\t\\tlowercaseName :\\n\\t\\t\\t\\tnull;\\n\\t\\t\\tattrHandle[ lowercaseName ] = handle;\\n\\t\\t}\\n\\t\\treturn ret;\\n\\t};\\n} );\\n\\n\\n\\n\\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\\n\\trclickable = /^(?:a|area)$/i;\\n\\njQuery.fn.extend( {\\n\\tprop: function( name, value ) {\\n\\t\\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveProp: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tdelete this[ jQuery.propFix[ name ] || name ];\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tprop: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set properties on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// Fix name and attach hooks\\n\\t\\t\\tname = jQuery.propFix[ name ] || name;\\n\\t\\t\\thooks = jQuery.propHooks[ name ];\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn ( elem[ name ] = value );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\treturn elem[ name ];\\n\\t},\\n\\n\\tpropHooks: {\\n\\t\\ttabIndex: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\t// Support: IE <=9 - 11 only\\n\\t\\t\\t\\t// elem.tabIndex doesn't always return the\\n\\t\\t\\t\\t// correct value when it hasn't been explicitly set\\n\\t\\t\\t\\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\\n\\t\\t\\t\\t// Use proper attribute retrieval(#12072)\\n\\t\\t\\t\\tvar tabindex = jQuery.find.attr( elem, \\\"tabindex\\\" );\\n\\n\\t\\t\\t\\tif ( tabindex ) {\\n\\t\\t\\t\\t\\treturn parseInt( tabindex, 10 );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tif (\\n\\t\\t\\t\\t\\trfocusable.test( elem.nodeName ) ||\\n\\t\\t\\t\\t\\trclickable.test( elem.nodeName ) &&\\n\\t\\t\\t\\t\\telem.href\\n\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\treturn 0;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn -1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tpropFix: {\\n\\t\\t\\\"for\\\": \\\"htmlFor\\\",\\n\\t\\t\\\"class\\\": \\\"className\\\"\\n\\t}\\n} );\\n\\n// Support: IE <=11 only\\n// Accessing the selectedIndex property\\n// forces the browser to respect setting selected\\n// on the option\\n// The getter ensures a default option is selected\\n// when in an optgroup\\n// eslint rule \\\"no-unused-expressions\\\" is disabled for this code\\n// since it considers such accessions noop\\nif ( !support.optSelected ) {\\n\\tjQuery.propHooks.selected = {\\n\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t/* eslint no-unused-expressions: \\\"off\\\" */\\n\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent && parent.parentNode ) {\\n\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t}\\n\\t\\t\\treturn null;\\n\\t\\t},\\n\\t\\tset: function( elem ) {\\n\\n\\t\\t\\t/* eslint no-unused-expressions: \\\"off\\\" */\\n\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\tparent.selectedIndex;\\n\\n\\t\\t\\t\\tif ( parent.parentNode ) {\\n\\t\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\njQuery.each( [\\n\\t\\\"tabIndex\\\",\\n\\t\\\"readOnly\\\",\\n\\t\\\"maxLength\\\",\\n\\t\\\"cellSpacing\\\",\\n\\t\\\"cellPadding\\\",\\n\\t\\\"rowSpan\\\",\\n\\t\\\"colSpan\\\",\\n\\t\\\"useMap\\\",\\n\\t\\\"frameBorder\\\",\\n\\t\\\"contentEditable\\\"\\n], function() {\\n\\tjQuery.propFix[ this.toLowerCase() ] = this;\\n} );\\n\\n\\n\\n\\n\\t// Strip and collapse whitespace according to HTML spec\\n\\t// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace\\n\\tfunction stripAndCollapse( value ) {\\n\\t\\tvar tokens = value.match( rnothtmlwhite ) || [];\\n\\t\\treturn tokens.join( \\\" \\\" );\\n\\t}\\n\\n\\nfunction getClass( elem ) {\\n\\treturn elem.getAttribute && elem.getAttribute( \\\"class\\\" ) || \\\"\\\";\\n}\\n\\njQuery.fn.extend( {\\n\\taddClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\t\\t\\t\\tcur = elem.nodeType === 1 && ( \\\" \\\" + stripAndCollapse( curValue ) + \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\t\\t\\t\\t\\t\\tif ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) < 0 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur += clazz + \\\" \\\";\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = stripAndCollapse( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tremoveClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\treturn this.attr( \\\"class\\\", \\\"\\\" );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\n\\t\\t\\t\\t// This expression is here for better compressibility (see addClass)\\n\\t\\t\\t\\tcur = elem.nodeType === 1 && ( \\\" \\\" + stripAndCollapse( curValue ) + \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Remove *all* instances\\n\\t\\t\\t\\t\\t\\twhile ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) > -1 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur = cur.replace( \\\" \\\" + clazz + \\\" \\\", \\\" \\\" );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = stripAndCollapse( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\ttoggleClass: function( value, stateVal ) {\\n\\t\\tvar type = typeof value;\\n\\n\\t\\tif ( typeof stateVal === \\\"boolean\\\" && type === \\\"string\\\" ) {\\n\\t\\t\\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\\n\\t\\t}\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).toggleClass(\\n\\t\\t\\t\\t\\tvalue.call( this, i, getClass( this ), stateVal ),\\n\\t\\t\\t\\t\\tstateVal\\n\\t\\t\\t\\t);\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar className, i, self, classNames;\\n\\n\\t\\t\\tif ( type === \\\"string\\\" ) {\\n\\n\\t\\t\\t\\t// Toggle individual class names\\n\\t\\t\\t\\ti = 0;\\n\\t\\t\\t\\tself = jQuery( this );\\n\\t\\t\\t\\tclassNames = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\t\\twhile ( ( className = classNames[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t// Check each className given, space separated list\\n\\t\\t\\t\\t\\tif ( self.hasClass( className ) ) {\\n\\t\\t\\t\\t\\t\\tself.removeClass( className );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tself.addClass( className );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Toggle whole class name\\n\\t\\t\\t} else if ( value === undefined || type === \\\"boolean\\\" ) {\\n\\t\\t\\t\\tclassName = getClass( this );\\n\\t\\t\\t\\tif ( className ) {\\n\\n\\t\\t\\t\\t\\t// Store className if set\\n\\t\\t\\t\\t\\tdataPriv.set( this, \\\"__className__\\\", className );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// If the element has a class name or if we're passed `false`,\\n\\t\\t\\t\\t// then remove the whole classname (if there was one, the above saved it).\\n\\t\\t\\t\\t// Otherwise bring back whatever was previously saved (if anything),\\n\\t\\t\\t\\t// falling back to the empty string if nothing was stored.\\n\\t\\t\\t\\tif ( this.setAttribute ) {\\n\\t\\t\\t\\t\\tthis.setAttribute( \\\"class\\\",\\n\\t\\t\\t\\t\\t\\tclassName || value === false ?\\n\\t\\t\\t\\t\\t\\t\\\"\\\" :\\n\\t\\t\\t\\t\\t\\tdataPriv.get( this, \\\"__className__\\\" ) || \\\"\\\"\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\thasClass: function( selector ) {\\n\\t\\tvar className, elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tclassName = \\\" \\\" + selector + \\\" \\\";\\n\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\tif ( elem.nodeType === 1 &&\\n\\t\\t\\t\\t( \\\" \\\" + stripAndCollapse( getClass( elem ) ) + \\\" \\\" ).indexOf( className ) > -1 ) {\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn false;\\n\\t}\\n} );\\n\\n\\n\\n\\nvar rreturn = /\\\\r/g;\\n\\njQuery.fn.extend( {\\n\\tval: function( value ) {\\n\\t\\tvar hooks, ret, isFunction,\\n\\t\\t\\telem = this[ 0 ];\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\thooks = jQuery.valHooks[ elem.type ] ||\\n\\t\\t\\t\\t\\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t\\tif ( hooks &&\\n\\t\\t\\t\\t\\t\\\"get\\\" in hooks &&\\n\\t\\t\\t\\t\\t( ret = hooks.get( elem, \\\"value\\\" ) ) !== undefined\\n\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\treturn ret;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tret = elem.value;\\n\\n\\t\\t\\t\\t// Handle most common string cases\\n\\t\\t\\t\\tif ( typeof ret === \\\"string\\\" ) {\\n\\t\\t\\t\\t\\treturn ret.replace( rreturn, \\\"\\\" );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Handle cases where value is null/undef or number\\n\\t\\t\\t\\treturn ret == null ? \\\"\\\" : ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tvar val;\\n\\n\\t\\t\\tif ( this.nodeType !== 1 ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\tval = value.call( this, i, jQuery( this ).val() );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tval = value;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Treat null/undefined as \\\"\\\"; convert numbers to string\\n\\t\\t\\tif ( val == null ) {\\n\\t\\t\\t\\tval = \\\"\\\";\\n\\n\\t\\t\\t} else if ( typeof val === \\\"number\\\" ) {\\n\\t\\t\\t\\tval += \\\"\\\";\\n\\n\\t\\t\\t} else if ( Array.isArray( val ) ) {\\n\\t\\t\\t\\tval = jQuery.map( val, function( value ) {\\n\\t\\t\\t\\t\\treturn value == null ? \\\"\\\" : value + \\\"\\\";\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\n\\t\\t\\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t// If set returns undefined, fall back to normal setting\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) || hooks.set( this, val, \\\"value\\\" ) === undefined ) {\\n\\t\\t\\t\\tthis.value = val;\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tvalHooks: {\\n\\t\\toption: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\tvar val = jQuery.find.attr( elem, \\\"value\\\" );\\n\\t\\t\\t\\treturn val != null ?\\n\\t\\t\\t\\t\\tval :\\n\\n\\t\\t\\t\\t\\t// Support: IE <=10 - 11 only\\n\\t\\t\\t\\t\\t// option.text throws exceptions (#14686, #14858)\\n\\t\\t\\t\\t\\t// Strip and collapse whitespace\\n\\t\\t\\t\\t\\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\\n\\t\\t\\t\\t\\tstripAndCollapse( jQuery.text( elem ) );\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tselect: {\\n\\t\\t\\tget: function( elem ) {\\n\\t\\t\\t\\tvar value, option, i,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tindex = elem.selectedIndex,\\n\\t\\t\\t\\t\\tone = elem.type === \\\"select-one\\\",\\n\\t\\t\\t\\t\\tvalues = one ? null : [],\\n\\t\\t\\t\\t\\tmax = one ? index + 1 : options.length;\\n\\n\\t\\t\\t\\tif ( index < 0 ) {\\n\\t\\t\\t\\t\\ti = max;\\n\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ti = one ? index : 0;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Loop through all the selected options\\n\\t\\t\\t\\tfor ( ; i < max; i++ ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\n\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t// IE8-9 doesn't update selected after form reset (#2551)\\n\\t\\t\\t\\t\\tif ( ( option.selected || i === index ) &&\\n\\n\\t\\t\\t\\t\\t\\t\\t// Don't return options that are disabled or in a disabled optgroup\\n\\t\\t\\t\\t\\t\\t\\t!option.disabled &&\\n\\t\\t\\t\\t\\t\\t\\t( !option.parentNode.disabled ||\\n\\t\\t\\t\\t\\t\\t\\t\\t!nodeName( option.parentNode, \\\"optgroup\\\" ) ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Get the specific value for the option\\n\\t\\t\\t\\t\\t\\tvalue = jQuery( option ).val();\\n\\n\\t\\t\\t\\t\\t\\t// We don't need an array for one selects\\n\\t\\t\\t\\t\\t\\tif ( one ) {\\n\\t\\t\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// Multi-Selects return an array\\n\\t\\t\\t\\t\\t\\tvalues.push( value );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t},\\n\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tvar optionSet, option,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tvalues = jQuery.makeArray( value ),\\n\\t\\t\\t\\t\\ti = options.length;\\n\\n\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\n\\t\\t\\t\\t\\t/* eslint-disable no-cond-assign */\\n\\n\\t\\t\\t\\t\\tif ( option.selected =\\n\\t\\t\\t\\t\\t\\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\\n\\t\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\t\\toptionSet = true;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t/* eslint-enable no-cond-assign */\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Force browsers to behave consistently when non-matching value is set\\n\\t\\t\\t\\tif ( !optionSet ) {\\n\\t\\t\\t\\t\\telem.selectedIndex = -1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Radios and checkboxes getter/setter\\njQuery.each( [ \\\"radio\\\", \\\"checkbox\\\" ], function() {\\n\\tjQuery.valHooks[ this ] = {\\n\\t\\tset: function( elem, value ) {\\n\\t\\t\\tif ( Array.isArray( value ) ) {\\n\\t\\t\\t\\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\tif ( !support.checkOn ) {\\n\\t\\tjQuery.valHooks[ this ].get = function( elem ) {\\n\\t\\t\\treturn elem.getAttribute( \\\"value\\\" ) === null ? \\\"on\\\" : elem.value;\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Return jQuery for attributes-only inclusion\\n\\n\\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\\n\\njQuery.extend( jQuery.event, {\\n\\n\\ttrigger: function( event, data, elem, onlyHandlers ) {\\n\\n\\t\\tvar i, cur, tmp, bubbleType, ontype, handle, special,\\n\\t\\t\\teventPath = [ elem || document ],\\n\\t\\t\\ttype = hasOwn.call( event, \\\"type\\\" ) ? event.type : event,\\n\\t\\t\\tnamespaces = hasOwn.call( event, \\\"namespace\\\" ) ? event.namespace.split( \\\".\\\" ) : [];\\n\\n\\t\\tcur = tmp = elem = elem || document;\\n\\n\\t\\t// Don't do events on text and comment nodes\\n\\t\\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\\n\\t\\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( type.indexOf( \\\".\\\" ) > -1 ) {\\n\\n\\t\\t\\t// Namespaced trigger; create a regexp to match event type in handle()\\n\\t\\t\\tnamespaces = type.split( \\\".\\\" );\\n\\t\\t\\ttype = namespaces.shift();\\n\\t\\t\\tnamespaces.sort();\\n\\t\\t}\\n\\t\\tontype = type.indexOf( \\\":\\\" ) < 0 && \\\"on\\\" + type;\\n\\n\\t\\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\\n\\t\\tevent = event[ jQuery.expando ] ?\\n\\t\\t\\tevent :\\n\\t\\t\\tnew jQuery.Event( type, typeof event === \\\"object\\\" && event );\\n\\n\\t\\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\\n\\t\\tevent.isTrigger = onlyHandlers ? 2 : 3;\\n\\t\\tevent.namespace = namespaces.join( \\\".\\\" );\\n\\t\\tevent.rnamespace = event.namespace ?\\n\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" ) :\\n\\t\\t\\tnull;\\n\\n\\t\\t// Clean up the event in case it is being reused\\n\\t\\tevent.result = undefined;\\n\\t\\tif ( !event.target ) {\\n\\t\\t\\tevent.target = elem;\\n\\t\\t}\\n\\n\\t\\t// Clone any incoming data and prepend the event, creating the handler arg list\\n\\t\\tdata = data == null ?\\n\\t\\t\\t[ event ] :\\n\\t\\t\\tjQuery.makeArray( data, [ event ] );\\n\\n\\t\\t// Allow special events to draw outside the lines\\n\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine event propagation path in advance, per W3C events spec (#9951)\\n\\t\\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\\n\\t\\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\tbubbleType = special.delegateType || type;\\n\\t\\t\\tif ( !rfocusMorph.test( bubbleType + type ) ) {\\n\\t\\t\\t\\tcur = cur.parentNode;\\n\\t\\t\\t}\\n\\t\\t\\tfor ( ; cur; cur = cur.parentNode ) {\\n\\t\\t\\t\\teventPath.push( cur );\\n\\t\\t\\t\\ttmp = cur;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\\n\\t\\t\\tif ( tmp === ( elem.ownerDocument || document ) ) {\\n\\t\\t\\t\\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Fire handlers on the event path\\n\\t\\ti = 0;\\n\\t\\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\n\\t\\t\\tevent.type = i > 1 ?\\n\\t\\t\\t\\tbubbleType :\\n\\t\\t\\t\\tspecial.bindType || type;\\n\\n\\t\\t\\t// jQuery handler\\n\\t\\t\\thandle = ( dataPriv.get( cur, \\\"events\\\" ) || {} )[ event.type ] &&\\n\\t\\t\\t\\tdataPriv.get( cur, \\\"handle\\\" );\\n\\t\\t\\tif ( handle ) {\\n\\t\\t\\t\\thandle.apply( cur, data );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Native handler\\n\\t\\t\\thandle = ontype && cur[ ontype ];\\n\\t\\t\\tif ( handle && handle.apply && acceptData( cur ) ) {\\n\\t\\t\\t\\tevent.result = handle.apply( cur, data );\\n\\t\\t\\t\\tif ( event.result === false ) {\\n\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tevent.type = type;\\n\\n\\t\\t// If nobody prevented the default action, do it now\\n\\t\\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\\n\\n\\t\\t\\tif ( ( !special._default ||\\n\\t\\t\\t\\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\\n\\t\\t\\t\\tacceptData( elem ) ) {\\n\\n\\t\\t\\t\\t// Call a native DOM method on the target with the same name as the event.\\n\\t\\t\\t\\t// Don't do default actions on window, that's where global variables be (#6170)\\n\\t\\t\\t\\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\t\\t\\t// Don't re-trigger an onFOO event when we call its FOO() method\\n\\t\\t\\t\\t\\ttmp = elem[ ontype ];\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = null;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Prevent re-triggering of the same event, since we already bubbled it above\\n\\t\\t\\t\\t\\tjQuery.event.triggered = type;\\n\\t\\t\\t\\t\\telem[ type ]();\\n\\t\\t\\t\\t\\tjQuery.event.triggered = undefined;\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = tmp;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\t// Piggyback on a donor event to simulate a different one\\n\\t// Used only for `focus(in | out)` events\\n\\tsimulate: function( type, elem, event ) {\\n\\t\\tvar e = jQuery.extend(\\n\\t\\t\\tnew jQuery.Event(),\\n\\t\\t\\tevent,\\n\\t\\t\\t{\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\tisSimulated: true\\n\\t\\t\\t}\\n\\t\\t);\\n\\n\\t\\tjQuery.event.trigger( e, null, elem );\\n\\t}\\n\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\ttrigger: function( type, data ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.trigger( type, data, this );\\n\\t\\t} );\\n\\t},\\n\\ttriggerHandler: function( type, data ) {\\n\\t\\tvar elem = this[ 0 ];\\n\\t\\tif ( elem ) {\\n\\t\\t\\treturn jQuery.event.trigger( type, data, elem, true );\\n\\t\\t}\\n\\t}\\n} );\\n\\n\\njQuery.each( ( \\\"blur focus focusin focusout resize scroll click dblclick \\\" +\\n\\t\\\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \\\" +\\n\\t\\\"change select submit keydown keypress keyup contextmenu\\\" ).split( \\\" \\\" ),\\n\\tfunction( i, name ) {\\n\\n\\t// Handle event binding\\n\\tjQuery.fn[ name ] = function( data, fn ) {\\n\\t\\treturn arguments.length > 0 ?\\n\\t\\t\\tthis.on( name, null, data, fn ) :\\n\\t\\t\\tthis.trigger( name );\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\thover: function( fnOver, fnOut ) {\\n\\t\\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\\n\\t}\\n} );\\n\\n\\n\\n\\nsupport.focusin = \\\"onfocusin\\\" in window;\\n\\n\\n// Support: Firefox <=44\\n// Firefox doesn't have focus(in | out) events\\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\\n//\\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\\n// focus(in | out) events fire after focus & blur events,\\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\\nif ( !support.focusin ) {\\n\\tjQuery.each( { focus: \\\"focusin\\\", blur: \\\"focusout\\\" }, function( orig, fix ) {\\n\\n\\t\\t// Attach a single capturing handler on the document while someone wants focusin/focusout\\n\\t\\tvar handler = function( event ) {\\n\\t\\t\\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\\n\\t\\t};\\n\\n\\t\\tjQuery.event.special[ fix ] = {\\n\\t\\t\\tsetup: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix );\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.addEventListener( orig, handler, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\\n\\t\\t\\t},\\n\\t\\t\\tteardown: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix ) - 1;\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.removeEventListener( orig, handler, true );\\n\\t\\t\\t\\t\\tdataPriv.remove( doc, fix );\\n\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdataPriv.access( doc, fix, attaches );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t} );\\n}\\nvar location = window.location;\\n\\nvar nonce = jQuery.now();\\n\\nvar rquery = ( /\\\\?/ );\\n\\n\\n\\n// Cross-browser xml parsing\\njQuery.parseXML = function( data ) {\\n\\tvar xml;\\n\\tif ( !data || typeof data !== \\\"string\\\" ) {\\n\\t\\treturn null;\\n\\t}\\n\\n\\t// Support: IE 9 - 11 only\\n\\t// IE throws on parseFromString with invalid input.\\n\\ttry {\\n\\t\\txml = ( new window.DOMParser() ).parseFromString( data, \\\"text/xml\\\" );\\n\\t} catch ( e ) {\\n\\t\\txml = undefined;\\n\\t}\\n\\n\\tif ( !xml || xml.getElementsByTagName( \\\"parsererror\\\" ).length ) {\\n\\t\\tjQuery.error( \\\"Invalid XML: \\\" + data );\\n\\t}\\n\\treturn xml;\\n};\\n\\n\\nvar\\n\\trbracket = /\\\\[\\\\]$/,\\n\\trCRLF = /\\\\r?\\\\n/g,\\n\\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\\n\\trsubmittable = /^(?:input|select|textarea|keygen)/i;\\n\\nfunction buildParams( prefix, obj, traditional, add ) {\\n\\tvar name;\\n\\n\\tif ( Array.isArray( obj ) ) {\\n\\n\\t\\t// Serialize array item.\\n\\t\\tjQuery.each( obj, function( i, v ) {\\n\\t\\t\\tif ( traditional || rbracket.test( prefix ) ) {\\n\\n\\t\\t\\t\\t// Treat each array item as a scalar.\\n\\t\\t\\t\\tadd( prefix, v );\\n\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Item is non-scalar (array or object), encode its numeric index.\\n\\t\\t\\t\\tbuildParams(\\n\\t\\t\\t\\t\\tprefix + \\\"[\\\" + ( typeof v === \\\"object\\\" && v != null ? i : \\\"\\\" ) + \\\"]\\\",\\n\\t\\t\\t\\t\\tv,\\n\\t\\t\\t\\t\\ttraditional,\\n\\t\\t\\t\\t\\tadd\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t} );\\n\\n\\t} else if ( !traditional && jQuery.type( obj ) === \\\"object\\\" ) {\\n\\n\\t\\t// Serialize object item.\\n\\t\\tfor ( name in obj ) {\\n\\t\\t\\tbuildParams( prefix + \\\"[\\\" + name + \\\"]\\\", obj[ name ], traditional, add );\\n\\t\\t}\\n\\n\\t} else {\\n\\n\\t\\t// Serialize scalar item.\\n\\t\\tadd( prefix, obj );\\n\\t}\\n}\\n\\n// Serialize an array of form elements or a set of\\n// key/values into a query string\\njQuery.param = function( a, traditional ) {\\n\\tvar prefix,\\n\\t\\ts = [],\\n\\t\\tadd = function( key, valueOrFunction ) {\\n\\n\\t\\t\\t// If value is a function, invoke it and use its return value\\n\\t\\t\\tvar value = jQuery.isFunction( valueOrFunction ) ?\\n\\t\\t\\t\\tvalueOrFunction() :\\n\\t\\t\\t\\tvalueOrFunction;\\n\\n\\t\\t\\ts[ s.length ] = encodeURIComponent( key ) + \\\"=\\\" +\\n\\t\\t\\t\\tencodeURIComponent( value == null ? \\\"\\\" : value );\\n\\t\\t};\\n\\n\\t// If an array was passed in, assume that it is an array of form elements.\\n\\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\\n\\n\\t\\t// Serialize the form elements\\n\\t\\tjQuery.each( a, function() {\\n\\t\\t\\tadd( this.name, this.value );\\n\\t\\t} );\\n\\n\\t} else {\\n\\n\\t\\t// If traditional, encode the \\\"old\\\" way (the way 1.3.2 or older\\n\\t\\t// did it), otherwise encode params recursively.\\n\\t\\tfor ( prefix in a ) {\\n\\t\\t\\tbuildParams( prefix, a[ prefix ], traditional, add );\\n\\t\\t}\\n\\t}\\n\\n\\t// Return the resulting serialization\\n\\treturn s.join( \\\"&\\\" );\\n};\\n\\njQuery.fn.extend( {\\n\\tserialize: function() {\\n\\t\\treturn jQuery.param( this.serializeArray() );\\n\\t},\\n\\tserializeArray: function() {\\n\\t\\treturn this.map( function() {\\n\\n\\t\\t\\t// Can add propHook for \\\"elements\\\" to filter or add form elements\\n\\t\\t\\tvar elements = jQuery.prop( this, \\\"elements\\\" );\\n\\t\\t\\treturn elements ? jQuery.makeArray( elements ) : this;\\n\\t\\t} )\\n\\t\\t.filter( function() {\\n\\t\\t\\tvar type = this.type;\\n\\n\\t\\t\\t// Use .is( \\\":disabled\\\" ) so that fieldset[disabled] works\\n\\t\\t\\treturn this.name && !jQuery( this ).is( \\\":disabled\\\" ) &&\\n\\t\\t\\t\\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\\n\\t\\t\\t\\t( this.checked || !rcheckableType.test( type ) );\\n\\t\\t} )\\n\\t\\t.map( function( i, elem ) {\\n\\t\\t\\tvar val = jQuery( this ).val();\\n\\n\\t\\t\\tif ( val == null ) {\\n\\t\\t\\t\\treturn null;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( Array.isArray( val ) ) {\\n\\t\\t\\t\\treturn jQuery.map( val, function( val ) {\\n\\t\\t\\t\\t\\treturn { name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn { name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t} ).get();\\n\\t}\\n} );\\n\\n\\nvar\\n\\tr20 = /%20/g,\\n\\trhash = /#.*$/,\\n\\trantiCache = /([?&])_=[^&]*/,\\n\\trheaders = /^(.*?):[ \\\\t]*([^\\\\r\\\\n]*)$/mg,\\n\\n\\t// #7653, #8125, #8152: local protocol detection\\n\\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\\n\\trnoContent = /^(?:GET|HEAD)$/,\\n\\trprotocol = /^\\\\/\\\\//,\\n\\n\\t/* Prefilters\\n\\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\\n\\t * 2) These are called:\\n\\t * - BEFORE asking for a transport\\n\\t * - AFTER param serialization (s.data is a string if s.processData is true)\\n\\t * 3) key is the dataType\\n\\t * 4) the catchall symbol \\\"*\\\" can be used\\n\\t * 5) execution will start with transport dataType and THEN continue down to \\\"*\\\" if needed\\n\\t */\\n\\tprefilters = {},\\n\\n\\t/* Transports bindings\\n\\t * 1) key is the dataType\\n\\t * 2) the catchall symbol \\\"*\\\" can be used\\n\\t * 3) selection will start with transport dataType and THEN go to \\\"*\\\" if needed\\n\\t */\\n\\ttransports = {},\\n\\n\\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\\n\\tallTypes = \\\"*/\\\".concat( \\\"*\\\" ),\\n\\n\\t// Anchor tag for parsing the document origin\\n\\toriginAnchor = document.createElement( \\\"a\\\" );\\n\\toriginAnchor.href = location.href;\\n\\n// Base \\\"constructor\\\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\\nfunction addToPrefiltersOrTransports( structure ) {\\n\\n\\t// dataTypeExpression is optional and defaults to \\\"*\\\"\\n\\treturn function( dataTypeExpression, func ) {\\n\\n\\t\\tif ( typeof dataTypeExpression !== \\\"string\\\" ) {\\n\\t\\t\\tfunc = dataTypeExpression;\\n\\t\\t\\tdataTypeExpression = \\\"*\\\";\\n\\t\\t}\\n\\n\\t\\tvar dataType,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\\n\\n\\t\\tif ( jQuery.isFunction( func ) ) {\\n\\n\\t\\t\\t// For each dataType in the dataTypeExpression\\n\\t\\t\\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t// Prepend if requested\\n\\t\\t\\t\\tif ( dataType[ 0 ] === \\\"+\\\" ) {\\n\\t\\t\\t\\t\\tdataType = dataType.slice( 1 ) || \\\"*\\\";\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\\n\\n\\t\\t\\t\\t// Otherwise append\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\n// Base inspection function for prefilters and transports\\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\\n\\n\\tvar inspected = {},\\n\\t\\tseekingTransport = ( structure === transports );\\n\\n\\tfunction inspect( dataType ) {\\n\\t\\tvar selected;\\n\\t\\tinspected[ dataType ] = true;\\n\\t\\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\\n\\t\\t\\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\\n\\t\\t\\tif ( typeof dataTypeOrTransport === \\\"string\\\" &&\\n\\t\\t\\t\\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\\n\\n\\t\\t\\t\\toptions.dataTypes.unshift( dataTypeOrTransport );\\n\\t\\t\\t\\tinspect( dataTypeOrTransport );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t} else if ( seekingTransport ) {\\n\\t\\t\\t\\treturn !( selected = dataTypeOrTransport );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t\\treturn selected;\\n\\t}\\n\\n\\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \\\"*\\\" ] && inspect( \\\"*\\\" );\\n}\\n\\n// A special extend for ajax options\\n// that takes \\\"flat\\\" options (not to be deep extended)\\n// Fixes #9887\\nfunction ajaxExtend( target, src ) {\\n\\tvar key, deep,\\n\\t\\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\\n\\n\\tfor ( key in src ) {\\n\\t\\tif ( src[ key ] !== undefined ) {\\n\\t\\t\\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\\n\\t\\t}\\n\\t}\\n\\tif ( deep ) {\\n\\t\\tjQuery.extend( true, target, deep );\\n\\t}\\n\\n\\treturn target;\\n}\\n\\n/* Handles responses to an ajax request:\\n * - finds the right dataType (mediates between content-type and expected dataType)\\n * - returns the corresponding response\\n */\\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\\n\\n\\tvar ct, type, finalDataType, firstDataType,\\n\\t\\tcontents = s.contents,\\n\\t\\tdataTypes = s.dataTypes;\\n\\n\\t// Remove auto dataType and get content-type in the process\\n\\twhile ( dataTypes[ 0 ] === \\\"*\\\" ) {\\n\\t\\tdataTypes.shift();\\n\\t\\tif ( ct === undefined ) {\\n\\t\\t\\tct = s.mimeType || jqXHR.getResponseHeader( \\\"Content-Type\\\" );\\n\\t\\t}\\n\\t}\\n\\n\\t// Check if we're dealing with a known content-type\\n\\tif ( ct ) {\\n\\t\\tfor ( type in contents ) {\\n\\t\\t\\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\\n\\t\\t\\t\\tdataTypes.unshift( type );\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Check to see if we have a response for the expected dataType\\n\\tif ( dataTypes[ 0 ] in responses ) {\\n\\t\\tfinalDataType = dataTypes[ 0 ];\\n\\t} else {\\n\\n\\t\\t// Try convertible dataTypes\\n\\t\\tfor ( type in responses ) {\\n\\t\\t\\tif ( !dataTypes[ 0 ] || s.converters[ type + \\\" \\\" + dataTypes[ 0 ] ] ) {\\n\\t\\t\\t\\tfinalDataType = type;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tif ( !firstDataType ) {\\n\\t\\t\\t\\tfirstDataType = type;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Or just use first one\\n\\t\\tfinalDataType = finalDataType || firstDataType;\\n\\t}\\n\\n\\t// If we found a dataType\\n\\t// We add the dataType to the list if needed\\n\\t// and return the corresponding response\\n\\tif ( finalDataType ) {\\n\\t\\tif ( finalDataType !== dataTypes[ 0 ] ) {\\n\\t\\t\\tdataTypes.unshift( finalDataType );\\n\\t\\t}\\n\\t\\treturn responses[ finalDataType ];\\n\\t}\\n}\\n\\n/* Chain conversions given the request and the original response\\n * Also sets the responseXXX fields on the jqXHR instance\\n */\\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\\n\\tvar conv2, current, conv, tmp, prev,\\n\\t\\tconverters = {},\\n\\n\\t\\t// Work with a copy of dataTypes in case we need to modify it for conversion\\n\\t\\tdataTypes = s.dataTypes.slice();\\n\\n\\t// Create converters map with lowercased keys\\n\\tif ( dataTypes[ 1 ] ) {\\n\\t\\tfor ( conv in s.converters ) {\\n\\t\\t\\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\\n\\t\\t}\\n\\t}\\n\\n\\tcurrent = dataTypes.shift();\\n\\n\\t// Convert to each sequential dataType\\n\\twhile ( current ) {\\n\\n\\t\\tif ( s.responseFields[ current ] ) {\\n\\t\\t\\tjqXHR[ s.responseFields[ current ] ] = response;\\n\\t\\t}\\n\\n\\t\\t// Apply the dataFilter if provided\\n\\t\\tif ( !prev && isSuccess && s.dataFilter ) {\\n\\t\\t\\tresponse = s.dataFilter( response, s.dataType );\\n\\t\\t}\\n\\n\\t\\tprev = current;\\n\\t\\tcurrent = dataTypes.shift();\\n\\n\\t\\tif ( current ) {\\n\\n\\t\\t\\t// There's only work to do if current dataType is non-auto\\n\\t\\t\\tif ( current === \\\"*\\\" ) {\\n\\n\\t\\t\\t\\tcurrent = prev;\\n\\n\\t\\t\\t// Convert response if prev dataType is non-auto and differs from current\\n\\t\\t\\t} else if ( prev !== \\\"*\\\" && prev !== current ) {\\n\\n\\t\\t\\t\\t// Seek a direct converter\\n\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + current ] || converters[ \\\"* \\\" + current ];\\n\\n\\t\\t\\t\\t// If none found, seek a pair\\n\\t\\t\\t\\tif ( !conv ) {\\n\\t\\t\\t\\t\\tfor ( conv2 in converters ) {\\n\\n\\t\\t\\t\\t\\t\\t// If conv2 outputs current\\n\\t\\t\\t\\t\\t\\ttmp = conv2.split( \\\" \\\" );\\n\\t\\t\\t\\t\\t\\tif ( tmp[ 1 ] === current ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// If prev can be converted to accepted input\\n\\t\\t\\t\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + tmp[ 0 ] ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\tconverters[ \\\"* \\\" + tmp[ 0 ] ];\\n\\t\\t\\t\\t\\t\\t\\tif ( conv ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Condense equivalence converters\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( conv === true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tconv = converters[ conv2 ];\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Otherwise, insert the intermediate dataType\\n\\t\\t\\t\\t\\t\\t\\t\\t} else if ( converters[ conv2 ] !== true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcurrent = tmp[ 0 ];\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdataTypes.unshift( tmp[ 1 ] );\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Apply converter (if not an equivalence)\\n\\t\\t\\t\\tif ( conv !== true ) {\\n\\n\\t\\t\\t\\t\\t// Unless errors are allowed to bubble, catch and return them\\n\\t\\t\\t\\t\\tif ( conv && s.throws ) {\\n\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t\\t} catch ( e ) {\\n\\t\\t\\t\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\t\\t\\t\\tstate: \\\"parsererror\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\terror: conv ? e : \\\"No conversion from \\\" + prev + \\\" to \\\" + current\\n\\t\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn { state: \\\"success\\\", data: response };\\n}\\n\\njQuery.extend( {\\n\\n\\t// Counter for holding the number of active queries\\n\\tactive: 0,\\n\\n\\t// Last-Modified header cache for next request\\n\\tlastModified: {},\\n\\tetag: {},\\n\\n\\tajaxSettings: {\\n\\t\\turl: location.href,\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tisLocal: rlocalProtocol.test( location.protocol ),\\n\\t\\tglobal: true,\\n\\t\\tprocessData: true,\\n\\t\\tasync: true,\\n\\t\\tcontentType: \\\"application/x-www-form-urlencoded; charset=UTF-8\\\",\\n\\n\\t\\t/*\\n\\t\\ttimeout: 0,\\n\\t\\tdata: null,\\n\\t\\tdataType: null,\\n\\t\\tusername: null,\\n\\t\\tpassword: null,\\n\\t\\tcache: null,\\n\\t\\tthrows: false,\\n\\t\\ttraditional: false,\\n\\t\\theaders: {},\\n\\t\\t*/\\n\\n\\t\\taccepts: {\\n\\t\\t\\t\\\"*\\\": allTypes,\\n\\t\\t\\ttext: \\\"text/plain\\\",\\n\\t\\t\\thtml: \\\"text/html\\\",\\n\\t\\t\\txml: \\\"application/xml, text/xml\\\",\\n\\t\\t\\tjson: \\\"application/json, text/javascript\\\"\\n\\t\\t},\\n\\n\\t\\tcontents: {\\n\\t\\t\\txml: /\\\\bxml\\\\b/,\\n\\t\\t\\thtml: /\\\\bhtml/,\\n\\t\\t\\tjson: /\\\\bjson\\\\b/\\n\\t\\t},\\n\\n\\t\\tresponseFields: {\\n\\t\\t\\txml: \\\"responseXML\\\",\\n\\t\\t\\ttext: \\\"responseText\\\",\\n\\t\\t\\tjson: \\\"responseJSON\\\"\\n\\t\\t},\\n\\n\\t\\t// Data converters\\n\\t\\t// Keys separate source (or catchall \\\"*\\\") and destination types with a single space\\n\\t\\tconverters: {\\n\\n\\t\\t\\t// Convert anything to text\\n\\t\\t\\t\\\"* text\\\": String,\\n\\n\\t\\t\\t// Text to html (true = no transformation)\\n\\t\\t\\t\\\"text html\\\": true,\\n\\n\\t\\t\\t// Evaluate text as a json expression\\n\\t\\t\\t\\\"text json\\\": JSON.parse,\\n\\n\\t\\t\\t// Parse text as xml\\n\\t\\t\\t\\\"text xml\\\": jQuery.parseXML\\n\\t\\t},\\n\\n\\t\\t// For options that shouldn't be deep extended:\\n\\t\\t// you can add your own custom options here if\\n\\t\\t// and when you create one that shouldn't be\\n\\t\\t// deep extended (see ajaxExtend)\\n\\t\\tflatOptions: {\\n\\t\\t\\turl: true,\\n\\t\\t\\tcontext: true\\n\\t\\t}\\n\\t},\\n\\n\\t// Creates a full fledged settings object into target\\n\\t// with both ajaxSettings and settings fields.\\n\\t// If target is omitted, writes into ajaxSettings.\\n\\tajaxSetup: function( target, settings ) {\\n\\t\\treturn settings ?\\n\\n\\t\\t\\t// Building a settings object\\n\\t\\t\\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\\n\\n\\t\\t\\t// Extending ajaxSettings\\n\\t\\t\\tajaxExtend( jQuery.ajaxSettings, target );\\n\\t},\\n\\n\\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\\n\\tajaxTransport: addToPrefiltersOrTransports( transports ),\\n\\n\\t// Main method\\n\\tajax: function( url, options ) {\\n\\n\\t\\t// If url is an object, simulate pre-1.5 signature\\n\\t\\tif ( typeof url === \\\"object\\\" ) {\\n\\t\\t\\toptions = url;\\n\\t\\t\\turl = undefined;\\n\\t\\t}\\n\\n\\t\\t// Force options to be an object\\n\\t\\toptions = options || {};\\n\\n\\t\\tvar transport,\\n\\n\\t\\t\\t// URL without anti-cache param\\n\\t\\t\\tcacheURL,\\n\\n\\t\\t\\t// Response headers\\n\\t\\t\\tresponseHeadersString,\\n\\t\\t\\tresponseHeaders,\\n\\n\\t\\t\\t// timeout handle\\n\\t\\t\\ttimeoutTimer,\\n\\n\\t\\t\\t// Url cleanup var\\n\\t\\t\\turlAnchor,\\n\\n\\t\\t\\t// Request state (becomes false upon send and true upon completion)\\n\\t\\t\\tcompleted,\\n\\n\\t\\t\\t// To know if global events are to be dispatched\\n\\t\\t\\tfireGlobals,\\n\\n\\t\\t\\t// Loop variable\\n\\t\\t\\ti,\\n\\n\\t\\t\\t// uncached part of the url\\n\\t\\t\\tuncached,\\n\\n\\t\\t\\t// Create the final options object\\n\\t\\t\\ts = jQuery.ajaxSetup( {}, options ),\\n\\n\\t\\t\\t// Callbacks context\\n\\t\\t\\tcallbackContext = s.context || s,\\n\\n\\t\\t\\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\\n\\t\\t\\tglobalEventContext = s.context &&\\n\\t\\t\\t\\t( callbackContext.nodeType || callbackContext.jquery ) ?\\n\\t\\t\\t\\t\\tjQuery( callbackContext ) :\\n\\t\\t\\t\\t\\tjQuery.event,\\n\\n\\t\\t\\t// Deferreds\\n\\t\\t\\tdeferred = jQuery.Deferred(),\\n\\t\\t\\tcompleteDeferred = jQuery.Callbacks( \\\"once memory\\\" ),\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tstatusCode = s.statusCode || {},\\n\\n\\t\\t\\t// Headers (they are sent all at once)\\n\\t\\t\\trequestHeaders = {},\\n\\t\\t\\trequestHeadersNames = {},\\n\\n\\t\\t\\t// Default abort message\\n\\t\\t\\tstrAbort = \\\"canceled\\\",\\n\\n\\t\\t\\t// Fake xhr\\n\\t\\t\\tjqXHR = {\\n\\t\\t\\t\\treadyState: 0,\\n\\n\\t\\t\\t\\t// Builds headers hashtable if needed\\n\\t\\t\\t\\tgetResponseHeader: function( key ) {\\n\\t\\t\\t\\t\\tvar match;\\n\\t\\t\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\t\\t\\tif ( !responseHeaders ) {\\n\\t\\t\\t\\t\\t\\t\\tresponseHeaders = {};\\n\\t\\t\\t\\t\\t\\t\\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tmatch = responseHeaders[ key.toLowerCase() ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn match == null ? null : match;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Raw string\\n\\t\\t\\t\\tgetAllResponseHeaders: function() {\\n\\t\\t\\t\\t\\treturn completed ? responseHeadersString : null;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Caches the header\\n\\t\\t\\t\\tsetRequestHeader: function( name, value ) {\\n\\t\\t\\t\\t\\tif ( completed == null ) {\\n\\t\\t\\t\\t\\t\\tname = requestHeadersNames[ name.toLowerCase() ] =\\n\\t\\t\\t\\t\\t\\t\\trequestHeadersNames[ name.toLowerCase() ] || name;\\n\\t\\t\\t\\t\\t\\trequestHeaders[ name ] = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Overrides response content-type header\\n\\t\\t\\t\\toverrideMimeType: function( type ) {\\n\\t\\t\\t\\t\\tif ( completed == null ) {\\n\\t\\t\\t\\t\\t\\ts.mimeType = type;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\t\\tstatusCode: function( map ) {\\n\\t\\t\\t\\t\\tvar code;\\n\\t\\t\\t\\t\\tif ( map ) {\\n\\t\\t\\t\\t\\t\\tif ( completed ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Execute the appropriate callbacks\\n\\t\\t\\t\\t\\t\\t\\tjqXHR.always( map[ jqXHR.status ] );\\n\\t\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Lazy-add the new callbacks in a way that preserves old ones\\n\\t\\t\\t\\t\\t\\t\\tfor ( code in map ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Cancel the request\\n\\t\\t\\t\\tabort: function( statusText ) {\\n\\t\\t\\t\\t\\tvar finalText = statusText || strAbort;\\n\\t\\t\\t\\t\\tif ( transport ) {\\n\\t\\t\\t\\t\\t\\ttransport.abort( finalText );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdone( 0, finalText );\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\n\\t\\t// Attach deferreds\\n\\t\\tdeferred.promise( jqXHR );\\n\\n\\t\\t// Add protocol if not provided (prefilters might expect it)\\n\\t\\t// Handle falsy url in the settings object (#10093: consistency with old signature)\\n\\t\\t// We also use the url parameter if available\\n\\t\\ts.url = ( ( url || s.url || location.href ) + \\\"\\\" )\\n\\t\\t\\t.replace( rprotocol, location.protocol + \\\"//\\\" );\\n\\n\\t\\t// Alias method option to type as per ticket #12004\\n\\t\\ts.type = options.method || options.type || s.method || s.type;\\n\\n\\t\\t// Extract dataTypes list\\n\\t\\ts.dataTypes = ( s.dataType || \\\"*\\\" ).toLowerCase().match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\n\\t\\t// A cross-domain request is in order when the origin doesn't match the current origin.\\n\\t\\tif ( s.crossDomain == null ) {\\n\\t\\t\\turlAnchor = document.createElement( \\\"a\\\" );\\n\\n\\t\\t\\t// Support: IE <=8 - 11, Edge 12 - 13\\n\\t\\t\\t// IE throws exception on accessing the href property if url is malformed,\\n\\t\\t\\t// e.g. http://example.com:80x/\\n\\t\\t\\ttry {\\n\\t\\t\\t\\turlAnchor.href = s.url;\\n\\n\\t\\t\\t\\t// Support: IE <=8 - 11 only\\n\\t\\t\\t\\t// Anchor's host property isn't correctly set when s.url is relative\\n\\t\\t\\t\\turlAnchor.href = urlAnchor.href;\\n\\t\\t\\t\\ts.crossDomain = originAnchor.protocol + \\\"//\\\" + originAnchor.host !==\\n\\t\\t\\t\\t\\turlAnchor.protocol + \\\"//\\\" + urlAnchor.host;\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// If there is an error parsing the URL, assume it is crossDomain,\\n\\t\\t\\t\\t// it can be rejected by the transport if it is invalid\\n\\t\\t\\t\\ts.crossDomain = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Convert data if not already a string\\n\\t\\tif ( s.data && s.processData && typeof s.data !== \\\"string\\\" ) {\\n\\t\\t\\ts.data = jQuery.param( s.data, s.traditional );\\n\\t\\t}\\n\\n\\t\\t// Apply prefilters\\n\\t\\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\\n\\n\\t\\t// If request was aborted inside a prefilter, stop there\\n\\t\\tif ( completed ) {\\n\\t\\t\\treturn jqXHR;\\n\\t\\t}\\n\\n\\t\\t// We can fire global events as of now if asked to\\n\\t\\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\\n\\t\\tfireGlobals = jQuery.event && s.global;\\n\\n\\t\\t// Watch for a new set of requests\\n\\t\\tif ( fireGlobals && jQuery.active++ === 0 ) {\\n\\t\\t\\tjQuery.event.trigger( \\\"ajaxStart\\\" );\\n\\t\\t}\\n\\n\\t\\t// Uppercase the type\\n\\t\\ts.type = s.type.toUpperCase();\\n\\n\\t\\t// Determine if request has content\\n\\t\\ts.hasContent = !rnoContent.test( s.type );\\n\\n\\t\\t// Save the URL in case we're toying with the If-Modified-Since\\n\\t\\t// and/or If-None-Match header later on\\n\\t\\t// Remove hash to simplify url manipulation\\n\\t\\tcacheURL = s.url.replace( rhash, \\\"\\\" );\\n\\n\\t\\t// More options handling for requests with no content\\n\\t\\tif ( !s.hasContent ) {\\n\\n\\t\\t\\t// Remember the hash so we can put it back\\n\\t\\t\\tuncached = s.url.slice( cacheURL.length );\\n\\n\\t\\t\\t// If data is available, append data to url\\n\\t\\t\\tif ( s.data ) {\\n\\t\\t\\t\\tcacheURL += ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + s.data;\\n\\n\\t\\t\\t\\t// #9682: remove data so that it's not used in an eventual retry\\n\\t\\t\\t\\tdelete s.data;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add or update anti-cache param if needed\\n\\t\\t\\tif ( s.cache === false ) {\\n\\t\\t\\t\\tcacheURL = cacheURL.replace( rantiCache, \\\"$1\\\" );\\n\\t\\t\\t\\tuncached = ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + \\\"_=\\\" + ( nonce++ ) + uncached;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\\n\\t\\t\\ts.url = cacheURL + uncached;\\n\\n\\t\\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\\n\\t\\t} else if ( s.data && s.processData &&\\n\\t\\t\\t( s.contentType || \\\"\\\" ).indexOf( \\\"application/x-www-form-urlencoded\\\" ) === 0 ) {\\n\\t\\t\\ts.data = s.data.replace( r20, \\\"+\\\" );\\n\\t\\t}\\n\\n\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\tif ( s.ifModified ) {\\n\\t\\t\\tif ( jQuery.lastModified[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-Modified-Since\\\", jQuery.lastModified[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t\\tif ( jQuery.etag[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-None-Match\\\", jQuery.etag[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Set the correct header, if data is being sent\\n\\t\\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\\n\\t\\t\\tjqXHR.setRequestHeader( \\\"Content-Type\\\", s.contentType );\\n\\t\\t}\\n\\n\\t\\t// Set the Accepts header for the server, depending on the dataType\\n\\t\\tjqXHR.setRequestHeader(\\n\\t\\t\\t\\\"Accept\\\",\\n\\t\\t\\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\\n\\t\\t\\t\\ts.accepts[ s.dataTypes[ 0 ] ] +\\n\\t\\t\\t\\t\\t( s.dataTypes[ 0 ] !== \\\"*\\\" ? \\\", \\\" + allTypes + \\\"; q=0.01\\\" : \\\"\\\" ) :\\n\\t\\t\\t\\ts.accepts[ \\\"*\\\" ]\\n\\t\\t);\\n\\n\\t\\t// Check for headers option\\n\\t\\tfor ( i in s.headers ) {\\n\\t\\t\\tjqXHR.setRequestHeader( i, s.headers[ i ] );\\n\\t\\t}\\n\\n\\t\\t// Allow custom headers/mimetypes and early abort\\n\\t\\tif ( s.beforeSend &&\\n\\t\\t\\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\\n\\n\\t\\t\\t// Abort if not done already and return\\n\\t\\t\\treturn jqXHR.abort();\\n\\t\\t}\\n\\n\\t\\t// Aborting is no longer a cancellation\\n\\t\\tstrAbort = \\\"abort\\\";\\n\\n\\t\\t// Install callbacks on deferreds\\n\\t\\tcompleteDeferred.add( s.complete );\\n\\t\\tjqXHR.done( s.success );\\n\\t\\tjqXHR.fail( s.error );\\n\\n\\t\\t// Get transport\\n\\t\\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\\n\\n\\t\\t// If no transport, we auto-abort\\n\\t\\tif ( !transport ) {\\n\\t\\t\\tdone( -1, \\\"No Transport\\\" );\\n\\t\\t} else {\\n\\t\\t\\tjqXHR.readyState = 1;\\n\\n\\t\\t\\t// Send global event\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxSend\\\", [ jqXHR, s ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If request was aborted inside ajaxSend, stop there\\n\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\treturn jqXHR;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Timeout\\n\\t\\t\\tif ( s.async && s.timeout > 0 ) {\\n\\t\\t\\t\\ttimeoutTimer = window.setTimeout( function() {\\n\\t\\t\\t\\t\\tjqXHR.abort( \\\"timeout\\\" );\\n\\t\\t\\t\\t}, s.timeout );\\n\\t\\t\\t}\\n\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tcompleted = false;\\n\\t\\t\\t\\ttransport.send( requestHeaders, done );\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// Rethrow post-completion exceptions\\n\\t\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Propagate others as results\\n\\t\\t\\t\\tdone( -1, e );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Callback for when everything is done\\n\\t\\tfunction done( status, nativeStatusText, responses, headers ) {\\n\\t\\t\\tvar isSuccess, success, error, response, modified,\\n\\t\\t\\t\\tstatusText = nativeStatusText;\\n\\n\\t\\t\\t// Ignore repeat invocations\\n\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tcompleted = true;\\n\\n\\t\\t\\t// Clear timeout if it exists\\n\\t\\t\\tif ( timeoutTimer ) {\\n\\t\\t\\t\\twindow.clearTimeout( timeoutTimer );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Dereference transport for early garbage collection\\n\\t\\t\\t// (no matter how long the jqXHR object will be used)\\n\\t\\t\\ttransport = undefined;\\n\\n\\t\\t\\t// Cache response headers\\n\\t\\t\\tresponseHeadersString = headers || \\\"\\\";\\n\\n\\t\\t\\t// Set readyState\\n\\t\\t\\tjqXHR.readyState = status > 0 ? 4 : 0;\\n\\n\\t\\t\\t// Determine if successful\\n\\t\\t\\tisSuccess = status >= 200 && status < 300 || status === 304;\\n\\n\\t\\t\\t// Get response data\\n\\t\\t\\tif ( responses ) {\\n\\t\\t\\t\\tresponse = ajaxHandleResponses( s, jqXHR, responses );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Convert no matter what (that way responseXXX fields are always set)\\n\\t\\t\\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\\n\\n\\t\\t\\t// If successful, handle type chaining\\n\\t\\t\\tif ( isSuccess ) {\\n\\n\\t\\t\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\t\\t\\tif ( s.ifModified ) {\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"Last-Modified\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.lastModified[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"etag\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.etag[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// if no content\\n\\t\\t\\t\\tif ( status === 204 || s.type === \\\"HEAD\\\" ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"nocontent\\\";\\n\\n\\t\\t\\t\\t// if not modified\\n\\t\\t\\t\\t} else if ( status === 304 ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"notmodified\\\";\\n\\n\\t\\t\\t\\t// If we have data, let's convert it\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tstatusText = response.state;\\n\\t\\t\\t\\t\\tsuccess = response.data;\\n\\t\\t\\t\\t\\terror = response.error;\\n\\t\\t\\t\\t\\tisSuccess = !error;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Extract error from statusText and normalize for non-aborts\\n\\t\\t\\t\\terror = statusText;\\n\\t\\t\\t\\tif ( status || !statusText ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"error\\\";\\n\\t\\t\\t\\t\\tif ( status < 0 ) {\\n\\t\\t\\t\\t\\t\\tstatus = 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Set data for the fake xhr object\\n\\t\\t\\tjqXHR.status = status;\\n\\t\\t\\tjqXHR.statusText = ( nativeStatusText || statusText ) + \\\"\\\";\\n\\n\\t\\t\\t// Success/Error\\n\\t\\t\\tif ( isSuccess ) {\\n\\t\\t\\t\\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tjqXHR.statusCode( statusCode );\\n\\t\\t\\tstatusCode = undefined;\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( isSuccess ? \\\"ajaxSuccess\\\" : \\\"ajaxError\\\",\\n\\t\\t\\t\\t\\t[ jqXHR, s, isSuccess ? success : error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Complete\\n\\t\\t\\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxComplete\\\", [ jqXHR, s ] );\\n\\n\\t\\t\\t\\t// Handle the global AJAX counter\\n\\t\\t\\t\\tif ( !( --jQuery.active ) ) {\\n\\t\\t\\t\\t\\tjQuery.event.trigger( \\\"ajaxStop\\\" );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn jqXHR;\\n\\t},\\n\\n\\tgetJSON: function( url, data, callback ) {\\n\\t\\treturn jQuery.get( url, data, callback, \\\"json\\\" );\\n\\t},\\n\\n\\tgetScript: function( url, callback ) {\\n\\t\\treturn jQuery.get( url, undefined, callback, \\\"script\\\" );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"get\\\", \\\"post\\\" ], function( i, method ) {\\n\\tjQuery[ method ] = function( url, data, callback, type ) {\\n\\n\\t\\t// Shift arguments if data argument was omitted\\n\\t\\tif ( jQuery.isFunction( data ) ) {\\n\\t\\t\\ttype = type || callback;\\n\\t\\t\\tcallback = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t}\\n\\n\\t\\t// The url can be an options object (which then must have .url)\\n\\t\\treturn jQuery.ajax( jQuery.extend( {\\n\\t\\t\\turl: url,\\n\\t\\t\\ttype: method,\\n\\t\\t\\tdataType: type,\\n\\t\\t\\tdata: data,\\n\\t\\t\\tsuccess: callback\\n\\t\\t}, jQuery.isPlainObject( url ) && url ) );\\n\\t};\\n} );\\n\\n\\njQuery._evalUrl = function( url ) {\\n\\treturn jQuery.ajax( {\\n\\t\\turl: url,\\n\\n\\t\\t// Make this explicit, since user can override this through ajaxSetup (#11264)\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tdataType: \\\"script\\\",\\n\\t\\tcache: true,\\n\\t\\tasync: false,\\n\\t\\tglobal: false,\\n\\t\\t\\\"throws\\\": true\\n\\t} );\\n};\\n\\n\\njQuery.fn.extend( {\\n\\twrapAll: function( html ) {\\n\\t\\tvar wrap;\\n\\n\\t\\tif ( this[ 0 ] ) {\\n\\t\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\t\\thtml = html.call( this[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// The elements to wrap the target around\\n\\t\\t\\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\\n\\n\\t\\t\\tif ( this[ 0 ].parentNode ) {\\n\\t\\t\\t\\twrap.insertBefore( this[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\twrap.map( function() {\\n\\t\\t\\t\\tvar elem = this;\\n\\n\\t\\t\\t\\twhile ( elem.firstElementChild ) {\\n\\t\\t\\t\\t\\telem = elem.firstElementChild;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn elem;\\n\\t\\t\\t} ).append( this );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\twrapInner: function( html ) {\\n\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).wrapInner( html.call( this, i ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar self = jQuery( this ),\\n\\t\\t\\t\\tcontents = self.contents();\\n\\n\\t\\t\\tif ( contents.length ) {\\n\\t\\t\\t\\tcontents.wrapAll( html );\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.append( html );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\twrap: function( html ) {\\n\\t\\tvar isFunction = jQuery.isFunction( html );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\\n\\t\\t} );\\n\\t},\\n\\n\\tunwrap: function( selector ) {\\n\\t\\tthis.parent( selector ).not( \\\"body\\\" ).each( function() {\\n\\t\\t\\tjQuery( this ).replaceWith( this.childNodes );\\n\\t\\t} );\\n\\t\\treturn this;\\n\\t}\\n} );\\n\\n\\njQuery.expr.pseudos.hidden = function( elem ) {\\n\\treturn !jQuery.expr.pseudos.visible( elem );\\n};\\njQuery.expr.pseudos.visible = function( elem ) {\\n\\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\\n};\\n\\n\\n\\n\\njQuery.ajaxSettings.xhr = function() {\\n\\ttry {\\n\\t\\treturn new window.XMLHttpRequest();\\n\\t} catch ( e ) {}\\n};\\n\\nvar xhrSuccessStatus = {\\n\\n\\t\\t// File protocol always yields status code 0, assume 200\\n\\t\\t0: 200,\\n\\n\\t\\t// Support: IE <=9 only\\n\\t\\t// #1450: sometimes IE returns 1223 when it should be 204\\n\\t\\t1223: 204\\n\\t},\\n\\txhrSupported = jQuery.ajaxSettings.xhr();\\n\\nsupport.cors = !!xhrSupported && ( \\\"withCredentials\\\" in xhrSupported );\\nsupport.ajax = xhrSupported = !!xhrSupported;\\n\\njQuery.ajaxTransport( function( options ) {\\n\\tvar callback, errorCallback;\\n\\n\\t// Cross domain only allowed if supported through XMLHttpRequest\\n\\tif ( support.cors || xhrSupported && !options.crossDomain ) {\\n\\t\\treturn {\\n\\t\\t\\tsend: function( headers, complete ) {\\n\\t\\t\\t\\tvar i,\\n\\t\\t\\t\\t\\txhr = options.xhr();\\n\\n\\t\\t\\t\\txhr.open(\\n\\t\\t\\t\\t\\toptions.type,\\n\\t\\t\\t\\t\\toptions.url,\\n\\t\\t\\t\\t\\toptions.async,\\n\\t\\t\\t\\t\\toptions.username,\\n\\t\\t\\t\\t\\toptions.password\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t\\t// Apply custom fields if provided\\n\\t\\t\\t\\tif ( options.xhrFields ) {\\n\\t\\t\\t\\t\\tfor ( i in options.xhrFields ) {\\n\\t\\t\\t\\t\\t\\txhr[ i ] = options.xhrFields[ i ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Override mime type if needed\\n\\t\\t\\t\\tif ( options.mimeType && xhr.overrideMimeType ) {\\n\\t\\t\\t\\t\\txhr.overrideMimeType( options.mimeType );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// X-Requested-With header\\n\\t\\t\\t\\t// For cross-domain requests, seeing as conditions for a preflight are\\n\\t\\t\\t\\t// akin to a jigsaw puzzle, we simply never set it to be sure.\\n\\t\\t\\t\\t// (it can always be set on a per-request basis or even using ajaxSetup)\\n\\t\\t\\t\\t// For same-domain requests, won't change header if already provided.\\n\\t\\t\\t\\tif ( !options.crossDomain && !headers[ \\\"X-Requested-With\\\" ] ) {\\n\\t\\t\\t\\t\\theaders[ \\\"X-Requested-With\\\" ] = \\\"XMLHttpRequest\\\";\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Set headers\\n\\t\\t\\t\\tfor ( i in headers ) {\\n\\t\\t\\t\\t\\txhr.setRequestHeader( i, headers[ i ] );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Callback\\n\\t\\t\\t\\tcallback = function( type ) {\\n\\t\\t\\t\\t\\treturn function() {\\n\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\tcallback = errorCallback = xhr.onload =\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\\n\\n\\t\\t\\t\\t\\t\\t\\tif ( type === \\\"abort\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.abort();\\n\\t\\t\\t\\t\\t\\t\\t} else if ( type === \\\"error\\\" ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t// On a manual native abort, IE9 throws\\n\\t\\t\\t\\t\\t\\t\\t\\t// errors on any property access that is not readyState\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( typeof xhr.status !== \\\"number\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete( 0, \\\"error\\\" );\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// File: protocol always yields status 0; see #8605, #14207\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhrSuccessStatus[ xhr.status ] || xhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText,\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// IE9 has no XHR2 but throws on binary (trac-11426)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// For XHR2 non-text, let the caller handle it (gh-2498)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t( xhr.responseType || \\\"text\\\" ) !== \\\"text\\\" ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttypeof xhr.responseText !== \\\"string\\\" ?\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ binary: xhr.response } :\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ text: xhr.responseText },\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.getAllResponseHeaders()\\n\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t};\\n\\n\\t\\t\\t\\t// Listen to events\\n\\t\\t\\t\\txhr.onload = callback();\\n\\t\\t\\t\\terrorCallback = xhr.onerror = callback( \\\"error\\\" );\\n\\n\\t\\t\\t\\t// Support: IE 9 only\\n\\t\\t\\t\\t// Use onreadystatechange to replace onabort\\n\\t\\t\\t\\t// to handle uncaught aborts\\n\\t\\t\\t\\tif ( xhr.onabort !== undefined ) {\\n\\t\\t\\t\\t\\txhr.onabort = errorCallback;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\txhr.onreadystatechange = function() {\\n\\n\\t\\t\\t\\t\\t\\t// Check readyState before timeout as it changes\\n\\t\\t\\t\\t\\t\\tif ( xhr.readyState === 4 ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Allow onerror to be called first,\\n\\t\\t\\t\\t\\t\\t\\t// but that will not handle a native abort\\n\\t\\t\\t\\t\\t\\t\\t// Also, save errorCallback to a variable\\n\\t\\t\\t\\t\\t\\t\\t// as xhr.onerror cannot be accessed\\n\\t\\t\\t\\t\\t\\t\\twindow.setTimeout( function() {\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\terrorCallback();\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Create the abort callback\\n\\t\\t\\t\\tcallback = callback( \\\"abort\\\" );\\n\\n\\t\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t\\t// Do send the request (this may raise an exception)\\n\\t\\t\\t\\t\\txhr.send( options.hasContent && options.data || null );\\n\\t\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t\\t// #14683: Only rethrow if this hasn't been notified as an error yet\\n\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\tabort: function() {\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\\njQuery.ajaxPrefilter( function( s ) {\\n\\tif ( s.crossDomain ) {\\n\\t\\ts.contents.script = false;\\n\\t}\\n} );\\n\\n// Install script dataType\\njQuery.ajaxSetup( {\\n\\taccepts: {\\n\\t\\tscript: \\\"text/javascript, application/javascript, \\\" +\\n\\t\\t\\t\\\"application/ecmascript, application/x-ecmascript\\\"\\n\\t},\\n\\tcontents: {\\n\\t\\tscript: /\\\\b(?:java|ecma)script\\\\b/\\n\\t},\\n\\tconverters: {\\n\\t\\t\\\"text script\\\": function( text ) {\\n\\t\\t\\tjQuery.globalEval( text );\\n\\t\\t\\treturn text;\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Handle cache's special case and crossDomain\\njQuery.ajaxPrefilter( \\\"script\\\", function( s ) {\\n\\tif ( s.cache === undefined ) {\\n\\t\\ts.cache = false;\\n\\t}\\n\\tif ( s.crossDomain ) {\\n\\t\\ts.type = \\\"GET\\\";\\n\\t}\\n} );\\n\\n// Bind script tag hack transport\\njQuery.ajaxTransport( \\\"script\\\", function( s ) {\\n\\n\\t// This transport only deals with cross domain requests\\n\\tif ( s.crossDomain ) {\\n\\t\\tvar script, callback;\\n\\t\\treturn {\\n\\t\\t\\tsend: function( _, complete ) {\\n\\t\\t\\t\\tscript = jQuery( \\\"\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlP2FiYTYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjdGlvbi1saW5rW2RhdGEtdi0yMjU3NzhjMl0ge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5tLWItbm9uZVtkYXRhLXYtMjI1Nzc4YzJdIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIlBlcnNvbmFsQWNjZXNzVG9rZW5zLnZ1ZT81NzM0ZjRlNFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJQZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVxcXCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2Vuc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cXFwiYWN0aW9uLWxpbmtcXFwiIEBjbGljaz1cXFwic2hvd0NyZWF0ZVRva2VuRm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBOZXcgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBUb2tlbnMgTm90aWNlIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XFxcIm0tYi1ub25lXFxcIiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID09PSAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZSBub3QgY3JlYXRlZCBhbnkgcGVyc29uYWwgYWNjZXNzIHRva2Vucy5cXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUGVyc29uYWwgQWNjZXNzIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCIgdi1pZj1cXFwidG9rZW5zLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cXFwidG9rZW4gaW4gdG9rZW5zXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xpZW50IE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b2tlbi5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGUgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gTW9kYWwgLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbCBmYWRlXFxcIiBpZD1cXFwibW9kYWwtY3JlYXRlLXRva2VuXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZm9ybS5lcnJvcnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+V2hvb3BzITwvc3Ryb25nPiBTb21ldGhpbmcgd2VudCB3cm9uZyE8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIHYtZm9yPVxcXCJlcnJvciBpbiBmb3JtLmVycm9yc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXJyb3IgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gRm9ybSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cXFwiZm9ybS1ob3Jpem9udGFsXFxcIiByb2xlPVxcXCJmb3JtXFxcIiBAc3VibWl0LnByZXZlbnQ9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+TmFtZTwvbGFiZWw+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJjcmVhdGUtdG9rZW4tbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwibmFtZVxcXCIgdi1tb2RlbD1cXFwiZm9ybS5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTY29wZXMgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIHYtaWY9XFxcInNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+U2NvcGVzPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC02XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtZm9yPVxcXCJzY29wZSBpbiBzY29wZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjaGVja2JveFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcInRvZ2dsZVNjb3BlKHNjb3BlLmlkKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNoZWNrZWQ9XFxcInNjb3BlSXNBc3NpZ25lZChzY29wZS5pZClcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzY29wZS5pZCB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQWNjZXNzIFRva2VuIE1vZGFsIC0tPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwgZmFkZVxcXCIgaWQ9XFxcIm1vZGFsLWFjY2Vzcy10b2tlblxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2VuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgeW91ciBuZXcgcGVyc29uYWwgYWNjZXNzIHRva2VuLiBUaGlzIGlzIHRoZSBvbmx5IHRpbWUgaXQgd2lsbCBiZSBzaG93biBzbyBkb24ndCBsb3NlIGl0IVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IG5vdyB1c2UgdGhpcyB0b2tlbiB0byBtYWtlIEFQSSByZXF1ZXN0cy5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT57eyBhY2Nlc3NUb2tlbiB9fTwvY29kZT48L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNb2RhbCBBY3Rpb25zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCI+Q2xvc2U8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogbnVsbCxcXG5cXG4gICAgICAgICAgICAgICAgdG9rZW5zOiBbXSxcXG4gICAgICAgICAgICAgICAgc2NvcGVzOiBbXSxcXG5cXG4gICAgICAgICAgICAgICAgZm9ybToge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICBzY29wZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW5zKCk7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2NvcGVzKCk7XFxuXFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5vbignc2hvd24uYnMubW9kYWwnLCAoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAkKCcjY3JlYXRlLXRva2VuLW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zID0gcmVzcG9uc2UuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBzY29wZXMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgZ2V0U2NvcGVzKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmdldCgnL29hdXRoL3Njb3BlcycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlcyA9IHJlc3BvbnNlLmRhdGE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBTaG93IHRoZSBmb3JtIGZvciBjcmVhdGluZyBuZXcgdG9rZW5zLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dDcmVhdGVUb2tlbkZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5tb2RhbCgnc2hvdycpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogQ3JlYXRlIGEgbmV3IHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBzdG9yZSgpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XFxuXFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2VucycsIHRoaXMuZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5uYW1lID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmVycm9ycyA9IFtdO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHJlc3BvbnNlLmRhdGEudG9rZW4pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBY2Nlc3NUb2tlbihyZXNwb25zZS5kYXRhLmFjY2Vzc1Rva2VuKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBfLmZsYXR0ZW4oXy50b0FycmF5KHJlc3BvbnNlLmRhdGEpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kaXIodGhpcy5mb3JtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLiddO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBUb2dnbGUgdGhlIGdpdmVuIHNjb3BlIGluIHRoZSBsaXN0IG9mIGFzc2lnbmVkIHNjb3Blcy5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB0b2dnbGVTY29wZShzY29wZSkge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZUlzQXNzaWduZWQoc2NvcGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2NvcGVzID0gXy5yZWplY3QodGhpcy5mb3JtLnNjb3BlcywgcyA9PiBzID09IHNjb3BlKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMucHVzaChzY29wZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gc2NvcGUgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRva2VuLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNjb3BlSXNBc3NpZ25lZChzY29wZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5pbmRleE9mKHRoaXMuZm9ybS5zY29wZXMsIHNjb3BlKSA+PSAwO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZ2l2ZW4gYWNjZXNzIHRva2VuIHRvIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLXRva2VuJykubW9kYWwoJ2hpZGUnKTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtYWNjZXNzLXRva2VuJykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFJldm9rZSB0aGUgZ2l2ZW4gdG9rZW4uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcmV2b2tlKHRva2VuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZGVsZXRlKCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2Vucy8nICsgdG9rZW4uaWQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXX1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0yMjU3NzhjMiZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9wYXNzcG9ydC9QZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcbi8vIG1vZHVsZSBpZCA9IDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"alert.vue\\\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvYWxlcnQudnVlP2EwMWUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJcIixcImZpbGVcIjpcImFsZXJ0LnZ1ZVwifV0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNlZGVmM2JhJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2FsZXJ0LnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\ntd[data-v-5301a236] {\\\\n font-size: 14px;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"importer.vue?ec28e03c\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA\\\",\\\"file\\\":\\\"importer.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXIudnVlPzNiMGEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxudGRbZGF0YS12LTUzMDFhMjM2XSB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcImltcG9ydGVyLnZ1ZT9lYzI4ZTAzY1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJpbXBvcnRlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG50ZCB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuPC9zdHlsZT5cXG48dGVtcGxhdGU+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJvd1xcXCI+XFxuICAgICAgICA8YWxlcnQgdi1zaG93PVxcXCJhbGVydC52aXNpYmxlXFxcIiA6YWxlcnRUeXBlPVxcXCJhbGVydC50eXBlXFxcIiB2LW9uOmhpZGU9XFxcImFsZXJ0LnZpc2libGUgPSBmYWxzZVxcXCI+e3sgYWxlcnQubWVzc2FnZSB9fTwvYWxlcnQ+XFxuICAgICAgICA8ZXJyb3JzIDplcnJvcnM9XFxcImltcG9ydEVycm9yc1xcXCI+PC9lcnJvcnM+XFxuICAgICAgICA8bW9kYWwgdi1tb2RlbD1cXFwiZGlzcGxheUltcG9ydE1vZGFsXFxcIiBlZmZlY3Q9XFxcImZhZGVcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgc2xvdD1cXFwibW9kYWwtaGVhZGVyXFxcIiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVxcXCJtb2RhbC10aXRsZVxcXCI+SW1wb3J0IEZpbGU6PC9oND5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IHNsb3Q9XFxcIm1vZGFsLWJvZHlcXFwiIGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZHluYW1pYy1mb3JtLXJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNCBjb2wteHMtMTJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJpbXBvcnQtdHlwZVxcXCI+SW1wb3J0IFR5cGU6PC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTggY29sLXhzLTEyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0MiA6b3B0aW9ucz1cXFwibW9kYWwuaW1wb3J0VHlwZXNcXFwiIHYtbW9kZWw9XFxcIm1vZGFsLmltcG9ydFR5cGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPVxcXCIwXFxcIj48L29wdGlvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdDI+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkeW5hbWljLWZvcm0tcm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC00IGNvbC14cy0xMlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImltcG9ydC11cGRhdGVcXFwiPlVwZGF0ZSBFeGlzdGluZyBWYWx1ZXM/OjwvbGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC04IGNvbC14cy0xMlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBuYW1lPVxcXCJpbXBvcnQtdXBkYXRlXFxcIiB2LW1vZGVsPVxcXCJtb2RhbC51cGRhdGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIiBzbG90PVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1zdWNjZXNzIGNvbC1tZC01IGNvbC1tZC1vZmZzZXQtMVxcXCIgc3R5bGU9XFxcInRleHQtYWxpZ246bGVmdFxcXCIgdi1pZj1cXFwibW9kYWwuc3RhdHVzVGV4dFxcXCI+e3sgdGhpcy5tb2RhbC5zdGF0dXNUZXh0IH19PC9kaXY+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBAY2xpY2s9XFxcImRpc3BsYXlJbXBvcnRNb2RhbCA9IGZhbHNlXFxcIj5DYW5jZWw8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwicG9zdFNhdmVcXFwiPlByb2Nlc3M8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvbW9kYWw+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTJcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBmaWxlaW5wdXQtYnV0dG9uIHNwYW4gaXMgdXNlZCB0byBzdHlsZSB0aGUgZmlsZSBpbnB1dCBmaWVsZCBhcyBidXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJidG4gYnRuLWluZm8gZmlsZWlucHV0LWJ1dHRvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TZWxlY3QgSW1wb3J0IEZpbGUuLi48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBmaWxlIGlucHV0IGZpZWxkIHVzZWQgYXMgdGFyZ2V0IGZvciB0aGUgZmlsZSB1cGxvYWQgd2lkZ2V0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJmaWxldXBsb2FkXFxcIiB0eXBlPVxcXCJmaWxlXFxcIiBuYW1lPVxcXCJmaWxlc1tdXFxcIiBkYXRhLXVybD1cXFwiL2FwaS92MS9pbXBvcnRzXFxcIiBhY2NlcHQ9XFxcInRleHQvY3N2XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC05XFxcIiB2LXNob3c9XFxcInByb2dyZXNzLnZpc2libGVcXFwiIHN0eWxlPVxcXCJwYWRkaW5nLWJvdHRvbToyMHB4XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTExXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInByb2dyZXNzIHByb2dyZXNzLXN0cmlwZWQtYWN0aXZlXFxcIiBzdHlsZT1cXFwibWFyZ2luLXRvcDogOHB4XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwcm9ncmVzcy1iYXJcXFwiIDpjbGFzcz1cXFwicHJvZ3Jlc3MuY3VycmVudENsYXNzXFxcIiByb2xlPVxcXCJwcm9ncmVzc2JhclxcXCIgOnN0eWxlPVxcXCJwcm9ncmVzc1dpZHRoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJvZ3Jlc3Muc3RhdHVzVGV4dCB9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XFxcInRhYmxlIHRhYmxlLXN0cmlwZWRcXFwiIGlkPVxcXCJ1cGxvYWQtdGFibGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5GaWxlPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+Q3JlYXRlZDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNpemU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImZpbGUgaW4gZmlsZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZmlsZS5maWxlX3BhdGggfX08L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZmlsZS5jcmVhdGVkX2F0IH19IDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBmaWxlLmZpbGVzaXplIH19PC90ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiYnRuIGJ0bi1zbSBidG4taW5mb1xcXCIgQGNsaWNrPVxcXCJzaG93TW9kYWwoZmlsZSlcXFwiPjxpIGNsYXNzPVxcXCJmYSBmYS1zcGlubmVyIHByb2Nlc3NcXFwiPjwvaT5Qcm9jZXNzPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJidG4gYnRuLXNtIGJ0bi1kYW5nZXJcXFwiIEBjbGljaz1cXFwiZGVsZXRlRmlsZShmaWxlKVxcXCI+PGkgY2xhc3M9XFxcImZhIGZhLXRyYXNoIGljb24td2hpdGVcXFwiPjwvaT48L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIHJlcXVpcmUoJ2JsdWVpbXAtZmlsZS11cGxvYWQnKTtcXG4gICAgdmFyIG1vZGFsID0gcmVxdWlyZSgndnVlLXN0cmFwJykubW9kYWxcXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGZpbGVzOiBbXSxcXG4gICAgICAgICAgICAgICAgZGlzcGxheUltcG9ydE1vZGFsOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgYWN0aXZlRmlsZTogbnVsbCxcXG4gICAgICAgICAgICAgICAgYWxlcnQ6IHtcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBudWxsLFxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIG1vZGFsOiB7XFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRUeXBlOiAnYXNzZXQnLFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydFR5cGVzOiBbXFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogJ2Fzc2V0JywgdGV4dDogJ0Fzc2V0cycgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAnYWNjZXNzb3J5JywgdGV4dDogJ0FjY2Vzc29yaWVzJyB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdjb25zdW1hYmxlJywgdGV4dDogJ0NvbnN1bWFibGUnIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogJ2NvbXBvbmVudCcsIHRleHQ6ICdDb21wb25lbnRzJyB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdsaWNlbnNlJywgdGV4dDogJ0xpY2Vuc2VzJyB9XFxuICAgICAgICAgICAgICAgICAgICBdLFxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogbnVsbCxcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgaW1wb3J0RXJyb3JzOiBudWxsLFxcbiAgICAgICAgICAgICAgICBwcm9ncmVzczoge1xcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzOiBcXFwicHJvZ3Jlc3MtYmFyLXdhcm5pbmdcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBlcmNlbnQ6IFxcXCIwXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6ICcnLFxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLyoqXFxuICAgICAgICAgKiBQcmVwYXJlIHRoZSBjb21wb25lbnQgKFZ1ZSAyLngpLlxcbiAgICAgICAgICovXFxuICAgICAgICBtb3VudGVkKCkge1xcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hGaWxlcygpO1xcbiAgICAgICAgICAgIGxldCB2bSA9IHRoaXM7XFxuICAgICAgICAgICAgJCgnI2ZpbGV1cGxvYWQnKS5maWxldXBsb2FkKHtcXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcXG4gICAgICAgICAgICAgICAgZG9uZShlLCBkYXRhKSB7XFxuICAgICAgICAgICAgICAgICAgICB2bS5wcm9ncmVzcy5jdXJyZW50Q2xhc3M9XFxcInByb2dyZXNzLWJhci1zdWNjZXNzXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLnN0YXR1c1RleHQgPSBcXFwiU3VjY2VzcyFcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgdm0uZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlcy5jb25jYXQodm0uZmlsZXMpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBhZGQoZSwgZGF0YSkge1xcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5oZWFkZXJzID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJYLVJlcXVlc3RlZC1XaXRoXFxcIjogJ1hNTEh0dHBSZXF1ZXN0JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiWC1DU1JGLVRPS0VOXFxcIjogTGFyYXZlbC5jc3JmVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKCAoKSA9PiB7ZGF0YS5zdWJtaXQoKTt9KTtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLnZpc2libGU9dHJ1ZTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3MoZSwgZGF0YSkge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2dyZXNzID0gcGFyc2VJbnQoKGRhdGEubG9hZGVkIC8gZGF0YS50b3RhbCAqIDEwMCwgMTApKTtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLmN1cnJlbnRQZXJjZW50ID0gcHJvZ3Jlc3M7XFxuICAgICAgICAgICAgICAgICAgICB2bS5wcm9ncmVzcy5zdGF0dXNUZXh0ID0gcHJvZ3Jlc3MrJyUgQ29tcGxldGUnO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBmYWlsKGUsIGRhdGEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLmN1cnJlbnRDbGFzcyA9IFxcXCJwcm9ncmVzcy1iYXItZGFuZ2VyXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIC8vIERpc3BsYXkgYW55IGVycm9ycyByZXR1cm5lZCBmcm9tIHRoZSAkLmFqYXgoKVxcbiAgICAgICAgICAgICAgICAgICAgdm0ucHJvZ3Jlc3Muc3RhdHVzVGV4dCA9IGRhdGEuanFYSFIucmVzcG9uc2VKU09OLm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgZmV0Y2hGaWxlcygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9hcGkvdjEvaW1wb3J0cycpXFxuICAgICAgICAgICAgICAgIC50aGVuKCAoe2RhdGF9KSA9PiB0aGlzLmZpbGVzID0gZGF0YSwgLy8gU3VjY2Vzc1xcbiAgICAgICAgICAgICAgICAgICAgLy9GYWlsXFxuICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC50eXBlPVxcXCJkYW5nZXJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC52aXNpYmxlPXRydWU7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0Lm1lc3NhZ2U9XFxcIlNvbWV0aGluZyB3ZW50IHdyb25nIGZldGNoaW5nIGZpbGVzLi4uXFxcIjtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBkZWxldGVGaWxlKGZpbGUsIGtleSkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZShcXFwiL2FwaS92MS9pbXBvcnRzL1xcXCIrZmlsZS5pZClcXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB0aGlzLmZpbGVzLnNwbGljZShrZXksIDEpLCAvLyBTdWNjZXNzXFxuICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHsvLyBGYWlsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC50eXBlPVxcXCJkYW5nZXJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQudmlzaWJsZT10cnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQubWVzc2FnZT1yZXNwb25zZS5ib2R5Lm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgc2hvd01vZGFsKGZpbGUpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGaWxlID0gZmlsZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SW1wb3J0TW9kYWwgPSB0cnVlO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgcG9zdFNhdmUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuc3RhdHVzVGV4dCA9IFxcXCJQcm9jZXNzaW5nLi4uXFxcIjtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvYXBpL3YxL2ltcG9ydHMvcHJvY2Vzcy8nK3RoaXMuYWN0aXZlRmlsZS5pZCwge1xcbiAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydC11cGRhdGUnOiB0aGlzLm1vZGFsLnVwZGF0ZSxcXG4gICAgICAgICAgICAgICAgICAgICdpbXBvcnQtdHlwZSc6IHRoaXMubW9kYWwuaW1wb3J0VHlwZVxcbiAgICAgICAgICAgICAgICB9KS50aGVuKCAocmVzcG9uc2UpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3NcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuc3RhdHVzVGV4dCA9IFxcXCJTdWNjZXNzLi4uIFJlZGlyZWN0aW5nLlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlLmJvZHkubWVzc2FnZXMucmVkaXJlY3RfdXJsO1xcbiAgICAgICAgICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vIEZhaWx1cmVcXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmJvZHkuc3RhdHVzID09ICdpbXBvcnQtZXJyb3JzJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0RXJyb3JzID0gcmVzcG9uc2UuYm9keS5tZXNzYWdlcztcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC5tZXNzYWdlPSByZXNwb25zZS5ib2R5Lm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQudHlwZT1cXFwiZGFuZ2VyXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0LnZpc2libGU9dHJ1ZTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUltcG9ydE1vZGFsPWZhbHNlO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICB9LFxcblxcbiAgICAgICAgY29tcHV0ZWQ6IHtcXG4gICAgICAgICAgICBwcm9ncmVzc1dpZHRoKCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcIndpZHRoOiBcXFwiK3RoaXMucHJvZ3Jlc3MuY3VycmVudFBlcmNlbnQqMTArJyUnO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBjb21wb25lbnRzOiB7XFxuICAgICAgICAgICAgbW9kYWwsXFxuICAgICAgICAgICAgZXJyb3JzOiByZXF1aXJlKCcuL2ltcG9ydGVyLWVycm9ycy52dWUnKSxcXG4gICAgICAgICAgICBhbGVydDogcmVxdWlyZSgnLi4vYWxlcnQudnVlJyksXFxuICAgICAgICAgICAgc2VsZWN0MjogcmVxdWlyZSgnLi4vc2VsZWN0Mi52dWUnKVxcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuPC9zY3JpcHQ+XFxuXCJdfV0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTUzMDFhMjM2JnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2ltcG9ydGVyL2ltcG9ydGVyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"importer-errors.vue\\\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZT8zYWQ2Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcblxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiXCIsXCJmaWxlXCI6XCJpbXBvcnRlci1lcnJvcnMudnVlXCJ9XSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNTY2N2MzMTImc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n.action-link[data-v-de0d0e4e] {\\\\n cursor: pointer;\\\\n}\\\\n.m-b-none[data-v-de0d0e4e] {\\\\n margin-bottom: 0;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"AuthorizedClients.vue?a99076c0\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\\\",\\\"file\\\":\\\"AuthorizedClients.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlPzA2NGIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjdGlvbi1saW5rW2RhdGEtdi1kZTBkMGU0ZV0ge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5tLWItbm9uZVtkYXRhLXYtZGUwZDBlNGVdIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIkF1dGhvcml6ZWRDbGllbnRzLnZ1ZT9hOTkwNzZjMFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBdXRob3JpemVkQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmdcXFwiPkF1dGhvcml6ZWQgQXBwbGljYXRpb25zPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRob3JpemVkIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+U2NvcGVzPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcInRva2VuIGluIHRva2Vuc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudCBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uY2xpZW50Lm5hbWUgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNjb3BlcyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XFxcInRva2VuLnNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uc2NvcGVzLmpvaW4oJywgJykgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXZva2UgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZva2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICB0b2tlbnM6IFtdXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBwcmVwYXJlQ29tcG9uZW50KCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogR2V0IGFsbCBvZiB0aGUgYXV0aG9yaXplZCB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC90b2tlbnMnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbnMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUmV2b2tlIHRoZSBnaXZlbiB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICByZXZva2UodG9rZW4pIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5kZWxldGUoJy9vYXV0aC90b2tlbnMvJyArIHRva2VuLmlkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbnMoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cIl19XSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZGUwZDBlNGUmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlXG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n.action-link[data-v-e9c80318] {\\\\n cursor: pointer;\\\\n}\\\\n.m-b-none[data-v-e9c80318] {\\\\n margin-bottom: 0;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"Clients.vue?35867ce4\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\\\",\\\"file\\\":\\\"Clients.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/ZjE0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LWU5YzgwMzE4XSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi1lOWM4MDMxOF0ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiQ2xpZW50cy52dWU/MzU4NjdjZTRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0EsZ0JBQUE7Q0FDQTtBQUVBO0lBQ0EsaUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XFxcImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgT0F1dGggQ2xpZW50c1xcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcInNob3dDcmVhdGVDbGllbnRGb3JtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IENsaWVudFxcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBDdXJyZW50IENsaWVudHMgLS0+XFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVxcXCJtLWItbm9uZVxcXCIgdi1pZj1cXFwiY2xpZW50cy5sZW5ndGggPT09IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgWW91IGhhdmUgbm90IGNyZWF0ZWQgYW55IE9BdXRoIGNsaWVudHMuXFxuICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVxcXCJ0YWJsZSB0YWJsZS1ib3JkZXJsZXNzIG0tYi1ub25lXFxcIiB2LWlmPVxcXCJjbGllbnRzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkNsaWVudCBJRDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNlY3JldDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImNsaWVudCBpbiBjbGllbnRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJRCAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjbGllbnQuaWQgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNsaWVudC5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VjcmV0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt7IGNsaWVudC5zZWNyZXQgfX08L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRWRpdCBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcImVkaXQoY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZSBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcImRlc3Ryb3koY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgIDwvdGFibGU+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1jcmVhdGUtY2xpZW50XFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgQ2xpZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtIEVycm9ycyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1kYW5nZXJcXFwiIHYtaWY9XFxcImNyZWF0ZUZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gY3JlYXRlRm9ybS5lcnJvcnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVycm9yIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBGb3JtIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVxcXCJmb3JtLWhvcml6b250YWxcXFwiIHJvbGU9XFxcImZvcm1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5OYW1lPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImNyZWF0ZS1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJzdG9yZVxcXCIgdi1tb2RlbD1cXFwiY3JlYXRlRm9ybS5uYW1lXFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aGluZyB5b3VyIHVzZXJzIHdpbGwgcmVjb2duaXplIGFuZCB0cnVzdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVkaXJlY3QgVVJMIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTMgY29udHJvbC1sYWJlbFxcXCI+UmVkaXJlY3QgVVJMPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwicmVkaXJlY3RcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBrZXl1cC5lbnRlcj1cXFwic3RvcmVcXFwiIHYtbW9kZWw9XFxcImNyZWF0ZUZvcm0ucmVkaXJlY3RcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91ciBhcHBsaWNhdGlvbidzIGF1dGhvcml6YXRpb24gY2FsbGJhY2sgVVJMLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTW9kYWwgQWN0aW9ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIGRhdGEtZGlzbWlzcz1cXFwibW9kYWxcXFwiPkNsb3NlPC9idXR0b24+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwic3RvcmVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBFZGl0IENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1lZGl0LWNsaWVudFxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBDbGllbnRcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZWRpdEZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gZWRpdEZvcm0uZXJyb3JzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlcnJvciB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVkaXQgQ2xpZW50IEZvcm0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XFxcImZvcm0taG9yaXpvbnRhbFxcXCIgcm9sZT1cXFwiZm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmFtZSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XFxcImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcXFwiPk5hbWU8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwiZWRpdC1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLm5hbWVcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZXRoaW5nIHlvdXIgdXNlcnMgd2lsbCByZWNvZ25pemUgYW5kIHRydXN0LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWRpcmVjdCBVUkwgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5SZWRpcmVjdCBVUkw8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuYW1lPVxcXCJyZWRpcmVjdFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLnJlZGlyZWN0XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdXIgYXBwbGljYXRpb24ncyBhdXRob3JpemF0aW9uIGNhbGxiYWNrIFVSTC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInVwZGF0ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgQ2hhbmdlc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvdGVtcGxhdGU+XFxuXFxuPHNjcmlwdD5cXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGNsaWVudHM6IFtdLFxcblxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb3JtOiB7XFxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogJydcXG4gICAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAgICAgZWRpdEZvcm06IHtcXG4gICAgICAgICAgICAgICAgICAgIGVycm9yczogW10sXFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyxcXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnJ1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLWNsaWVudCcpLm9uKCdzaG93bi5icy5tb2RhbCcsICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGUtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50Jykub24oJ3Nob3duLmJzLm1vZGFsJywgKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgJCgnI2VkaXQtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIE9BdXRoIGNsaWVudHMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldENsaWVudHMoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZ2V0KCcvb2F1dGgvY2xpZW50cycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZm9ybSBmb3IgY3JlYXRpbmcgbmV3IGNsaWVudHMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgc2hvd0NyZWF0ZUNsaWVudEZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIENyZWF0ZSBhIG5ldyBPQXV0aCBjbGllbnQgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHN0b3JlKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RDbGllbnQoXFxuICAgICAgICAgICAgICAgICAgICAncG9zdCcsICcvb2F1dGgvY2xpZW50cycsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm0sICcjbW9kYWwtY3JlYXRlLWNsaWVudCdcXG4gICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEVkaXQgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBlZGl0KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLmlkID0gY2xpZW50LmlkO1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLm5hbWUgPSBjbGllbnQubmFtZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5yZWRpcmVjdCA9IGNsaWVudC5yZWRpcmVjdDtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgY2xpZW50IGJlaW5nIGVkaXRlZC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB1cGRhdGUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdENsaWVudChcXG4gICAgICAgICAgICAgICAgICAgICdwdXQnLCAnL29hdXRoL2NsaWVudHMvJyArIHRoaXMuZWRpdEZvcm0uaWQsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLCAnI21vZGFsLWVkaXQtY2xpZW50J1xcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUGVyc2lzdCB0aGUgY2xpZW50IHRvIHN0b3JhZ2UgdXNpbmcgdGhlIGdpdmVuIGZvcm0uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcGVyc2lzdENsaWVudChtZXRob2QsIHVyaSwgZm9ybSwgbW9kYWwpIHtcXG4gICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cFttZXRob2RdKHVyaSwgZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsaWVudHMoKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLm5hbWUgPSAnJztcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlZGlyZWN0ID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAkKG1vZGFsKS5tb2RhbCgnaGlkZScpO1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5kYXRhID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmVycm9ycyA9IF8uZmxhdHRlbihfLnRvQXJyYXkocmVzcG9uc2UuZGF0YSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZXJyb3JzID0gWydTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERlc3Ryb3kgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBkZXN0cm95KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZSgnL29hdXRoL2NsaWVudHMvJyArIGNsaWVudC5pZClcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXX1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1lOWM4MDMxOCZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9wYXNzcG9ydC9DbGllbnRzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"select2.vue\\\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvc2VsZWN0Mi52dWU/MTkwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwic2VsZWN0Mi52dWVcIn1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZjU2NGE4NiZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9zZWxlY3QyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {\\n\\tif ( true ) {\\n\\n\\t\\t// AMD. Register as an anonymous module.\\n\\t\\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\t} else {\\n\\n\\t\\t// Browser globals\\n\\t\\tfactory( jQuery );\\n\\t}\\n} ( function( $ ) {\\n\\n$.ui = $.ui || {};\\n\\nreturn $.ui.version = \\\"1.12.1\\\";\\n\\n} ) );\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzP2JkNDEiXSwic291cmNlc0NvbnRlbnQiOlsiKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSAoIGZ1bmN0aW9uKCAkICkge1xuXG4kLnVpID0gJC51aSB8fCB7fTtcblxucmV0dXJuICQudWkudmVyc2lvbiA9IFwiMS4xMi4xXCI7XG5cbn0gKSApO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\\n * jQuery UI Widget 1.12.1\\n * http://jqueryui.com\\n *\\n * Copyright jQuery Foundation and other contributors\\n * Released under the MIT license.\\n * http://jquery.org/license\\n */\\n\\n//>>label: Widget\\n//>>group: Core\\n//>>description: Provides a factory for creating stateful widgets with a common API.\\n//>>docs: http://api.jqueryui.com/jQuery.widget/\\n//>>demos: http://jqueryui.com/widget/\\n\\n( function( factory ) {\\n\\tif ( true ) {\\n\\n\\t\\t// AMD. Register as an anonymous module.\\n\\t\\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3), __webpack_require__(26) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\t} else {\\n\\n\\t\\t// Browser globals\\n\\t\\tfactory( jQuery );\\n\\t}\\n}( function( $ ) {\\n\\nvar widgetUuid = 0;\\nvar widgetSlice = Array.prototype.slice;\\n\\n$.cleanData = ( function( orig ) {\\n\\treturn function( elems ) {\\n\\t\\tvar events, elem, i;\\n\\t\\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\\n\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t// Only trigger remove when necessary to save time\\n\\t\\t\\t\\tevents = $._data( elem, \\\"events\\\" );\\n\\t\\t\\t\\tif ( events && events.remove ) {\\n\\t\\t\\t\\t\\t$( elem ).triggerHandler( \\\"remove\\\" );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Http://bugs.jquery.com/ticket/8235\\n\\t\\t\\t} catch ( e ) {}\\n\\t\\t}\\n\\t\\torig( elems );\\n\\t};\\n} )( $.cleanData );\\n\\n$.widget = function( name, base, prototype ) {\\n\\tvar existingConstructor, constructor, basePrototype;\\n\\n\\t// ProxiedPrototype allows the provided prototype to remain unmodified\\n\\t// so that it can be used as a mixin for multiple widgets (#8876)\\n\\tvar proxiedPrototype = {};\\n\\n\\tvar namespace = name.split( \\\".\\\" )[ 0 ];\\n\\tname = name.split( \\\".\\\" )[ 1 ];\\n\\tvar fullName = namespace + \\\"-\\\" + name;\\n\\n\\tif ( !prototype ) {\\n\\t\\tprototype = base;\\n\\t\\tbase = $.Widget;\\n\\t}\\n\\n\\tif ( $.isArray( prototype ) ) {\\n\\t\\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\\n\\t}\\n\\n\\t// Create selector for plugin\\n\\t$.expr[ \\\":\\\" ][ fullName.toLowerCase() ] = function( elem ) {\\n\\t\\treturn !!$.data( elem, fullName );\\n\\t};\\n\\n\\t$[ namespace ] = $[ namespace ] || {};\\n\\texistingConstructor = $[ namespace ][ name ];\\n\\tconstructor = $[ namespace ][ name ] = function( options, element ) {\\n\\n\\t\\t// Allow instantiation without \\\"new\\\" keyword\\n\\t\\tif ( !this._createWidget ) {\\n\\t\\t\\treturn new constructor( options, element );\\n\\t\\t}\\n\\n\\t\\t// Allow instantiation without initializing for simple inheritance\\n\\t\\t// must use \\\"new\\\" keyword (the code above always passes args)\\n\\t\\tif ( arguments.length ) {\\n\\t\\t\\tthis._createWidget( options, element );\\n\\t\\t}\\n\\t};\\n\\n\\t// Extend with the existing constructor to carry over any static properties\\n\\t$.extend( constructor, existingConstructor, {\\n\\t\\tversion: prototype.version,\\n\\n\\t\\t// Copy the object used to create the prototype in case we need to\\n\\t\\t// redefine the widget later\\n\\t\\t_proto: $.extend( {}, prototype ),\\n\\n\\t\\t// Track widgets that inherit from this widget in case this widget is\\n\\t\\t// redefined after a widget inherits from it\\n\\t\\t_childConstructors: []\\n\\t} );\\n\\n\\tbasePrototype = new base();\\n\\n\\t// We need to make the options hash a property directly on the new instance\\n\\t// otherwise we'll modify the options hash on the prototype that we're\\n\\t// inheriting from\\n\\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\\n\\t$.each( prototype, function( prop, value ) {\\n\\t\\tif ( !$.isFunction( value ) ) {\\n\\t\\t\\tproxiedPrototype[ prop ] = value;\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tproxiedPrototype[ prop ] = ( function() {\\n\\t\\t\\tfunction _super() {\\n\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\tfunction _superApply( args ) {\\n\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, args );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn function() {\\n\\t\\t\\t\\tvar __super = this._super;\\n\\t\\t\\t\\tvar __superApply = this._superApply;\\n\\t\\t\\t\\tvar returnValue;\\n\\n\\t\\t\\t\\tthis._super = _super;\\n\\t\\t\\t\\tthis._superApply = _superApply;\\n\\n\\t\\t\\t\\treturnValue = value.apply( this, arguments );\\n\\n\\t\\t\\t\\tthis._super = __super;\\n\\t\\t\\t\\tthis._superApply = __superApply;\\n\\n\\t\\t\\t\\treturn returnValue;\\n\\t\\t\\t};\\n\\t\\t} )();\\n\\t} );\\n\\tconstructor.prototype = $.widget.extend( basePrototype, {\\n\\n\\t\\t// TODO: remove support for widgetEventPrefix\\n\\t\\t// always use the name + a colon as the prefix, e.g., draggable:start\\n\\t\\t// don't prefix for widgets that aren't DOM-based\\n\\t\\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\\n\\t}, proxiedPrototype, {\\n\\t\\tconstructor: constructor,\\n\\t\\tnamespace: namespace,\\n\\t\\twidgetName: name,\\n\\t\\twidgetFullName: fullName\\n\\t} );\\n\\n\\t// If this widget is being redefined then we need to find all widgets that\\n\\t// are inheriting from it and redefine all of them so that they inherit from\\n\\t// the new version of this widget. We're essentially trying to replace one\\n\\t// level in the prototype chain.\\n\\tif ( existingConstructor ) {\\n\\t\\t$.each( existingConstructor._childConstructors, function( i, child ) {\\n\\t\\t\\tvar childPrototype = child.prototype;\\n\\n\\t\\t\\t// Redefine the child widget using the same prototype that was\\n\\t\\t\\t// originally used, but inherit from the new version of the base\\n\\t\\t\\t$.widget( childPrototype.namespace + \\\".\\\" + childPrototype.widgetName, constructor,\\n\\t\\t\\t\\tchild._proto );\\n\\t\\t} );\\n\\n\\t\\t// Remove the list of existing child constructors from the old constructor\\n\\t\\t// so the old child constructors can be garbage collected\\n\\t\\tdelete existingConstructor._childConstructors;\\n\\t} else {\\n\\t\\tbase._childConstructors.push( constructor );\\n\\t}\\n\\n\\t$.widget.bridge( name, constructor );\\n\\n\\treturn constructor;\\n};\\n\\n$.widget.extend = function( target ) {\\n\\tvar input = widgetSlice.call( arguments, 1 );\\n\\tvar inputIndex = 0;\\n\\tvar inputLength = input.length;\\n\\tvar key;\\n\\tvar value;\\n\\n\\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\\n\\t\\tfor ( key in input[ inputIndex ] ) {\\n\\t\\t\\tvalue = input[ inputIndex ][ key ];\\n\\t\\t\\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\\n\\n\\t\\t\\t\\t// Clone objects\\n\\t\\t\\t\\tif ( $.isPlainObject( value ) ) {\\n\\t\\t\\t\\t\\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, target[ key ], value ) :\\n\\n\\t\\t\\t\\t\\t\\t// Don't extend strings, arrays, etc. with objects\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, value );\\n\\n\\t\\t\\t\\t// Copy everything else by reference\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttarget[ key ] = value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn target;\\n};\\n\\n$.widget.bridge = function( name, object ) {\\n\\tvar fullName = object.prototype.widgetFullName || name;\\n\\t$.fn[ name ] = function( options ) {\\n\\t\\tvar isMethodCall = typeof options === \\\"string\\\";\\n\\t\\tvar args = widgetSlice.call( arguments, 1 );\\n\\t\\tvar returnValue = this;\\n\\n\\t\\tif ( isMethodCall ) {\\n\\n\\t\\t\\t// If this is an empty collection, we need to have the instance method\\n\\t\\t\\t// return undefined instead of the jQuery instance\\n\\t\\t\\tif ( !this.length && options === \\\"instance\\\" ) {\\n\\t\\t\\t\\treturnValue = undefined;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\t\\tvar methodValue;\\n\\t\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\n\\t\\t\\t\\t\\tif ( options === \\\"instance\\\" ) {\\n\\t\\t\\t\\t\\t\\treturnValue = instance;\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif ( !instance ) {\\n\\t\\t\\t\\t\\t\\treturn $.error( \\\"cannot call methods on \\\" + name +\\n\\t\\t\\t\\t\\t\\t\\t\\\" prior to initialization; \\\" +\\n\\t\\t\\t\\t\\t\\t\\t\\\"attempted to call method '\\\" + options + \\\"'\\\" );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \\\"_\\\" ) {\\n\\t\\t\\t\\t\\t\\treturn $.error( \\\"no such method '\\\" + options + \\\"' for \\\" + name +\\n\\t\\t\\t\\t\\t\\t\\t\\\" widget instance\\\" );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tmethodValue = instance[ options ].apply( instance, args );\\n\\n\\t\\t\\t\\t\\tif ( methodValue !== instance && methodValue !== undefined ) {\\n\\t\\t\\t\\t\\t\\treturnValue = methodValue && methodValue.jquery ?\\n\\t\\t\\t\\t\\t\\t\\treturnValue.pushStack( methodValue.get() ) :\\n\\t\\t\\t\\t\\t\\t\\tmethodValue;\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// Allow multiple hashes to be passed on init\\n\\t\\t\\tif ( args.length ) {\\n\\t\\t\\t\\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\\n\\t\\t\\t}\\n\\n\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\t\\t\\t\\tif ( instance ) {\\n\\t\\t\\t\\t\\tinstance.option( options || {} );\\n\\t\\t\\t\\t\\tif ( instance._init ) {\\n\\t\\t\\t\\t\\t\\tinstance._init();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t$.data( this, fullName, new object( options, this ) );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn returnValue;\\n\\t};\\n};\\n\\n$.Widget = function( /* options, element */ ) {};\\n$.Widget._childConstructors = [];\\n\\n$.Widget.prototype = {\\n\\twidgetName: \\\"widget\\\",\\n\\twidgetEventPrefix: \\\"\\\",\\n\\tdefaultElement: \\\"
\\\",\\n\\n\\toptions: {\\n\\t\\tclasses: {},\\n\\t\\tdisabled: false,\\n\\n\\t\\t// Callbacks\\n\\t\\tcreate: null\\n\\t},\\n\\n\\t_createWidget: function( options, element ) {\\n\\t\\telement = $( element || this.defaultElement || this )[ 0 ];\\n\\t\\tthis.element = $( element );\\n\\t\\tthis.uuid = widgetUuid++;\\n\\t\\tthis.eventNamespace = \\\".\\\" + this.widgetName + this.uuid;\\n\\n\\t\\tthis.bindings = $();\\n\\t\\tthis.hoverable = $();\\n\\t\\tthis.focusable = $();\\n\\t\\tthis.classesElementLookup = {};\\n\\n\\t\\tif ( element !== this ) {\\n\\t\\t\\t$.data( element, this.widgetFullName, this );\\n\\t\\t\\tthis._on( true, this.element, {\\n\\t\\t\\t\\tremove: function( event ) {\\n\\t\\t\\t\\t\\tif ( event.target === element ) {\\n\\t\\t\\t\\t\\t\\tthis.destroy();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t\\tthis.document = $( element.style ?\\n\\n\\t\\t\\t\\t// Element within the document\\n\\t\\t\\t\\telement.ownerDocument :\\n\\n\\t\\t\\t\\t// Element is window or document\\n\\t\\t\\t\\telement.document || element );\\n\\t\\t\\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\\n\\t\\t}\\n\\n\\t\\tthis.options = $.widget.extend( {},\\n\\t\\t\\tthis.options,\\n\\t\\t\\tthis._getCreateOptions(),\\n\\t\\t\\toptions );\\n\\n\\t\\tthis._create();\\n\\n\\t\\tif ( this.options.disabled ) {\\n\\t\\t\\tthis._setOptionDisabled( this.options.disabled );\\n\\t\\t}\\n\\n\\t\\tthis._trigger( \\\"create\\\", null, this._getCreateEventData() );\\n\\t\\tthis._init();\\n\\t},\\n\\n\\t_getCreateOptions: function() {\\n\\t\\treturn {};\\n\\t},\\n\\n\\t_getCreateEventData: $.noop,\\n\\n\\t_create: $.noop,\\n\\n\\t_init: $.noop,\\n\\n\\tdestroy: function() {\\n\\t\\tvar that = this;\\n\\n\\t\\tthis._destroy();\\n\\t\\t$.each( this.classesElementLookup, function( key, value ) {\\n\\t\\t\\tthat._removeClass( value, key );\\n\\t\\t} );\\n\\n\\t\\t// We can probably remove the unbind calls in 2.0\\n\\t\\t// all event bindings should go through this._on()\\n\\t\\tthis.element\\n\\t\\t\\t.off( this.eventNamespace )\\n\\t\\t\\t.removeData( this.widgetFullName );\\n\\t\\tthis.widget()\\n\\t\\t\\t.off( this.eventNamespace )\\n\\t\\t\\t.removeAttr( \\\"aria-disabled\\\" );\\n\\n\\t\\t// Clean up events and states\\n\\t\\tthis.bindings.off( this.eventNamespace );\\n\\t},\\n\\n\\t_destroy: $.noop,\\n\\n\\twidget: function() {\\n\\t\\treturn this.element;\\n\\t},\\n\\n\\toption: function( key, value ) {\\n\\t\\tvar options = key;\\n\\t\\tvar parts;\\n\\t\\tvar curOption;\\n\\t\\tvar i;\\n\\n\\t\\tif ( arguments.length === 0 ) {\\n\\n\\t\\t\\t// Don't return a reference to the internal hash\\n\\t\\t\\treturn $.widget.extend( {}, this.options );\\n\\t\\t}\\n\\n\\t\\tif ( typeof key === \\\"string\\\" ) {\\n\\n\\t\\t\\t// Handle nested keys, e.g., \\\"foo.bar\\\" => { foo: { bar: ___ } }\\n\\t\\t\\toptions = {};\\n\\t\\t\\tparts = key.split( \\\".\\\" );\\n\\t\\t\\tkey = parts.shift();\\n\\t\\t\\tif ( parts.length ) {\\n\\t\\t\\t\\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\\n\\t\\t\\t\\tfor ( i = 0; i < parts.length - 1; i++ ) {\\n\\t\\t\\t\\t\\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\\n\\t\\t\\t\\t\\tcurOption = curOption[ parts[ i ] ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tkey = parts.pop();\\n\\t\\t\\t\\tif ( arguments.length === 1 ) {\\n\\t\\t\\t\\t\\treturn curOption[ key ] === undefined ? null : curOption[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcurOption[ key ] = value;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif ( arguments.length === 1 ) {\\n\\t\\t\\t\\t\\treturn this.options[ key ] === undefined ? null : this.options[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\toptions[ key ] = value;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._setOptions( options );\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOptions: function( options ) {\\n\\t\\tvar key;\\n\\n\\t\\tfor ( key in options ) {\\n\\t\\t\\tthis._setOption( key, options[ key ] );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOption: function( key, value ) {\\n\\t\\tif ( key === \\\"classes\\\" ) {\\n\\t\\t\\tthis._setOptionClasses( value );\\n\\t\\t}\\n\\n\\t\\tthis.options[ key ] = value;\\n\\n\\t\\tif ( key === \\\"disabled\\\" ) {\\n\\t\\t\\tthis._setOptionDisabled( value );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOptionClasses: function( value ) {\\n\\t\\tvar classKey, elements, currentElements;\\n\\n\\t\\tfor ( classKey in value ) {\\n\\t\\t\\tcurrentElements = this.classesElementLookup[ classKey ];\\n\\t\\t\\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\\n\\t\\t\\t\\t\\t!currentElements ||\\n\\t\\t\\t\\t\\t!currentElements.length ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// We are doing this to create a new jQuery object because the _removeClass() call\\n\\t\\t\\t// on the next line is going to destroy the reference to the current elements being\\n\\t\\t\\t// tracked. We need to save a copy of this collection so that we can add the new classes\\n\\t\\t\\t// below.\\n\\t\\t\\telements = $( currentElements.get() );\\n\\t\\t\\tthis._removeClass( currentElements, classKey );\\n\\n\\t\\t\\t// We don't use _addClass() here, because that uses this.options.classes\\n\\t\\t\\t// for generating the string of classes. We want to use the value passed in from\\n\\t\\t\\t// _setOption(), this is the new value of the classes option which was passed to\\n\\t\\t\\t// _setOption(). We pass this value directly to _classes().\\n\\t\\t\\telements.addClass( this._classes( {\\n\\t\\t\\t\\telement: elements,\\n\\t\\t\\t\\tkeys: classKey,\\n\\t\\t\\t\\tclasses: value,\\n\\t\\t\\t\\tadd: true\\n\\t\\t\\t} ) );\\n\\t\\t}\\n\\t},\\n\\n\\t_setOptionDisabled: function( value ) {\\n\\t\\tthis._toggleClass( this.widget(), this.widgetFullName + \\\"-disabled\\\", null, !!value );\\n\\n\\t\\t// If the widget is becoming disabled, then nothing is interactive\\n\\t\\tif ( value ) {\\n\\t\\t\\tthis._removeClass( this.hoverable, null, \\\"ui-state-hover\\\" );\\n\\t\\t\\tthis._removeClass( this.focusable, null, \\\"ui-state-focus\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tenable: function() {\\n\\t\\treturn this._setOptions( { disabled: false } );\\n\\t},\\n\\n\\tdisable: function() {\\n\\t\\treturn this._setOptions( { disabled: true } );\\n\\t},\\n\\n\\t_classes: function( options ) {\\n\\t\\tvar full = [];\\n\\t\\tvar that = this;\\n\\n\\t\\toptions = $.extend( {\\n\\t\\t\\telement: this.element,\\n\\t\\t\\tclasses: this.options.classes || {}\\n\\t\\t}, options );\\n\\n\\t\\tfunction processClassString( classes, checkOption ) {\\n\\t\\t\\tvar current, i;\\n\\t\\t\\tfor ( i = 0; i < classes.length; i++ ) {\\n\\t\\t\\t\\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\\n\\t\\t\\t\\tif ( options.add ) {\\n\\t\\t\\t\\t\\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcurrent = $( current.not( options.element ).get() );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tthat.classesElementLookup[ classes[ i ] ] = current;\\n\\t\\t\\t\\tfull.push( classes[ i ] );\\n\\t\\t\\t\\tif ( checkOption && options.classes[ classes[ i ] ] ) {\\n\\t\\t\\t\\t\\tfull.push( options.classes[ classes[ i ] ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._on( options.element, {\\n\\t\\t\\t\\\"remove\\\": \\\"_untrackClassesElement\\\"\\n\\t\\t} );\\n\\n\\t\\tif ( options.keys ) {\\n\\t\\t\\tprocessClassString( options.keys.match( /\\\\S+/g ) || [], true );\\n\\t\\t}\\n\\t\\tif ( options.extra ) {\\n\\t\\t\\tprocessClassString( options.extra.match( /\\\\S+/g ) || [] );\\n\\t\\t}\\n\\n\\t\\treturn full.join( \\\" \\\" );\\n\\t},\\n\\n\\t_untrackClassesElement: function( event ) {\\n\\t\\tvar that = this;\\n\\t\\t$.each( that.classesElementLookup, function( key, value ) {\\n\\t\\t\\tif ( $.inArray( event.target, value ) !== -1 ) {\\n\\t\\t\\t\\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_removeClass: function( element, keys, extra ) {\\n\\t\\treturn this._toggleClass( element, keys, extra, false );\\n\\t},\\n\\n\\t_addClass: function( element, keys, extra ) {\\n\\t\\treturn this._toggleClass( element, keys, extra, true );\\n\\t},\\n\\n\\t_toggleClass: function( element, keys, extra, add ) {\\n\\t\\tadd = ( typeof add === \\\"boolean\\\" ) ? add : extra;\\n\\t\\tvar shift = ( typeof element === \\\"string\\\" || element === null ),\\n\\t\\t\\toptions = {\\n\\t\\t\\t\\textra: shift ? keys : extra,\\n\\t\\t\\t\\tkeys: shift ? element : keys,\\n\\t\\t\\t\\telement: shift ? this.element : element,\\n\\t\\t\\t\\tadd: add\\n\\t\\t\\t};\\n\\t\\toptions.element.toggleClass( this._classes( options ), add );\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_on: function( suppressDisabledCheck, element, handlers ) {\\n\\t\\tvar delegateElement;\\n\\t\\tvar instance = this;\\n\\n\\t\\t// No suppressDisabledCheck flag, shuffle arguments\\n\\t\\tif ( typeof suppressDisabledCheck !== \\\"boolean\\\" ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = suppressDisabledCheck;\\n\\t\\t\\tsuppressDisabledCheck = false;\\n\\t\\t}\\n\\n\\t\\t// No element argument, shuffle and use this.element\\n\\t\\tif ( !handlers ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = this.element;\\n\\t\\t\\tdelegateElement = this.widget();\\n\\t\\t} else {\\n\\t\\t\\telement = delegateElement = $( element );\\n\\t\\t\\tthis.bindings = this.bindings.add( element );\\n\\t\\t}\\n\\n\\t\\t$.each( handlers, function( event, handler ) {\\n\\t\\t\\tfunction handlerProxy() {\\n\\n\\t\\t\\t\\t// Allow widgets to customize the disabled handling\\n\\t\\t\\t\\t// - disabled as an array instead of boolean\\n\\t\\t\\t\\t// - disabled class as method for disabling individual parts\\n\\t\\t\\t\\tif ( !suppressDisabledCheck &&\\n\\t\\t\\t\\t\\t\\t( instance.options.disabled === true ||\\n\\t\\t\\t\\t\\t\\t$( this ).hasClass( \\\"ui-state-disabled\\\" ) ) ) {\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Copy the guid so direct unbinding works\\n\\t\\t\\tif ( typeof handler !== \\\"string\\\" ) {\\n\\t\\t\\t\\thandlerProxy.guid = handler.guid =\\n\\t\\t\\t\\t\\thandler.guid || handlerProxy.guid || $.guid++;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvar match = event.match( /^([\\\\w:-]*)\\\\s*(.*)$/ );\\n\\t\\t\\tvar eventName = match[ 1 ] + instance.eventNamespace;\\n\\t\\t\\tvar selector = match[ 2 ];\\n\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\tdelegateElement.on( eventName, selector, handlerProxy );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\telement.on( eventName, handlerProxy );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_off: function( element, eventName ) {\\n\\t\\teventName = ( eventName || \\\"\\\" ).split( \\\" \\\" ).join( this.eventNamespace + \\\" \\\" ) +\\n\\t\\t\\tthis.eventNamespace;\\n\\t\\telement.off( eventName ).off( eventName );\\n\\n\\t\\t// Clear the stack to avoid memory leaks (#10056)\\n\\t\\tthis.bindings = $( this.bindings.not( element ).get() );\\n\\t\\tthis.focusable = $( this.focusable.not( element ).get() );\\n\\t\\tthis.hoverable = $( this.hoverable.not( element ).get() );\\n\\t},\\n\\n\\t_delay: function( handler, delay ) {\\n\\t\\tfunction handlerProxy() {\\n\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t}\\n\\t\\tvar instance = this;\\n\\t\\treturn setTimeout( handlerProxy, delay || 0 );\\n\\t},\\n\\n\\t_hoverable: function( element ) {\\n\\t\\tthis.hoverable = this.hoverable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tmouseenter: function( event ) {\\n\\t\\t\\t\\tthis._addClass( $( event.currentTarget ), null, \\\"ui-state-hover\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tmouseleave: function( event ) {\\n\\t\\t\\t\\tthis._removeClass( $( event.currentTarget ), null, \\\"ui-state-hover\\\" );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_focusable: function( element ) {\\n\\t\\tthis.focusable = this.focusable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tfocusin: function( event ) {\\n\\t\\t\\t\\tthis._addClass( $( event.currentTarget ), null, \\\"ui-state-focus\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tfocusout: function( event ) {\\n\\t\\t\\t\\tthis._removeClass( $( event.currentTarget ), null, \\\"ui-state-focus\\\" );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_trigger: function( type, event, data ) {\\n\\t\\tvar prop, orig;\\n\\t\\tvar callback = this.options[ type ];\\n\\n\\t\\tdata = data || {};\\n\\t\\tevent = $.Event( event );\\n\\t\\tevent.type = ( type === this.widgetEventPrefix ?\\n\\t\\t\\ttype :\\n\\t\\t\\tthis.widgetEventPrefix + type ).toLowerCase();\\n\\n\\t\\t// The original event may come from any element\\n\\t\\t// so we need to reset the target on the new event\\n\\t\\tevent.target = this.element[ 0 ];\\n\\n\\t\\t// Copy original event properties over to the new event\\n\\t\\torig = event.originalEvent;\\n\\t\\tif ( orig ) {\\n\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\tif ( !( prop in event ) ) {\\n\\t\\t\\t\\t\\tevent[ prop ] = orig[ prop ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis.element.trigger( event, data );\\n\\t\\treturn !( $.isFunction( callback ) &&\\n\\t\\t\\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\\n\\t\\t\\tevent.isDefaultPrevented() );\\n\\t}\\n};\\n\\n$.each( { show: \\\"fadeIn\\\", hide: \\\"fadeOut\\\" }, function( method, defaultEffect ) {\\n\\t$.Widget.prototype[ \\\"_\\\" + method ] = function( element, options, callback ) {\\n\\t\\tif ( typeof options === \\\"string\\\" ) {\\n\\t\\t\\toptions = { effect: options };\\n\\t\\t}\\n\\n\\t\\tvar hasOptions;\\n\\t\\tvar effectName = !options ?\\n\\t\\t\\tmethod :\\n\\t\\t\\toptions === true || typeof options === \\\"number\\\" ?\\n\\t\\t\\t\\tdefaultEffect :\\n\\t\\t\\t\\toptions.effect || defaultEffect;\\n\\n\\t\\toptions = options || {};\\n\\t\\tif ( typeof options === \\\"number\\\" ) {\\n\\t\\t\\toptions = { duration: options };\\n\\t\\t}\\n\\n\\t\\thasOptions = !$.isEmptyObject( options );\\n\\t\\toptions.complete = callback;\\n\\n\\t\\tif ( options.delay ) {\\n\\t\\t\\telement.delay( options.delay );\\n\\t\\t}\\n\\n\\t\\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\\n\\t\\t\\telement[ method ]( options );\\n\\t\\t} else if ( effectName !== method && element[ effectName ] ) {\\n\\t\\t\\telement[ effectName ]( options.duration, options.easing, callback );\\n\\t\\t} else {\\n\\t\\t\\telement.queue( function( next ) {\\n\\t\\t\\t\\t$( this )[ method ]();\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback.call( element[ 0 ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnext();\\n\\t\\t\\t} );\\n\\t\\t}\\n\\t};\\n} );\\n\\nreturn $.widget;\\n\\n} ) );\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS93aWRnZXQuanM/NDliZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMi4xXG4gKiBodHRwOi8vanF1ZXJ5dWkuY29tXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqL1xuXG4vLz4+bGFiZWw6IFdpZGdldFxuLy8+Pmdyb3VwOiBDb3JlXG4vLz4+ZGVzY3JpcHRpb246IFByb3ZpZGVzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgc3RhdGVmdWwgd2lkZ2V0cyB3aXRoIGEgY29tbW9uIEFQSS5cbi8vPj5kb2NzOiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9qUXVlcnkud2lkZ2V0L1xuLy8+PmRlbW9zOiBodHRwOi8vanF1ZXJ5dWkuY29tL3dpZGdldC9cblxuKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiwgXCIuL3ZlcnNpb25cIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSggZnVuY3Rpb24oICQgKSB7XG5cbnZhciB3aWRnZXRVdWlkID0gMDtcbnZhciB3aWRnZXRTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuJC5jbGVhbkRhdGEgPSAoIGZ1bmN0aW9uKCBvcmlnICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBldmVudHMsIGVsZW0sIGk7XG5cdFx0Zm9yICggaSA9IDA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdC8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lXG5cdFx0XHRcdGV2ZW50cyA9ICQuX2RhdGEoIGVsZW0sIFwiZXZlbnRzXCIgKTtcblx0XHRcdFx0aWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHtcblx0XHRcdFx0XHQkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoIFwicmVtb3ZlXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIdHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0fVxuXHRcdG9yaWcoIGVsZW1zICk7XG5cdH07XG59ICkoICQuY2xlYW5EYXRhICk7XG5cbiQud2lkZ2V0ID0gZnVuY3Rpb24oIG5hbWUsIGJhc2UsIHByb3RvdHlwZSApIHtcblx0dmFyIGV4aXN0aW5nQ29uc3RydWN0b3IsIGNvbnN0cnVjdG9yLCBiYXNlUHJvdG90eXBlO1xuXG5cdC8vIFByb3hpZWRQcm90b3R5cGUgYWxsb3dzIHRoZSBwcm92aWRlZCBwcm90b3R5cGUgdG8gcmVtYWluIHVubW9kaWZpZWRcblx0Ly8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3Nilcblx0dmFyIHByb3hpZWRQcm90b3R5cGUgPSB7fTtcblxuXHR2YXIgbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMCBdO1xuXHRuYW1lID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMSBdO1xuXHR2YXIgZnVsbE5hbWUgPSBuYW1lc3BhY2UgKyBcIi1cIiArIG5hbWU7XG5cblx0aWYgKCAhcHJvdG90eXBlICkge1xuXHRcdHByb3RvdHlwZSA9IGJhc2U7XG5cdFx0YmFzZSA9ICQuV2lkZ2V0O1xuXHR9XG5cblx0aWYgKCAkLmlzQXJyYXkoIHByb3RvdHlwZSApICkge1xuXHRcdHByb3RvdHlwZSA9ICQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIHt9IF0uY29uY2F0KCBwcm90b3R5cGUgKSApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW5cblx0JC5leHByWyBcIjpcIiBdWyBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpIF0gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gISEkLmRhdGEoIGVsZW0sIGZ1bGxOYW1lICk7XG5cdH07XG5cblx0JFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTtcblx0ZXhpc3RpbmdDb25zdHJ1Y3RvciA9ICRbIG5hbWVzcGFjZSBdWyBuYW1lIF07XG5cdGNvbnN0cnVjdG9yID0gJFsgbmFtZXNwYWNlIF1bIG5hbWUgXSA9IGZ1bmN0aW9uKCBvcHRpb25zLCBlbGVtZW50ICkge1xuXG5cdFx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IFwibmV3XCIga2V5d29yZFxuXHRcdGlmICggIXRoaXMuX2NyZWF0ZVdpZGdldCApIHtcblx0XHRcdHJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGZvciBzaW1wbGUgaW5oZXJpdGFuY2Vcblx0XHQvLyBtdXN0IHVzZSBcIm5ld1wiIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncylcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLl9jcmVhdGVXaWRnZXQoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cdH07XG5cblx0Ly8gRXh0ZW5kIHdpdGggdGhlIGV4aXN0aW5nIGNvbnN0cnVjdG9yIHRvIGNhcnJ5IG92ZXIgYW55IHN0YXRpYyBwcm9wZXJ0aWVzXG5cdCQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3Rvciwge1xuXHRcdHZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLFxuXG5cdFx0Ly8gQ29weSB0aGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBwcm90b3R5cGUgaW4gY2FzZSB3ZSBuZWVkIHRvXG5cdFx0Ly8gcmVkZWZpbmUgdGhlIHdpZGdldCBsYXRlclxuXHRcdF9wcm90bzogJC5leHRlbmQoIHt9LCBwcm90b3R5cGUgKSxcblxuXHRcdC8vIFRyYWNrIHdpZGdldHMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyB3aWRnZXQgaW4gY2FzZSB0aGlzIHdpZGdldCBpc1xuXHRcdC8vIHJlZGVmaW5lZCBhZnRlciBhIHdpZGdldCBpbmhlcml0cyBmcm9tIGl0XG5cdFx0X2NoaWxkQ29uc3RydWN0b3JzOiBbXVxuXHR9ICk7XG5cblx0YmFzZVByb3RvdHlwZSA9IG5ldyBiYXNlKCk7XG5cblx0Ly8gV2UgbmVlZCB0byBtYWtlIHRoZSBvcHRpb25zIGhhc2ggYSBwcm9wZXJ0eSBkaXJlY3RseSBvbiB0aGUgbmV3IGluc3RhbmNlXG5cdC8vIG90aGVyd2lzZSB3ZSdsbCBtb2RpZnkgdGhlIG9wdGlvbnMgaGFzaCBvbiB0aGUgcHJvdG90eXBlIHRoYXQgd2UncmVcblx0Ly8gaW5oZXJpdGluZyBmcm9tXG5cdGJhc2VQcm90b3R5cGUub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sIGJhc2VQcm90b3R5cGUub3B0aW9ucyApO1xuXHQkLmVhY2goIHByb3RvdHlwZSwgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdGlmICggISQuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHByb3hpZWRQcm90b3R5cGVbIHByb3AgXSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZnVuY3Rpb24gX3N1cGVyKCkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIF9zdXBlckFwcGx5KCBhcmdzICkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBfX3N1cGVyID0gdGhpcy5fc3VwZXI7XG5cdFx0XHRcdHZhciBfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5O1xuXHRcdFx0XHR2YXIgcmV0dXJuVmFsdWU7XG5cblx0XHRcdFx0dGhpcy5fc3VwZXIgPSBfc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfc3VwZXJBcHBseTtcblxuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHZhbHVlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHR0aGlzLl9zdXBlciA9IF9fc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7XG5cblx0XHRcdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHRcdFx0fTtcblx0XHR9ICkoKTtcblx0fSApO1xuXHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSAkLndpZGdldC5leHRlbmQoIGJhc2VQcm90b3R5cGUsIHtcblxuXHRcdC8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeFxuXHRcdC8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydFxuXHRcdC8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWRcblx0XHR3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/ICggYmFzZVByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeCB8fCBuYW1lICkgOiBuYW1lXG5cdH0sIHByb3hpZWRQcm90b3R5cGUsIHtcblx0XHRjb25zdHJ1Y3RvcjogY29uc3RydWN0b3IsXG5cdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2UsXG5cdFx0d2lkZ2V0TmFtZTogbmFtZSxcblx0XHR3aWRnZXRGdWxsTmFtZTogZnVsbE5hbWVcblx0fSApO1xuXG5cdC8vIElmIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lkZ2V0cyB0aGF0XG5cdC8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb21cblx0Ly8gdGhlIG5ldyB2ZXJzaW9uIG9mIHRoaXMgd2lkZ2V0LiBXZSdyZSBlc3NlbnRpYWxseSB0cnlpbmcgdG8gcmVwbGFjZSBvbmVcblx0Ly8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi5cblx0aWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkge1xuXHRcdCQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHtcblx0XHRcdHZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3RvdHlwZTtcblxuXHRcdFx0Ly8gUmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXNcblx0XHRcdC8vIG9yaWdpbmFsbHkgdXNlZCwgYnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2Vcblx0XHRcdCQud2lkZ2V0KCBjaGlsZFByb3RvdHlwZS5uYW1lc3BhY2UgKyBcIi5cIiArIGNoaWxkUHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLFxuXHRcdFx0XHRjaGlsZC5fcHJvdG8gKTtcblx0XHR9ICk7XG5cblx0XHQvLyBSZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQgY29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvclxuXHRcdC8vIHNvIHRoZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZFxuXHRcdGRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9ycztcblx0fSBlbHNlIHtcblx0XHRiYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApO1xuXHR9XG5cblx0JC53aWRnZXQuYnJpZGdlKCBuYW1lLCBjb25zdHJ1Y3RvciApO1xuXG5cdHJldHVybiBjb25zdHJ1Y3Rvcjtcbn07XG5cbiQud2lkZ2V0LmV4dGVuZCA9IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdHZhciBpbnB1dCA9IHdpZGdldFNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApO1xuXHR2YXIgaW5wdXRJbmRleCA9IDA7XG5cdHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0dmFyIGtleTtcblx0dmFyIHZhbHVlO1xuXG5cdGZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7XG5cdFx0Zm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7XG5cdFx0XHR2YWx1ZSA9IGlucHV0WyBpbnB1dEluZGV4IF1bIGtleSBdO1xuXHRcdFx0aWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIENsb25lIG9iamVjdHNcblx0XHRcdFx0aWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID9cblx0XHRcdFx0XHRcdCQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0c1xuXHRcdFx0XHRcdFx0JC53aWRnZXQuZXh0ZW5kKCB7fSwgdmFsdWUgKTtcblxuXHRcdFx0XHQvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0YXJnZXRbIGtleSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7XG5cdHZhciBmdWxsTmFtZSA9IG9iamVjdC5wcm90b3R5cGUud2lkZ2V0RnVsbE5hbWUgfHwgbmFtZTtcblx0JC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiO1xuXHRcdHZhciBhcmdzID0gd2lkZ2V0U2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICk7XG5cdFx0dmFyIHJldHVyblZhbHVlID0gdGhpcztcblxuXHRcdGlmICggaXNNZXRob2RDYWxsICkge1xuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGFuIGVtcHR5IGNvbGxlY3Rpb24sIHdlIG5lZWQgdG8gaGF2ZSB0aGUgaW5zdGFuY2UgbWV0aG9kXG5cdFx0XHQvLyByZXR1cm4gdW5kZWZpbmVkIGluc3RlYWQgb2YgdGhlIGpRdWVyeSBpbnN0YW5jZVxuXHRcdFx0aWYgKCAhdGhpcy5sZW5ndGggJiYgb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdHZhciBpbnN0YW5jZSA9ICQuZGF0YSggdGhpcywgZnVsbE5hbWUgKTtcblxuXHRcdFx0XHRcdGlmICggb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBpbnN0YW5jZTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICFpbnN0YW5jZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiAkLmVycm9yKCBcImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gXCIgKyBuYW1lICtcblx0XHRcdFx0XHRcdFx0XCIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IFwiICtcblx0XHRcdFx0XHRcdFx0XCJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJ1wiICsgb3B0aW9ucyArIFwiJ1wiICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhJC5pc0Z1bmN0aW9uKCBpbnN0YW5jZVsgb3B0aW9ucyBdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gXCJfXCIgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5lcnJvciggXCJubyBzdWNoIG1ldGhvZCAnXCIgKyBvcHRpb25zICsgXCInIGZvciBcIiArIG5hbWUgK1xuXHRcdFx0XHRcdFx0XHRcIiB3aWRnZXQgaW5zdGFuY2VcIiApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1ldGhvZFZhbHVlID0gaW5zdGFuY2VbIG9wdGlvbnMgXS5hcHBseSggaW5zdGFuY2UsIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggbWV0aG9kVmFsdWUgIT09IGluc3RhbmNlICYmIG1ldGhvZFZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IG1ldGhvZFZhbHVlICYmIG1ldGhvZFZhbHVlLmpxdWVyeSA/XG5cdFx0XHRcdFx0XHRcdHJldHVyblZhbHVlLnB1c2hTdGFjayggbWV0aG9kVmFsdWUuZ2V0KCkgKSA6XG5cdFx0XHRcdFx0XHRcdG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEFsbG93IG11bHRpcGxlIGhhc2hlcyB0byBiZSBwYXNzZWQgb24gaW5pdFxuXHRcdFx0aWYgKCBhcmdzLmxlbmd0aCApIHtcblx0XHRcdFx0b3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZC5hcHBseSggbnVsbCwgWyBvcHRpb25zIF0uY29uY2F0KCBhcmdzICkgKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApO1xuXHRcdFx0XHRpZiAoIGluc3RhbmNlICkge1xuXHRcdFx0XHRcdGluc3RhbmNlLm9wdGlvbiggb3B0aW9ucyB8fCB7fSApO1xuXHRcdFx0XHRcdGlmICggaW5zdGFuY2UuX2luaXQgKSB7XG5cdFx0XHRcdFx0XHRpbnN0YW5jZS5faW5pdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lLCBuZXcgb2JqZWN0KCBvcHRpb25zLCB0aGlzICkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0fTtcbn07XG5cbiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTtcbiQuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycyA9IFtdO1xuXG4kLldpZGdldC5wcm90b3R5cGUgPSB7XG5cdHdpZGdldE5hbWU6IFwid2lkZ2V0XCIsXG5cdHdpZGdldEV2ZW50UHJlZml4OiBcIlwiLFxuXHRkZWZhdWx0RWxlbWVudDogXCI8ZGl2PlwiLFxuXG5cdG9wdGlvbnM6IHtcblx0XHRjbGFzc2VzOiB7fSxcblx0XHRkaXNhYmxlZDogZmFsc2UsXG5cblx0XHQvLyBDYWxsYmFja3Ncblx0XHRjcmVhdGU6IG51bGxcblx0fSxcblxuXHRfY3JlYXRlV2lkZ2V0OiBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHtcblx0XHRlbGVtZW50ID0gJCggZWxlbWVudCB8fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdO1xuXHRcdHRoaXMuZWxlbWVudCA9ICQoIGVsZW1lbnQgKTtcblx0XHR0aGlzLnV1aWQgPSB3aWRnZXRVdWlkKys7XG5cdFx0dGhpcy5ldmVudE5hbWVzcGFjZSA9IFwiLlwiICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkO1xuXG5cdFx0dGhpcy5iaW5kaW5ncyA9ICQoKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoKTtcblx0XHR0aGlzLmZvY3VzYWJsZSA9ICQoKTtcblx0XHR0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwID0ge307XG5cblx0XHRpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7XG5cdFx0XHQkLmRhdGEoIGVsZW1lbnQsIHRoaXMud2lkZ2V0RnVsbE5hbWUsIHRoaXMgKTtcblx0XHRcdHRoaXMuX29uKCB0cnVlLCB0aGlzLmVsZW1lbnQsIHtcblx0XHRcdFx0cmVtb3ZlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdFx0aWYgKCBldmVudC50YXJnZXQgPT09IGVsZW1lbnQgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHRcdHRoaXMuZG9jdW1lbnQgPSAkKCBlbGVtZW50LnN0eWxlID9cblxuXHRcdFx0XHQvLyBFbGVtZW50IHdpdGhpbiB0aGUgZG9jdW1lbnRcblx0XHRcdFx0ZWxlbWVudC5vd25lckRvY3VtZW50IDpcblxuXHRcdFx0XHQvLyBFbGVtZW50IGlzIHdpbmRvdyBvciBkb2N1bWVudFxuXHRcdFx0XHRlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQgKTtcblx0XHRcdHRoaXMud2luZG93ID0gJCggdGhpcy5kb2N1bWVudFsgMCBdLmRlZmF1bHRWaWV3IHx8IHRoaXMuZG9jdW1lbnRbIDAgXS5wYXJlbnRXaW5kb3cgKTtcblx0XHR9XG5cblx0XHR0aGlzLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LFxuXHRcdFx0dGhpcy5vcHRpb25zLFxuXHRcdFx0dGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLFxuXHRcdFx0b3B0aW9ucyApO1xuXG5cdFx0dGhpcy5fY3JlYXRlKCk7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHtcblx0XHRcdHRoaXMuX3NldE9wdGlvbkRpc2FibGVkKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKTtcblx0XHR9XG5cblx0XHR0aGlzLl90cmlnZ2VyKCBcImNyZWF0ZVwiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApO1xuXHRcdHRoaXMuX2luaXQoKTtcblx0fSxcblxuXHRfZ2V0Q3JlYXRlT3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9LFxuXG5cdF9nZXRDcmVhdGVFdmVudERhdGE6ICQubm9vcCxcblxuXHRfY3JlYXRlOiAkLm5vb3AsXG5cblx0X2luaXQ6ICQubm9vcCxcblxuXHRkZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cblx0XHR0aGlzLl9kZXN0cm95KCk7XG5cdFx0JC5lYWNoKCB0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdHRoYXQuX3JlbW92ZUNsYXNzKCB2YWx1ZSwga2V5ICk7XG5cdFx0fSApO1xuXG5cdFx0Ly8gV2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMFxuXHRcdC8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpXG5cdFx0dGhpcy5lbGVtZW50XG5cdFx0XHQub2ZmKCB0aGlzLmV2ZW50TmFtZXNwYWNlIClcblx0XHRcdC5yZW1vdmVEYXRhKCB0aGlzLndpZGdldEZ1bGxOYW1lICk7XG5cdFx0dGhpcy53aWRnZXQoKVxuXHRcdFx0Lm9mZiggdGhpcy5ldmVudE5hbWVzcGFjZSApXG5cdFx0XHQucmVtb3ZlQXR0ciggXCJhcmlhLWRpc2FibGVkXCIgKTtcblxuXHRcdC8vIENsZWFuIHVwIGV2ZW50cyBhbmQgc3RhdGVzXG5cdFx0dGhpcy5iaW5kaW5ncy5vZmYoIHRoaXMuZXZlbnROYW1lc3BhY2UgKTtcblx0fSxcblxuXHRfZGVzdHJveTogJC5ub29wLFxuXG5cdHdpZGdldDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudDtcblx0fSxcblxuXHRvcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBvcHRpb25zID0ga2V5O1xuXHRcdHZhciBwYXJ0cztcblx0XHR2YXIgY3VyT3B0aW9uO1xuXHRcdHZhciBpO1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHQvLyBEb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2hcblx0XHRcdHJldHVybiAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vIEhhbmRsZSBuZXN0ZWQga2V5cywgZS5nLiwgXCJmb28uYmFyXCIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9XG5cdFx0XHRvcHRpb25zID0ge307XG5cdFx0XHRwYXJ0cyA9IGtleS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdGtleSA9IHBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRpZiAoIHBhcnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y3VyT3B0aW9uID0gb3B0aW9uc1sga2V5IF0gPSAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnNbIGtleSBdICk7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrICkge1xuXHRcdFx0XHRcdGN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307XG5cdFx0XHRcdFx0Y3VyT3B0aW9uID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07XG5cdFx0XHRcdH1cblx0XHRcdFx0a2V5ID0gcGFydHMucG9wKCk7XG5cdFx0XHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdFx0XHRyZXR1cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9wdGlvblsga2V5IF07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3VyT3B0aW9uWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnNbIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5vcHRpb25zWyBrZXkgXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvcHRpb25zWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuX3NldE9wdGlvbnMoIG9wdGlvbnMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdF9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIga2V5O1xuXG5cdFx0Zm9yICgga2V5IGluIG9wdGlvbnMgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb24oIGtleSwgb3B0aW9uc1sga2V5IF0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRpZiAoIGtleSA9PT0gXCJjbGFzc2VzXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25DbGFzc2VzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdHRoaXMub3B0aW9uc1sga2V5IF0gPSB2YWx1ZTtcblxuXHRcdGlmICgga2V5ID09PSBcImRpc2FibGVkXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25EaXNhYmxlZCggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uQ2xhc3NlczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc0tleSwgZWxlbWVudHMsIGN1cnJlbnRFbGVtZW50cztcblxuXHRcdGZvciAoIGNsYXNzS2V5IGluIHZhbHVlICkge1xuXHRcdFx0Y3VycmVudEVsZW1lbnRzID0gdGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cFsgY2xhc3NLZXkgXTtcblx0XHRcdGlmICggdmFsdWVbIGNsYXNzS2V5IF0gPT09IHRoaXMub3B0aW9ucy5jbGFzc2VzWyBjbGFzc0tleSBdIHx8XG5cdFx0XHRcdFx0IWN1cnJlbnRFbGVtZW50cyB8fFxuXHRcdFx0XHRcdCFjdXJyZW50RWxlbWVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UgYXJlIGRvaW5nIHRoaXMgdG8gY3JlYXRlIGEgbmV3IGpRdWVyeSBvYmplY3QgYmVjYXVzZSB0aGUgX3JlbW92ZUNsYXNzKCkgY2FsbFxuXHRcdFx0Ly8gb24gdGhlIG5leHQgbGluZSBpcyBnb2luZyB0byBkZXN0cm95IHRoZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZWxlbWVudHMgYmVpbmdcblx0XHRcdC8vIHRyYWNrZWQuIFdlIG5lZWQgdG8gc2F2ZSBhIGNvcHkgb2YgdGhpcyBjb2xsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGFkZCB0aGUgbmV3IGNsYXNzZXNcblx0XHRcdC8vIGJlbG93LlxuXHRcdFx0ZWxlbWVudHMgPSAkKCBjdXJyZW50RWxlbWVudHMuZ2V0KCkgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCBjdXJyZW50RWxlbWVudHMsIGNsYXNzS2V5ICk7XG5cblx0XHRcdC8vIFdlIGRvbid0IHVzZSBfYWRkQ2xhc3MoKSBoZXJlLCBiZWNhdXNlIHRoYXQgdXNlcyB0aGlzLm9wdGlvbnMuY2xhc3Nlc1xuXHRcdFx0Ly8gZm9yIGdlbmVyYXRpbmcgdGhlIHN0cmluZyBvZiBjbGFzc2VzLiBXZSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgcGFzc2VkIGluIGZyb21cblx0XHRcdC8vIF9zZXRPcHRpb24oKSwgdGhpcyBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjbGFzc2VzIG9wdGlvbiB3aGljaCB3YXMgcGFzc2VkIHRvXG5cdFx0XHQvLyBfc2V0T3B0aW9uKCkuIFdlIHBhc3MgdGhpcyB2YWx1ZSBkaXJlY3RseSB0byBfY2xhc3NlcygpLlxuXHRcdFx0ZWxlbWVudHMuYWRkQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIHtcblx0XHRcdFx0ZWxlbWVudDogZWxlbWVudHMsXG5cdFx0XHRcdGtleXM6IGNsYXNzS2V5LFxuXHRcdFx0XHRjbGFzc2VzOiB2YWx1ZSxcblx0XHRcdFx0YWRkOiB0cnVlXG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cdH0sXG5cblx0X3NldE9wdGlvbkRpc2FibGVkOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dGhpcy5fdG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0KCksIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyBcIi1kaXNhYmxlZFwiLCBudWxsLCAhIXZhbHVlICk7XG5cblx0XHQvLyBJZiB0aGUgd2lkZ2V0IGlzIGJlY29taW5nIGRpc2FibGVkLCB0aGVuIG5vdGhpbmcgaXMgaW50ZXJhY3RpdmVcblx0XHRpZiAoIHZhbHVlICkge1xuXHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoIHRoaXMuaG92ZXJhYmxlLCBudWxsLCBcInVpLXN0YXRlLWhvdmVyXCIgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCB0aGlzLmZvY3VzYWJsZSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoIHsgZGlzYWJsZWQ6IGZhbHNlIH0gKTtcblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyggeyBkaXNhYmxlZDogdHJ1ZSB9ICk7XG5cdH0sXG5cblx0X2NsYXNzZXM6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBmdWxsID0gW107XG5cdFx0dmFyIHRoYXQgPSB0aGlzO1xuXG5cdFx0b3B0aW9ucyA9ICQuZXh0ZW5kKCB7XG5cdFx0XHRlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG5cdFx0XHRjbGFzc2VzOiB0aGlzLm9wdGlvbnMuY2xhc3NlcyB8fCB7fVxuXHRcdH0sIG9wdGlvbnMgKTtcblxuXHRcdGZ1bmN0aW9uIHByb2Nlc3NDbGFzc1N0cmluZyggY2xhc3NlcywgY2hlY2tPcHRpb24gKSB7XG5cdFx0XHR2YXIgY3VycmVudCwgaTtcblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0Y3VycmVudCA9IHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdIHx8ICQoKTtcblx0XHRcdFx0aWYgKCBvcHRpb25zLmFkZCApIHtcblx0XHRcdFx0XHRjdXJyZW50ID0gJCggJC51bmlxdWUoIGN1cnJlbnQuZ2V0KCkuY29uY2F0KCBvcHRpb25zLmVsZW1lbnQuZ2V0KCkgKSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudCA9ICQoIGN1cnJlbnQubm90KCBvcHRpb25zLmVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdID0gY3VycmVudDtcblx0XHRcdFx0ZnVsbC5wdXNoKCBjbGFzc2VzWyBpIF0gKTtcblx0XHRcdFx0aWYgKCBjaGVja09wdGlvbiAmJiBvcHRpb25zLmNsYXNzZXNbIGNsYXNzZXNbIGkgXSBdICkge1xuXHRcdFx0XHRcdGZ1bGwucHVzaCggb3B0aW9ucy5jbGFzc2VzWyBjbGFzc2VzWyBpIF0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fb24oIG9wdGlvbnMuZWxlbWVudCwge1xuXHRcdFx0XCJyZW1vdmVcIjogXCJfdW50cmFja0NsYXNzZXNFbGVtZW50XCJcblx0XHR9ICk7XG5cblx0XHRpZiAoIG9wdGlvbnMua2V5cyApIHtcblx0XHRcdHByb2Nlc3NDbGFzc1N0cmluZyggb3B0aW9ucy5rZXlzLm1hdGNoKCAvXFxTKy9nICkgfHwgW10sIHRydWUgKTtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmV4dHJhICkge1xuXHRcdFx0cHJvY2Vzc0NsYXNzU3RyaW5nKCBvcHRpb25zLmV4dHJhLm1hdGNoKCAvXFxTKy9nICkgfHwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZnVsbC5qb2luKCBcIiBcIiApO1xuXHR9LFxuXG5cdF91bnRyYWNrQ2xhc3Nlc0VsZW1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cdFx0JC5lYWNoKCB0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdGlmICggJC5pbkFycmF5KCBldmVudC50YXJnZXQsIHZhbHVlICkgIT09IC0xICkge1xuXHRcdFx0XHR0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwWyBrZXkgXSA9ICQoIHZhbHVlLm5vdCggZXZlbnQudGFyZ2V0ICkuZ2V0KCkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X3JlbW92ZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3RvZ2dsZUNsYXNzKCBlbGVtZW50LCBrZXlzLCBleHRyYSwgZmFsc2UgKTtcblx0fSxcblxuXHRfYWRkQ2xhc3M6IGZ1bmN0aW9uKCBlbGVtZW50LCBrZXlzLCBleHRyYSApIHtcblx0XHRyZXR1cm4gdGhpcy5fdG9nZ2xlQ2xhc3MoIGVsZW1lbnQsIGtleXMsIGV4dHJhLCB0cnVlICk7XG5cdH0sXG5cblx0X3RvZ2dsZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEsIGFkZCApIHtcblx0XHRhZGQgPSAoIHR5cGVvZiBhZGQgPT09IFwiYm9vbGVhblwiICkgPyBhZGQgOiBleHRyYTtcblx0XHR2YXIgc2hpZnQgPSAoIHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiIHx8IGVsZW1lbnQgPT09IG51bGwgKSxcblx0XHRcdG9wdGlvbnMgPSB7XG5cdFx0XHRcdGV4dHJhOiBzaGlmdCA/IGtleXMgOiBleHRyYSxcblx0XHRcdFx0a2V5czogc2hpZnQgPyBlbGVtZW50IDoga2V5cyxcblx0XHRcdFx0ZWxlbWVudDogc2hpZnQgPyB0aGlzLmVsZW1lbnQgOiBlbGVtZW50LFxuXHRcdFx0XHRhZGQ6IGFkZFxuXHRcdFx0fTtcblx0XHRvcHRpb25zLmVsZW1lbnQudG9nZ2xlQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIG9wdGlvbnMgKSwgYWRkICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0X29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgZGVsZWdhdGVFbGVtZW50O1xuXHRcdHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cblx0XHQvLyBObyBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgZmxhZywgc2h1ZmZsZSBhcmd1bWVudHNcblx0XHRpZiAoIHR5cGVvZiBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgIT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0aGFuZGxlcnMgPSBlbGVtZW50O1xuXHRcdFx0ZWxlbWVudCA9IHN1cHByZXNzRGlzYWJsZWRDaGVjaztcblx0XHRcdHN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIE5vIGVsZW1lbnQgYXJndW1lbnQsIHNodWZmbGUgYW5kIHVzZSB0aGlzLmVsZW1lbnRcblx0XHRpZiAoICFoYW5kbGVycyApIHtcblx0XHRcdGhhbmRsZXJzID0gZWxlbWVudDtcblx0XHRcdGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XG5cdFx0XHRkZWxlZ2F0ZUVsZW1lbnQgPSB0aGlzLndpZGdldCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50ID0gZGVsZWdhdGVFbGVtZW50ID0gJCggZWxlbWVudCApO1xuXHRcdFx0dGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7XG5cdFx0fVxuXG5cdFx0JC5lYWNoKCBoYW5kbGVycywgZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVyICkge1xuXHRcdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXG5cdFx0XHRcdC8vIEFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZ1xuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGFzIGFuIGFycmF5IGluc3RlYWQgb2YgYm9vbGVhblxuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGNsYXNzIGFzIG1ldGhvZCBmb3IgZGlzYWJsaW5nIGluZGl2aWR1YWwgcGFydHNcblx0XHRcdFx0aWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmXG5cdFx0XHRcdFx0XHQoIGluc3RhbmNlLm9wdGlvbnMuZGlzYWJsZWQgPT09IHRydWUgfHxcblx0XHRcdFx0XHRcdCQoIHRoaXMgKS5oYXNDbGFzcyggXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiICkgKSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdFx0LmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3Jrc1xuXHRcdFx0aWYgKCB0eXBlb2YgaGFuZGxlciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0aGFuZGxlclByb3h5Lmd1aWQgPSBoYW5kbGVyLmd1aWQgPVxuXHRcdFx0XHRcdGhhbmRsZXIuZ3VpZCB8fCBoYW5kbGVyUHJveHkuZ3VpZCB8fCAkLmd1aWQrKztcblx0XHRcdH1cblxuXHRcdFx0dmFyIG1hdGNoID0gZXZlbnQubWF0Y2goIC9eKFtcXHc6LV0qKVxccyooLiopJC8gKTtcblx0XHRcdHZhciBldmVudE5hbWUgPSBtYXRjaFsgMSBdICsgaW5zdGFuY2UuZXZlbnROYW1lc3BhY2U7XG5cdFx0XHR2YXIgc2VsZWN0b3IgPSBtYXRjaFsgMiBdO1xuXG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRkZWxlZ2F0ZUVsZW1lbnQub24oIGV2ZW50TmFtZSwgc2VsZWN0b3IsIGhhbmRsZXJQcm94eSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudC5vbiggZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X29mZjogZnVuY3Rpb24oIGVsZW1lbnQsIGV2ZW50TmFtZSApIHtcblx0XHRldmVudE5hbWUgPSAoIGV2ZW50TmFtZSB8fCBcIlwiICkuc3BsaXQoIFwiIFwiICkuam9pbiggdGhpcy5ldmVudE5hbWVzcGFjZSArIFwiIFwiICkgK1xuXHRcdFx0dGhpcy5ldmVudE5hbWVzcGFjZTtcblx0XHRlbGVtZW50Lm9mZiggZXZlbnROYW1lICkub2ZmKCBldmVudE5hbWUgKTtcblxuXHRcdC8vIENsZWFyIHRoZSBzdGFjayB0byBhdm9pZCBtZW1vcnkgbGVha3MgKCMxMDA1Nilcblx0XHR0aGlzLmJpbmRpbmdzID0gJCggdGhpcy5iaW5kaW5ncy5ub3QoIGVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gJCggdGhpcy5mb2N1c2FibGUubm90KCBlbGVtZW50ICkuZ2V0KCkgKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoIHRoaXMuaG92ZXJhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7XG5cdH0sXG5cblx0X2RlbGF5OiBmdW5jdGlvbiggaGFuZGxlciwgZGVsYXkgKSB7XG5cdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdC5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0XHR2YXIgaW5zdGFuY2UgPSB0aGlzO1xuXHRcdHJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTtcblx0fSxcblxuXHRfaG92ZXJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHtcblx0XHR0aGlzLmhvdmVyYWJsZSA9IHRoaXMuaG92ZXJhYmxlLmFkZCggZWxlbWVudCApO1xuXHRcdHRoaXMuX29uKCBlbGVtZW50LCB7XG5cdFx0XHRtb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHRoaXMuX2FkZENsYXNzKCAkKCBldmVudC5jdXJyZW50VGFyZ2V0ICksIG51bGwsIFwidWktc3RhdGUtaG92ZXJcIiApO1xuXHRcdFx0fSxcblx0XHRcdG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1ob3ZlclwiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF9mb2N1c2FibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGUuYWRkKCBlbGVtZW50ICk7XG5cdFx0dGhpcy5fb24oIGVsZW1lbnQsIHtcblx0XHRcdGZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9LFxuXHRcdFx0Zm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7XG5cdFx0dmFyIHByb3AsIG9yaWc7XG5cdFx0dmFyIGNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07XG5cblx0XHRkYXRhID0gZGF0YSB8fCB7fTtcblx0XHRldmVudCA9ICQuRXZlbnQoIGV2ZW50ICk7XG5cdFx0ZXZlbnQudHlwZSA9ICggdHlwZSA9PT0gdGhpcy53aWRnZXRFdmVudFByZWZpeCA/XG5cdFx0XHR0eXBlIDpcblx0XHRcdHRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTtcblxuXHRcdC8vIFRoZSBvcmlnaW5hbCBldmVudCBtYXkgY29tZSBmcm9tIGFueSBlbGVtZW50XG5cdFx0Ly8gc28gd2UgbmVlZCB0byByZXNldCB0aGUgdGFyZ2V0IG9uIHRoZSBuZXcgZXZlbnRcblx0XHRldmVudC50YXJnZXQgPSB0aGlzLmVsZW1lbnRbIDAgXTtcblxuXHRcdC8vIENvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnRcblx0XHRvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDtcblx0XHRpZiAoIG9yaWcgKSB7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGlmICggISggcHJvcCBpbiBldmVudCApICkge1xuXHRcdFx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmVsZW1lbnQudHJpZ2dlciggZXZlbnQsIGRhdGEgKTtcblx0XHRyZXR1cm4gISggJC5pc0Z1bmN0aW9uKCBjYWxsYmFjayApICYmXG5cdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcy5lbGVtZW50WyAwIF0sIFsgZXZlbnQgXS5jb25jYXQoIGRhdGEgKSApID09PSBmYWxzZSB8fFxuXHRcdFx0ZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKTtcblx0fVxufTtcblxuJC5lYWNoKCB7IHNob3c6IFwiZmFkZUluXCIsIGhpZGU6IFwiZmFkZU91dFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIGRlZmF1bHRFZmZlY3QgKSB7XG5cdCQuV2lkZ2V0LnByb3RvdHlwZVsgXCJfXCIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0dmFyIGhhc09wdGlvbnM7XG5cdFx0dmFyIGVmZmVjdE5hbWUgPSAhb3B0aW9ucyA/XG5cdFx0XHRtZXRob2QgOlxuXHRcdFx0b3B0aW9ucyA9PT0gdHJ1ZSB8fCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiA/XG5cdFx0XHRcdGRlZmF1bHRFZmZlY3QgOlxuXHRcdFx0XHRvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0O1xuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0aWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB7IGR1cmF0aW9uOiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0aGFzT3B0aW9ucyA9ICEkLmlzRW1wdHlPYmplY3QoIG9wdGlvbnMgKTtcblx0XHRvcHRpb25zLmNvbXBsZXRlID0gY2FsbGJhY2s7XG5cblx0XHRpZiAoIG9wdGlvbnMuZGVsYXkgKSB7XG5cdFx0XHRlbGVtZW50LmRlbGF5KCBvcHRpb25zLmRlbGF5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBtZXRob2QgXSggb3B0aW9ucyApO1xuXHRcdH0gZWxzZSBpZiAoIGVmZmVjdE5hbWUgIT09IG1ldGhvZCAmJiBlbGVtZW50WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBlZmZlY3ROYW1lIF0oIG9wdGlvbnMuZHVyYXRpb24sIG9wdGlvbnMuZWFzaW5nLCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50LnF1ZXVlKCBmdW5jdGlvbiggbmV4dCApIHtcblx0XHRcdFx0JCggdGhpcyApWyBtZXRob2QgXSgpO1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGVsZW1lbnRbIDAgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbnJldHVybiAkLndpZGdldDtcblxufSApICk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vanF1ZXJ5LXVpL3VpL3dpZGdldC5qc1xuLy8gbW9kdWxlIGlkID0gMjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 28 */\n/***/ function(module, exports) {\n\neval(\"module.exports = function(module) {\\r\\n\\tif(!module.webpackPolyfill) {\\r\\n\\t\\tmodule.deprecate = function() {};\\r\\n\\t\\tmodule.paths = [];\\r\\n\\t\\t// module.parent = undefined by default\\r\\n\\t\\tif(!module.children) module.children = [];\\r\\n\\t\\tObject.defineProperty(module, \\\"loaded\\\", {\\r\\n\\t\\t\\tenumerable: true,\\r\\n\\t\\t\\tconfigurable: false,\\r\\n\\t\\t\\tget: function() { return module.l; }\\r\\n\\t\\t});\\r\\n\\t\\tObject.defineProperty(module, \\\"id\\\", {\\r\\n\\t\\t\\tenumerable: true,\\r\\n\\t\\t\\tconfigurable: false,\\r\\n\\t\\t\\tget: function() { return module.i; }\\r\\n\\t\\t});\\r\\n\\t\\tmodule.webpackPolyfill = 1;\\r\\n\\t}\\r\\n\\treturn module;\\r\\n}\\r\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0aWYoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGUubDsgfVxyXG5cdFx0fSk7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZS5pOyB9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\\n * @license\\n * Lodash \\n * Copyright JS Foundation and other contributors \\n * Released under MIT license \\n * Based on Underscore.js 1.8.3 \\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\\n */\\n;(function() {\\n\\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\\n var undefined;\\n\\n /** Used as the semantic version number. */\\n var VERSION = '4.17.4';\\n\\n /** Used as the size to enable large array optimizations. */\\n var LARGE_ARRAY_SIZE = 200;\\n\\n /** Error message constants. */\\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\\n FUNC_ERROR_TEXT = 'Expected a function';\\n\\n /** Used to stand-in for `undefined` hash values. */\\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\\n\\n /** Used as the maximum memoize cache size. */\\n var MAX_MEMOIZE_SIZE = 500;\\n\\n /** Used as the internal argument placeholder. */\\n var PLACEHOLDER = '__lodash_placeholder__';\\n\\n /** Used to compose bitmasks for cloning. */\\n var CLONE_DEEP_FLAG = 1,\\n CLONE_FLAT_FLAG = 2,\\n CLONE_SYMBOLS_FLAG = 4;\\n\\n /** Used to compose bitmasks for value comparisons. */\\n var COMPARE_PARTIAL_FLAG = 1,\\n COMPARE_UNORDERED_FLAG = 2;\\n\\n /** Used to compose bitmasks for function metadata. */\\n var WRAP_BIND_FLAG = 1,\\n WRAP_BIND_KEY_FLAG = 2,\\n WRAP_CURRY_BOUND_FLAG = 4,\\n WRAP_CURRY_FLAG = 8,\\n WRAP_CURRY_RIGHT_FLAG = 16,\\n WRAP_PARTIAL_FLAG = 32,\\n WRAP_PARTIAL_RIGHT_FLAG = 64,\\n WRAP_ARY_FLAG = 128,\\n WRAP_REARG_FLAG = 256,\\n WRAP_FLIP_FLAG = 512;\\n\\n /** Used as default options for `_.truncate`. */\\n var DEFAULT_TRUNC_LENGTH = 30,\\n DEFAULT_TRUNC_OMISSION = '...';\\n\\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\\n var HOT_COUNT = 800,\\n HOT_SPAN = 16;\\n\\n /** Used to indicate the type of lazy iteratees. */\\n var LAZY_FILTER_FLAG = 1,\\n LAZY_MAP_FLAG = 2,\\n LAZY_WHILE_FLAG = 3;\\n\\n /** Used as references for various `Number` constants. */\\n var INFINITY = 1 / 0,\\n MAX_SAFE_INTEGER = 9007199254740991,\\n MAX_INTEGER = 1.7976931348623157e+308,\\n NAN = 0 / 0;\\n\\n /** Used as references for the maximum length and index of an array. */\\n var MAX_ARRAY_LENGTH = 4294967295,\\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\\n\\n /** Used to associate wrap methods with their bit flags. */\\n var wrapFlags = [\\n ['ary', WRAP_ARY_FLAG],\\n ['bind', WRAP_BIND_FLAG],\\n ['bindKey', WRAP_BIND_KEY_FLAG],\\n ['curry', WRAP_CURRY_FLAG],\\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\\n ['flip', WRAP_FLIP_FLAG],\\n ['partial', WRAP_PARTIAL_FLAG],\\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\\n ['rearg', WRAP_REARG_FLAG]\\n ];\\n\\n /** `Object#toString` result references. */\\n var argsTag = '[object Arguments]',\\n arrayTag = '[object Array]',\\n asyncTag = '[object AsyncFunction]',\\n boolTag = '[object Boolean]',\\n dateTag = '[object Date]',\\n domExcTag = '[object DOMException]',\\n errorTag = '[object Error]',\\n funcTag = '[object Function]',\\n genTag = '[object GeneratorFunction]',\\n mapTag = '[object Map]',\\n numberTag = '[object Number]',\\n nullTag = '[object Null]',\\n objectTag = '[object Object]',\\n promiseTag = '[object Promise]',\\n proxyTag = '[object Proxy]',\\n regexpTag = '[object RegExp]',\\n setTag = '[object Set]',\\n stringTag = '[object String]',\\n symbolTag = '[object Symbol]',\\n undefinedTag = '[object Undefined]',\\n weakMapTag = '[object WeakMap]',\\n weakSetTag = '[object WeakSet]';\\n\\n var arrayBufferTag = '[object ArrayBuffer]',\\n dataViewTag = '[object DataView]',\\n float32Tag = '[object Float32Array]',\\n float64Tag = '[object Float64Array]',\\n int8Tag = '[object Int8Array]',\\n int16Tag = '[object Int16Array]',\\n int32Tag = '[object Int32Array]',\\n uint8Tag = '[object Uint8Array]',\\n uint8ClampedTag = '[object Uint8ClampedArray]',\\n uint16Tag = '[object Uint16Array]',\\n uint32Tag = '[object Uint32Array]';\\n\\n /** Used to match empty string literals in compiled template source. */\\n var reEmptyStringLeading = /\\\\b__p \\\\+= '';/g,\\n reEmptyStringMiddle = /\\\\b(__p \\\\+=) '' \\\\+/g,\\n reEmptyStringTrailing = /(__e\\\\(.*?\\\\)|\\\\b__t\\\\)) \\\\+\\\\n'';/g;\\n\\n /** Used to match HTML entities and HTML characters. */\\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\\n reUnescapedHtml = /[&<>\\\"']/g,\\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\\n\\n /** Used to match template delimiters. */\\n var reEscape = /<%-([\\\\s\\\\S]+?)%>/g,\\n reEvaluate = /<%([\\\\s\\\\S]+?)%>/g,\\n reInterpolate = /<%=([\\\\s\\\\S]+?)%>/g;\\n\\n /** Used to match property names within property paths. */\\n var reIsDeepProp = /\\\\.|\\\\[(?:[^[\\\\]]*|([\\\"'])(?:(?!\\\\1)[^\\\\\\\\]|\\\\\\\\.)*?\\\\1)\\\\]/,\\n reIsPlainProp = /^\\\\w*$/,\\n reLeadingDot = /^\\\\./,\\n rePropName = /[^.[\\\\]]+|\\\\[(?:(-?\\\\d+(?:\\\\.\\\\d+)?)|([\\\"'])((?:(?!\\\\2)[^\\\\\\\\]|\\\\\\\\.)*?)\\\\2)\\\\]|(?=(?:\\\\.|\\\\[\\\\])(?:\\\\.|\\\\[\\\\]|$))/g;\\n\\n /**\\n * Used to match `RegExp`\\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\\n */\\n var reRegExpChar = /[\\\\\\\\^$.*+?()[\\\\]{}|]/g,\\n reHasRegExpChar = RegExp(reRegExpChar.source);\\n\\n /** Used to match leading and trailing whitespace. */\\n var reTrim = /^\\\\s+|\\\\s+$/g,\\n reTrimStart = /^\\\\s+/,\\n reTrimEnd = /\\\\s+$/;\\n\\n /** Used to match wrap detail comments. */\\n var reWrapComment = /\\\\{(?:\\\\n\\\\/\\\\* \\\\[wrapped with .+\\\\] \\\\*\\\\/)?\\\\n?/,\\n reWrapDetails = /\\\\{\\\\n\\\\/\\\\* \\\\[wrapped with (.+)\\\\] \\\\*/,\\n reSplitDetails = /,? & /;\\n\\n /** Used to match words composed of alphanumeric characters. */\\n var reAsciiWord = /[^\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\x7f]+/g;\\n\\n /** Used to match backslashes in property paths. */\\n var reEscapeChar = /\\\\\\\\(\\\\\\\\)?/g;\\n\\n /**\\n * Used to match\\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\\n */\\n var reEsTemplate = /\\\\$\\\\{([^\\\\\\\\}]*(?:\\\\\\\\.[^\\\\\\\\}]*)*)\\\\}/g;\\n\\n /** Used to match `RegExp` flags from their coerced string values. */\\n var reFlags = /\\\\w*$/;\\n\\n /** Used to detect bad signed hexadecimal string values. */\\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\\n\\n /** Used to detect binary string values. */\\n var reIsBinary = /^0b[01]+$/i;\\n\\n /** Used to detect host constructors (Safari). */\\n var reIsHostCtor = /^\\\\[object .+?Constructor\\\\]$/;\\n\\n /** Used to detect octal string values. */\\n var reIsOctal = /^0o[0-7]+$/i;\\n\\n /** Used to detect unsigned integer values. */\\n var reIsUint = /^(?:0|[1-9]\\\\d*)$/;\\n\\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\\n var reLatin = /[\\\\xc0-\\\\xd6\\\\xd8-\\\\xf6\\\\xf8-\\\\xff\\\\u0100-\\\\u017f]/g;\\n\\n /** Used to ensure capturing order of template delimiters. */\\n var reNoMatch = /($^)/;\\n\\n /** Used to match unescaped characters in compiled string literals. */\\n var reUnescapedString = /['\\\\n\\\\r\\\\u2028\\\\u2029\\\\\\\\]/g;\\n\\n /** Used to compose unicode character classes. */\\n var rsAstralRange = '\\\\\\\\ud800-\\\\\\\\udfff',\\n rsComboMarksRange = '\\\\\\\\u0300-\\\\\\\\u036f',\\n reComboHalfMarksRange = '\\\\\\\\ufe20-\\\\\\\\ufe2f',\\n rsComboSymbolsRange = '\\\\\\\\u20d0-\\\\\\\\u20ff',\\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\\n rsDingbatRange = '\\\\\\\\u2700-\\\\\\\\u27bf',\\n rsLowerRange = 'a-z\\\\\\\\xdf-\\\\\\\\xf6\\\\\\\\xf8-\\\\\\\\xff',\\n rsMathOpRange = '\\\\\\\\xac\\\\\\\\xb1\\\\\\\\xd7\\\\\\\\xf7',\\n rsNonCharRange = '\\\\\\\\x00-\\\\\\\\x2f\\\\\\\\x3a-\\\\\\\\x40\\\\\\\\x5b-\\\\\\\\x60\\\\\\\\x7b-\\\\\\\\xbf',\\n rsPunctuationRange = '\\\\\\\\u2000-\\\\\\\\u206f',\\n rsSpaceRange = ' \\\\\\\\t\\\\\\\\x0b\\\\\\\\f\\\\\\\\xa0\\\\\\\\ufeff\\\\\\\\n\\\\\\\\r\\\\\\\\u2028\\\\\\\\u2029\\\\\\\\u1680\\\\\\\\u180e\\\\\\\\u2000\\\\\\\\u2001\\\\\\\\u2002\\\\\\\\u2003\\\\\\\\u2004\\\\\\\\u2005\\\\\\\\u2006\\\\\\\\u2007\\\\\\\\u2008\\\\\\\\u2009\\\\\\\\u200a\\\\\\\\u202f\\\\\\\\u205f\\\\\\\\u3000',\\n rsUpperRange = 'A-Z\\\\\\\\xc0-\\\\\\\\xd6\\\\\\\\xd8-\\\\\\\\xde',\\n rsVarRange = '\\\\\\\\ufe0e\\\\\\\\ufe0f',\\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\\n\\n /** Used to compose unicode capture groups. */\\n var rsApos = \\\"['\\\\u2019]\\\",\\n rsAstral = '[' + rsAstralRange + ']',\\n rsBreak = '[' + rsBreakRange + ']',\\n rsCombo = '[' + rsComboRange + ']',\\n rsDigits = '\\\\\\\\d+',\\n rsDingbat = '[' + rsDingbatRange + ']',\\n rsLower = '[' + rsLowerRange + ']',\\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\\n rsFitz = '\\\\\\\\ud83c[\\\\\\\\udffb-\\\\\\\\udfff]',\\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\\n rsNonAstral = '[^' + rsAstralRange + ']',\\n rsRegional = '(?:\\\\\\\\ud83c[\\\\\\\\udde6-\\\\\\\\uddff]){2}',\\n rsSurrPair = '[\\\\\\\\ud800-\\\\\\\\udbff][\\\\\\\\udc00-\\\\\\\\udfff]',\\n rsUpper = '[' + rsUpperRange + ']',\\n rsZWJ = '\\\\\\\\u200d';\\n\\n /** Used to compose unicode regexes. */\\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\\n reOptMod = rsModifier + '?',\\n rsOptVar = '[' + rsVarRange + ']?',\\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\\n rsOrdLower = '\\\\\\\\d*(?:(?:1st|2nd|3rd|(?![123])\\\\\\\\dth)\\\\\\\\b)',\\n rsOrdUpper = '\\\\\\\\d*(?:(?:1ST|2ND|3RD|(?![123])\\\\\\\\dTH)\\\\\\\\b)',\\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\\n\\n /** Used to match apostrophes. */\\n var reApos = RegExp(rsApos, 'g');\\n\\n /**\\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\\n */\\n var reComboMark = RegExp(rsCombo, 'g');\\n\\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\\n\\n /** Used to match complex or compound words. */\\n var reUnicodeWord = RegExp([\\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\\n rsUpper + '+' + rsOptContrUpper,\\n rsOrdUpper,\\n rsOrdLower,\\n rsDigits,\\n rsEmoji\\n ].join('|'), 'g');\\n\\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\\n\\n /** Used to detect strings that need a more robust regexp to match words. */\\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\\n\\n /** Used to assign default `context` object properties. */\\n var contextProps = [\\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\\n ];\\n\\n /** Used to make template sourceURLs easier to identify. */\\n var templateCounter = -1;\\n\\n /** Used to identify `toStringTag` values of typed arrays. */\\n var typedArrayTags = {};\\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\\n typedArrayTags[uint32Tag] = true;\\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\\n typedArrayTags[weakMapTag] = false;\\n\\n /** Used to identify `toStringTag` values supported by `_.clone`. */\\n var cloneableTags = {};\\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\\n cloneableTags[boolTag] = cloneableTags[dateTag] =\\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\\n cloneableTags[numberTag] = cloneableTags[objectTag] =\\n cloneableTags[regexpTag] = cloneableTags[setTag] =\\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\\n cloneableTags[errorTag] = cloneableTags[funcTag] =\\n cloneableTags[weakMapTag] = false;\\n\\n /** Used to map Latin Unicode letters to basic Latin letters. */\\n var deburredLetters = {\\n // Latin-1 Supplement block.\\n '\\\\xc0': 'A', '\\\\xc1': 'A', '\\\\xc2': 'A', '\\\\xc3': 'A', '\\\\xc4': 'A', '\\\\xc5': 'A',\\n '\\\\xe0': 'a', '\\\\xe1': 'a', '\\\\xe2': 'a', '\\\\xe3': 'a', '\\\\xe4': 'a', '\\\\xe5': 'a',\\n '\\\\xc7': 'C', '\\\\xe7': 'c',\\n '\\\\xd0': 'D', '\\\\xf0': 'd',\\n '\\\\xc8': 'E', '\\\\xc9': 'E', '\\\\xca': 'E', '\\\\xcb': 'E',\\n '\\\\xe8': 'e', '\\\\xe9': 'e', '\\\\xea': 'e', '\\\\xeb': 'e',\\n '\\\\xcc': 'I', '\\\\xcd': 'I', '\\\\xce': 'I', '\\\\xcf': 'I',\\n '\\\\xec': 'i', '\\\\xed': 'i', '\\\\xee': 'i', '\\\\xef': 'i',\\n '\\\\xd1': 'N', '\\\\xf1': 'n',\\n '\\\\xd2': 'O', '\\\\xd3': 'O', '\\\\xd4': 'O', '\\\\xd5': 'O', '\\\\xd6': 'O', '\\\\xd8': 'O',\\n '\\\\xf2': 'o', '\\\\xf3': 'o', '\\\\xf4': 'o', '\\\\xf5': 'o', '\\\\xf6': 'o', '\\\\xf8': 'o',\\n '\\\\xd9': 'U', '\\\\xda': 'U', '\\\\xdb': 'U', '\\\\xdc': 'U',\\n '\\\\xf9': 'u', '\\\\xfa': 'u', '\\\\xfb': 'u', '\\\\xfc': 'u',\\n '\\\\xdd': 'Y', '\\\\xfd': 'y', '\\\\xff': 'y',\\n '\\\\xc6': 'Ae', '\\\\xe6': 'ae',\\n '\\\\xde': 'Th', '\\\\xfe': 'th',\\n '\\\\xdf': 'ss',\\n // Latin Extended-A block.\\n '\\\\u0100': 'A', '\\\\u0102': 'A', '\\\\u0104': 'A',\\n '\\\\u0101': 'a', '\\\\u0103': 'a', '\\\\u0105': 'a',\\n '\\\\u0106': 'C', '\\\\u0108': 'C', '\\\\u010a': 'C', '\\\\u010c': 'C',\\n '\\\\u0107': 'c', '\\\\u0109': 'c', '\\\\u010b': 'c', '\\\\u010d': 'c',\\n '\\\\u010e': 'D', '\\\\u0110': 'D', '\\\\u010f': 'd', '\\\\u0111': 'd',\\n '\\\\u0112': 'E', '\\\\u0114': 'E', '\\\\u0116': 'E', '\\\\u0118': 'E', '\\\\u011a': 'E',\\n '\\\\u0113': 'e', '\\\\u0115': 'e', '\\\\u0117': 'e', '\\\\u0119': 'e', '\\\\u011b': 'e',\\n '\\\\u011c': 'G', '\\\\u011e': 'G', '\\\\u0120': 'G', '\\\\u0122': 'G',\\n '\\\\u011d': 'g', '\\\\u011f': 'g', '\\\\u0121': 'g', '\\\\u0123': 'g',\\n '\\\\u0124': 'H', '\\\\u0126': 'H', '\\\\u0125': 'h', '\\\\u0127': 'h',\\n '\\\\u0128': 'I', '\\\\u012a': 'I', '\\\\u012c': 'I', '\\\\u012e': 'I', '\\\\u0130': 'I',\\n '\\\\u0129': 'i', '\\\\u012b': 'i', '\\\\u012d': 'i', '\\\\u012f': 'i', '\\\\u0131': 'i',\\n '\\\\u0134': 'J', '\\\\u0135': 'j',\\n '\\\\u0136': 'K', '\\\\u0137': 'k', '\\\\u0138': 'k',\\n '\\\\u0139': 'L', '\\\\u013b': 'L', '\\\\u013d': 'L', '\\\\u013f': 'L', '\\\\u0141': 'L',\\n '\\\\u013a': 'l', '\\\\u013c': 'l', '\\\\u013e': 'l', '\\\\u0140': 'l', '\\\\u0142': 'l',\\n '\\\\u0143': 'N', '\\\\u0145': 'N', '\\\\u0147': 'N', '\\\\u014a': 'N',\\n '\\\\u0144': 'n', '\\\\u0146': 'n', '\\\\u0148': 'n', '\\\\u014b': 'n',\\n '\\\\u014c': 'O', '\\\\u014e': 'O', '\\\\u0150': 'O',\\n '\\\\u014d': 'o', '\\\\u014f': 'o', '\\\\u0151': 'o',\\n '\\\\u0154': 'R', '\\\\u0156': 'R', '\\\\u0158': 'R',\\n '\\\\u0155': 'r', '\\\\u0157': 'r', '\\\\u0159': 'r',\\n '\\\\u015a': 'S', '\\\\u015c': 'S', '\\\\u015e': 'S', '\\\\u0160': 'S',\\n '\\\\u015b': 's', '\\\\u015d': 's', '\\\\u015f': 's', '\\\\u0161': 's',\\n '\\\\u0162': 'T', '\\\\u0164': 'T', '\\\\u0166': 'T',\\n '\\\\u0163': 't', '\\\\u0165': 't', '\\\\u0167': 't',\\n '\\\\u0168': 'U', '\\\\u016a': 'U', '\\\\u016c': 'U', '\\\\u016e': 'U', '\\\\u0170': 'U', '\\\\u0172': 'U',\\n '\\\\u0169': 'u', '\\\\u016b': 'u', '\\\\u016d': 'u', '\\\\u016f': 'u', '\\\\u0171': 'u', '\\\\u0173': 'u',\\n '\\\\u0174': 'W', '\\\\u0175': 'w',\\n '\\\\u0176': 'Y', '\\\\u0177': 'y', '\\\\u0178': 'Y',\\n '\\\\u0179': 'Z', '\\\\u017b': 'Z', '\\\\u017d': 'Z',\\n '\\\\u017a': 'z', '\\\\u017c': 'z', '\\\\u017e': 'z',\\n '\\\\u0132': 'IJ', '\\\\u0133': 'ij',\\n '\\\\u0152': 'Oe', '\\\\u0153': 'oe',\\n '\\\\u0149': \\\"'n\\\", '\\\\u017f': 's'\\n };\\n\\n /** Used to map characters to HTML entities. */\\n var htmlEscapes = {\\n '&': '&',\\n '<': '<',\\n '>': '>',\\n '\\\"': '"',\\n \\\"'\\\": '''\\n };\\n\\n /** Used to map HTML entities to characters. */\\n var htmlUnescapes = {\\n '&': '&',\\n '<': '<',\\n '>': '>',\\n '"': '\\\"',\\n ''': \\\"'\\\"\\n };\\n\\n /** Used to escape characters for inclusion in compiled string literals. */\\n var stringEscapes = {\\n '\\\\\\\\': '\\\\\\\\',\\n \\\"'\\\": \\\"'\\\",\\n '\\\\n': 'n',\\n '\\\\r': 'r',\\n '\\\\u2028': 'u2028',\\n '\\\\u2029': 'u2029'\\n };\\n\\n /** Built-in method references without a dependency on `root`. */\\n var freeParseFloat = parseFloat,\\n freeParseInt = parseInt;\\n\\n /** Detect free variable `global` from Node.js. */\\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\\n\\n /** Detect free variable `self`. */\\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\\n\\n /** Used as a reference to the global object. */\\n var root = freeGlobal || freeSelf || Function('return this')();\\n\\n /** Detect free variable `exports`. */\\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\\n\\n /** Detect free variable `module`. */\\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\\n\\n /** Detect the popular CommonJS extension `module.exports`. */\\n var moduleExports = freeModule && freeModule.exports === freeExports;\\n\\n /** Detect free variable `process` from Node.js. */\\n var freeProcess = moduleExports && freeGlobal.process;\\n\\n /** Used to access faster Node.js helpers. */\\n var nodeUtil = (function() {\\n try {\\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\\n } catch (e) {}\\n }());\\n\\n /* Node.js helper references. */\\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\\n nodeIsDate = nodeUtil && nodeUtil.isDate,\\n nodeIsMap = nodeUtil && nodeUtil.isMap,\\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\\n nodeIsSet = nodeUtil && nodeUtil.isSet,\\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\\n\\n /*--------------------------------------------------------------------------*/\\n\\n /**\\n * Adds the key-value `pair` to `map`.\\n *\\n * @private\\n * @param {Object} map The map to modify.\\n * @param {Array} pair The key-value pair to add.\\n * @returns {Object} Returns `map`.\\n */\\n function addMapEntry(map, pair) {\\n // Don't return `map.set` because it's not chainable in IE 11.\\n map.set(pair[0], pair[1]);\\n return map;\\n }\\n\\n /**\\n * Adds `value` to `set`.\\n *\\n * @private\\n * @param {Object} set The set to modify.\\n * @param {*} value The value to add.\\n * @returns {Object} Returns `set`.\\n */\\n function addSetEntry(set, value) {\\n // Don't return `set.add` because it's not chainable in IE 11.\\n set.add(value);\\n return set;\\n }\\n\\n /**\\n * A faster alternative to `Function#apply`, this function invokes `func`\\n * with the `this` binding of `thisArg` and the arguments of `args`.\\n *\\n * @private\\n * @param {Function} func The function to invoke.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {Array} args The arguments to invoke `func` with.\\n * @returns {*} Returns the result of `func`.\\n */\\n function apply(func, thisArg, args) {\\n switch (args.length) {\\n case 0: return func.call(thisArg);\\n case 1: return func.call(thisArg, args[0]);\\n case 2: return func.call(thisArg, args[0], args[1]);\\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\\n }\\n return func.apply(thisArg, args);\\n }\\n\\n /**\\n * A specialized version of `baseAggregator` for arrays.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform keys.\\n * @param {Object} accumulator The initial aggregated object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function arrayAggregator(array, setter, iteratee, accumulator) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n var value = array[index];\\n setter(accumulator, value, iteratee(value), array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.forEach` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayEach(array, iteratee) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (iteratee(array[index], index, array) === false) {\\n break;\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.forEachRight` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayEachRight(array, iteratee) {\\n var length = array == null ? 0 : array.length;\\n\\n while (length--) {\\n if (iteratee(array[length], length, array) === false) {\\n break;\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.every` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`.\\n */\\n function arrayEvery(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (!predicate(array[index], index, array)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * A specialized version of `_.filter` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n */\\n function arrayFilter(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (predicate(value, index, array)) {\\n result[resIndex++] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.includes` for arrays without support for\\n * specifying an index to search from.\\n *\\n * @private\\n * @param {Array} [array] The array to inspect.\\n * @param {*} target The value to search for.\\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\\n */\\n function arrayIncludes(array, value) {\\n var length = array == null ? 0 : array.length;\\n return !!length && baseIndexOf(array, value, 0) > -1;\\n }\\n\\n /**\\n * This function is like `arrayIncludes` except that it accepts a comparator.\\n *\\n * @private\\n * @param {Array} [array] The array to inspect.\\n * @param {*} target The value to search for.\\n * @param {Function} comparator The comparator invoked per element.\\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\\n */\\n function arrayIncludesWith(array, value, comparator) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (comparator(value, array[index])) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * A specialized version of `_.map` for arrays without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n */\\n function arrayMap(array, iteratee) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n result = Array(length);\\n\\n while (++index < length) {\\n result[index] = iteratee(array[index], index, array);\\n }\\n return result;\\n }\\n\\n /**\\n * Appends the elements of `values` to `array`.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to append.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayPush(array, values) {\\n var index = -1,\\n length = values.length,\\n offset = array.length;\\n\\n while (++index < length) {\\n array[offset + index] = values[index];\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.reduce` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @param {boolean} [initAccum] Specify using the first element of `array` as\\n * the initial value.\\n * @returns {*} Returns the accumulated value.\\n */\\n function arrayReduce(array, iteratee, accumulator, initAccum) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n if (initAccum && length) {\\n accumulator = array[++index];\\n }\\n while (++index < length) {\\n accumulator = iteratee(accumulator, array[index], index, array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.reduceRight` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @param {boolean} [initAccum] Specify using the last element of `array` as\\n * the initial value.\\n * @returns {*} Returns the accumulated value.\\n */\\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\\n var length = array == null ? 0 : array.length;\\n if (initAccum && length) {\\n accumulator = array[--length];\\n }\\n while (length--) {\\n accumulator = iteratee(accumulator, array[length], length, array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.some` for arrays without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n */\\n function arraySome(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (predicate(array[index], index, array)) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * Gets the size of an ASCII `string`.\\n *\\n * @private\\n * @param {string} string The string inspect.\\n * @returns {number} Returns the string size.\\n */\\n var asciiSize = baseProperty('length');\\n\\n /**\\n * Converts an ASCII `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function asciiToArray(string) {\\n return string.split('');\\n }\\n\\n /**\\n * Splits an ASCII `string` into an array of its words.\\n *\\n * @private\\n * @param {string} The string to inspect.\\n * @returns {Array} Returns the words of `string`.\\n */\\n function asciiWords(string) {\\n return string.match(reAsciiWord) || [];\\n }\\n\\n /**\\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\\n * without support for iteratee shorthands, which iterates over `collection`\\n * using `eachFunc`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {Function} eachFunc The function to iterate over `collection`.\\n * @returns {*} Returns the found element or its key, else `undefined`.\\n */\\n function baseFindKey(collection, predicate, eachFunc) {\\n var result;\\n eachFunc(collection, function(value, key, collection) {\\n if (predicate(value, key, collection)) {\\n result = key;\\n return false;\\n }\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\\n * support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {number} fromIndex The index to search from.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\\n var length = array.length,\\n index = fromIndex + (fromRight ? 1 : -1);\\n\\n while ((fromRight ? index-- : ++index < length)) {\\n if (predicate(array[index], index, array)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseIndexOf(array, value, fromIndex) {\\n return value === value\\n ? strictIndexOf(array, value, fromIndex)\\n : baseFindIndex(array, baseIsNaN, fromIndex);\\n }\\n\\n /**\\n * This function is like `baseIndexOf` except that it accepts a comparator.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @param {Function} comparator The comparator invoked per element.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseIndexOfWith(array, value, fromIndex, comparator) {\\n var index = fromIndex - 1,\\n length = array.length;\\n\\n while (++index < length) {\\n if (comparator(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * The base implementation of `_.isNaN` without support for number objects.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\\n */\\n function baseIsNaN(value) {\\n return value !== value;\\n }\\n\\n /**\\n * The base implementation of `_.mean` and `_.meanBy` without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {number} Returns the mean.\\n */\\n function baseMean(array, iteratee) {\\n var length = array == null ? 0 : array.length;\\n return length ? (baseSum(array, iteratee) / length) : NAN;\\n }\\n\\n /**\\n * The base implementation of `_.property` without support for deep paths.\\n *\\n * @private\\n * @param {string} key The key of the property to get.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function baseProperty(key) {\\n return function(object) {\\n return object == null ? undefined : object[key];\\n };\\n }\\n\\n /**\\n * The base implementation of `_.propertyOf` without support for deep paths.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function basePropertyOf(object) {\\n return function(key) {\\n return object == null ? undefined : object[key];\\n };\\n }\\n\\n /**\\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} accumulator The initial value.\\n * @param {boolean} initAccum Specify using the first or last element of\\n * `collection` as the initial value.\\n * @param {Function} eachFunc The function to iterate over `collection`.\\n * @returns {*} Returns the accumulated value.\\n */\\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\\n eachFunc(collection, function(value, index, collection) {\\n accumulator = initAccum\\n ? (initAccum = false, value)\\n : iteratee(accumulator, value, index, collection);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.sortBy` which uses `comparer` to define the\\n * sort order of `array` and replaces criteria objects with their corresponding\\n * values.\\n *\\n * @private\\n * @param {Array} array The array to sort.\\n * @param {Function} comparer The function to define sort order.\\n * @returns {Array} Returns `array`.\\n */\\n function baseSortBy(array, comparer) {\\n var length = array.length;\\n\\n array.sort(comparer);\\n while (length--) {\\n array[length] = array[length].value;\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.sum` and `_.sumBy` without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {number} Returns the sum.\\n */\\n function baseSum(array, iteratee) {\\n var result,\\n index = -1,\\n length = array.length;\\n\\n while (++index < length) {\\n var current = iteratee(array[index]);\\n if (current !== undefined) {\\n result = result === undefined ? current : (result + current);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.times` without support for iteratee shorthands\\n * or max array length checks.\\n *\\n * @private\\n * @param {number} n The number of times to invoke `iteratee`.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the array of results.\\n */\\n function baseTimes(n, iteratee) {\\n var index = -1,\\n result = Array(n);\\n\\n while (++index < n) {\\n result[index] = iteratee(index);\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\\n * of key-value pairs for `object` corresponding to the property names of `props`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} props The property names to get values for.\\n * @returns {Object} Returns the key-value pairs.\\n */\\n function baseToPairs(object, props) {\\n return arrayMap(props, function(key) {\\n return [key, object[key]];\\n });\\n }\\n\\n /**\\n * The base implementation of `_.unary` without support for storing metadata.\\n *\\n * @private\\n * @param {Function} func The function to cap arguments for.\\n * @returns {Function} Returns the new capped function.\\n */\\n function baseUnary(func) {\\n return function(value) {\\n return func(value);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.values` and `_.valuesIn` which creates an\\n * array of `object` property values corresponding to the property names\\n * of `props`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} props The property names to get values for.\\n * @returns {Object} Returns the array of property values.\\n */\\n function baseValues(object, props) {\\n return arrayMap(props, function(key) {\\n return object[key];\\n });\\n }\\n\\n /**\\n * Checks if a `cache` value for `key` exists.\\n *\\n * @private\\n * @param {Object} cache The cache to query.\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function cacheHas(cache, key) {\\n return cache.has(key);\\n }\\n\\n /**\\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\\n * that is not found in the character symbols.\\n *\\n * @private\\n * @param {Array} strSymbols The string symbols to inspect.\\n * @param {Array} chrSymbols The character symbols to find.\\n * @returns {number} Returns the index of the first unmatched string symbol.\\n */\\n function charsStartIndex(strSymbols, chrSymbols) {\\n var index = -1,\\n length = strSymbols.length;\\n\\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\\n return index;\\n }\\n\\n /**\\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\\n * that is not found in the character symbols.\\n *\\n * @private\\n * @param {Array} strSymbols The string symbols to inspect.\\n * @param {Array} chrSymbols The character symbols to find.\\n * @returns {number} Returns the index of the last unmatched string symbol.\\n */\\n function charsEndIndex(strSymbols, chrSymbols) {\\n var index = strSymbols.length;\\n\\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\\n return index;\\n }\\n\\n /**\\n * Gets the number of `placeholder` occurrences in `array`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} placeholder The placeholder to search for.\\n * @returns {number} Returns the placeholder count.\\n */\\n function countHolders(array, placeholder) {\\n var length = array.length,\\n result = 0;\\n\\n while (length--) {\\n if (array[length] === placeholder) {\\n ++result;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\\n * letters to basic Latin letters.\\n *\\n * @private\\n * @param {string} letter The matched letter to deburr.\\n * @returns {string} Returns the deburred letter.\\n */\\n var deburrLetter = basePropertyOf(deburredLetters);\\n\\n /**\\n * Used by `_.escape` to convert characters to HTML entities.\\n *\\n * @private\\n * @param {string} chr The matched character to escape.\\n * @returns {string} Returns the escaped character.\\n */\\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\\n\\n /**\\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\\n *\\n * @private\\n * @param {string} chr The matched character to escape.\\n * @returns {string} Returns the escaped character.\\n */\\n function escapeStringChar(chr) {\\n return '\\\\\\\\' + stringEscapes[chr];\\n }\\n\\n /**\\n * Gets the value at `key` of `object`.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {string} key The key of the property to get.\\n * @returns {*} Returns the property value.\\n */\\n function getValue(object, key) {\\n return object == null ? undefined : object[key];\\n }\\n\\n /**\\n * Checks if `string` contains Unicode symbols.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\\n */\\n function hasUnicode(string) {\\n return reHasUnicode.test(string);\\n }\\n\\n /**\\n * Checks if `string` contains a word composed of Unicode symbols.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {boolean} Returns `true` if a word is found, else `false`.\\n */\\n function hasUnicodeWord(string) {\\n return reHasUnicodeWord.test(string);\\n }\\n\\n /**\\n * Converts `iterator` to an array.\\n *\\n * @private\\n * @param {Object} iterator The iterator to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function iteratorToArray(iterator) {\\n var data,\\n result = [];\\n\\n while (!(data = iterator.next()).done) {\\n result.push(data.value);\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `map` to its key-value pairs.\\n *\\n * @private\\n * @param {Object} map The map to convert.\\n * @returns {Array} Returns the key-value pairs.\\n */\\n function mapToArray(map) {\\n var index = -1,\\n result = Array(map.size);\\n\\n map.forEach(function(value, key) {\\n result[++index] = [key, value];\\n });\\n return result;\\n }\\n\\n /**\\n * Creates a unary function that invokes `func` with its argument transformed.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {Function} transform The argument transform.\\n * @returns {Function} Returns the new function.\\n */\\n function overArg(func, transform) {\\n return function(arg) {\\n return func(transform(arg));\\n };\\n }\\n\\n /**\\n * Replaces all `placeholder` elements in `array` with an internal placeholder\\n * and returns an array of their indexes.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {*} placeholder The placeholder to replace.\\n * @returns {Array} Returns the new array of placeholder indexes.\\n */\\n function replaceHolders(array, placeholder) {\\n var index = -1,\\n length = array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (value === placeholder || value === PLACEHOLDER) {\\n array[index] = PLACEHOLDER;\\n result[resIndex++] = index;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `set` to an array of its values.\\n *\\n * @private\\n * @param {Object} set The set to convert.\\n * @returns {Array} Returns the values.\\n */\\n function setToArray(set) {\\n var index = -1,\\n result = Array(set.size);\\n\\n set.forEach(function(value) {\\n result[++index] = value;\\n });\\n return result;\\n }\\n\\n /**\\n * Converts `set` to its value-value pairs.\\n *\\n * @private\\n * @param {Object} set The set to convert.\\n * @returns {Array} Returns the value-value pairs.\\n */\\n function setToPairs(set) {\\n var index = -1,\\n result = Array(set.size);\\n\\n set.forEach(function(value) {\\n result[++index] = [value, value];\\n });\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.indexOf` which performs strict equality\\n * comparisons of values, i.e. `===`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function strictIndexOf(array, value, fromIndex) {\\n var index = fromIndex - 1,\\n length = array.length;\\n\\n while (++index < length) {\\n if (array[index] === value) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * A specialized version of `_.lastIndexOf` which performs strict equality\\n * comparisons of values, i.e. `===`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function strictLastIndexOf(array, value, fromIndex) {\\n var index = fromIndex + 1;\\n while (index--) {\\n if (array[index] === value) {\\n return index;\\n }\\n }\\n return index;\\n }\\n\\n /**\\n * Gets the number of symbols in `string`.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {number} Returns the string size.\\n */\\n function stringSize(string) {\\n return hasUnicode(string)\\n ? unicodeSize(string)\\n : asciiSize(string);\\n }\\n\\n /**\\n * Converts `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function stringToArray(string) {\\n return hasUnicode(string)\\n ? unicodeToArray(string)\\n : asciiToArray(string);\\n }\\n\\n /**\\n * Used by `_.unescape` to convert HTML entities to characters.\\n *\\n * @private\\n * @param {string} chr The matched character to unescape.\\n * @returns {string} Returns the unescaped character.\\n */\\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\\n\\n /**\\n * Gets the size of a Unicode `string`.\\n *\\n * @private\\n * @param {string} string The string inspect.\\n * @returns {number} Returns the string size.\\n */\\n function unicodeSize(string) {\\n var result = reUnicode.lastIndex = 0;\\n while (reUnicode.test(string)) {\\n ++result;\\n }\\n return result;\\n }\\n\\n /**\\n * Converts a Unicode `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function unicodeToArray(string) {\\n return string.match(reUnicode) || [];\\n }\\n\\n /**\\n * Splits a Unicode `string` into an array of its words.\\n *\\n * @private\\n * @param {string} The string to inspect.\\n * @returns {Array} Returns the words of `string`.\\n */\\n function unicodeWords(string) {\\n return string.match(reUnicodeWord) || [];\\n }\\n\\n /*--------------------------------------------------------------------------*/\\n\\n /**\\n * Create a new pristine `lodash` function using the `context` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Util\\n * @param {Object} [context=root] The context object.\\n * @returns {Function} Returns a new `lodash` function.\\n * @example\\n *\\n * _.mixin({ 'foo': _.constant('foo') });\\n *\\n * var lodash = _.runInContext();\\n * lodash.mixin({ 'bar': lodash.constant('bar') });\\n *\\n * _.isFunction(_.foo);\\n * // => true\\n * _.isFunction(_.bar);\\n * // => false\\n *\\n * lodash.isFunction(lodash.foo);\\n * // => false\\n * lodash.isFunction(lodash.bar);\\n * // => true\\n *\\n * // Create a suped-up `defer` in Node.js.\\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\\n */\\n var runInContext = (function runInContext(context) {\\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\\n\\n /** Built-in constructor references. */\\n var Array = context.Array,\\n Date = context.Date,\\n Error = context.Error,\\n Function = context.Function,\\n Math = context.Math,\\n Object = context.Object,\\n RegExp = context.RegExp,\\n String = context.String,\\n TypeError = context.TypeError;\\n\\n /** Used for built-in method references. */\\n var arrayProto = Array.prototype,\\n funcProto = Function.prototype,\\n objectProto = Object.prototype;\\n\\n /** Used to detect overreaching core-js shims. */\\n var coreJsData = context['__core-js_shared__'];\\n\\n /** Used to resolve the decompiled source of functions. */\\n var funcToString = funcProto.toString;\\n\\n /** Used to check objects for own properties. */\\n var hasOwnProperty = objectProto.hasOwnProperty;\\n\\n /** Used to generate unique IDs. */\\n var idCounter = 0;\\n\\n /** Used to detect methods masquerading as native. */\\n var maskSrcKey = (function() {\\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\\n return uid ? ('Symbol(src)_1.' + uid) : '';\\n }());\\n\\n /**\\n * Used to resolve the\\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\\n * of values.\\n */\\n var nativeObjectToString = objectProto.toString;\\n\\n /** Used to infer the `Object` constructor. */\\n var objectCtorString = funcToString.call(Object);\\n\\n /** Used to restore the original `_` reference in `_.noConflict`. */\\n var oldDash = root._;\\n\\n /** Used to detect if a method is native. */\\n var reIsNative = RegExp('^' +\\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\\\\\$&')\\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\\\\\\\()| for .+?(?=\\\\\\\\\\\\])/g, '$1.*?') + '$'\\n );\\n\\n /** Built-in value references. */\\n var Buffer = moduleExports ? context.Buffer : undefined,\\n Symbol = context.Symbol,\\n Uint8Array = context.Uint8Array,\\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\\n getPrototype = overArg(Object.getPrototypeOf, Object),\\n objectCreate = Object.create,\\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\\n splice = arrayProto.splice,\\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\\n symIterator = Symbol ? Symbol.iterator : undefined,\\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\\n\\n var defineProperty = (function() {\\n try {\\n var func = getNative(Object, 'defineProperty');\\n func({}, '', {});\\n return func;\\n } catch (e) {}\\n }());\\n\\n /** Mocked built-ins. */\\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\\n\\n /* Built-in method references for those with the same name as other `lodash` methods. */\\n var nativeCeil = Math.ceil,\\n nativeFloor = Math.floor,\\n nativeGetSymbols = Object.getOwnPropertySymbols,\\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\\n nativeIsFinite = context.isFinite,\\n nativeJoin = arrayProto.join,\\n nativeKeys = overArg(Object.keys, Object),\\n nativeMax = Math.max,\\n nativeMin = Math.min,\\n nativeNow = Date.now,\\n nativeParseInt = context.parseInt,\\n nativeRandom = Math.random,\\n nativeReverse = arrayProto.reverse;\\n\\n /* Built-in method references that are verified to be native. */\\n var DataView = getNative(context, 'DataView'),\\n Map = getNative(context, 'Map'),\\n Promise = getNative(context, 'Promise'),\\n Set = getNative(context, 'Set'),\\n WeakMap = getNative(context, 'WeakMap'),\\n nativeCreate = getNative(Object, 'create');\\n\\n /** Used to store function metadata. */\\n var metaMap = WeakMap && new WeakMap;\\n\\n /** Used to lookup unminified function names. */\\n var realNames = {};\\n\\n /** Used to detect maps, sets, and weakmaps. */\\n var dataViewCtorString = toSource(DataView),\\n mapCtorString = toSource(Map),\\n promiseCtorString = toSource(Promise),\\n setCtorString = toSource(Set),\\n weakMapCtorString = toSource(WeakMap);\\n\\n /** Used to convert symbols to primitives and strings. */\\n var symbolProto = Symbol ? Symbol.prototype : undefined,\\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\\n symbolToString = symbolProto ? symbolProto.toString : undefined;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a `lodash` object which wraps `value` to enable implicit method\\n * chain sequences. Methods that operate on and return arrays, collections,\\n * and functions can be chained together. Methods that retrieve a single value\\n * or may return a primitive value will automatically end the chain sequence\\n * and return the unwrapped value. Otherwise, the value must be unwrapped\\n * with `_#value`.\\n *\\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\\n * enabled using `_.chain`.\\n *\\n * The execution of chained methods is lazy, that is, it's deferred until\\n * `_#value` is implicitly or explicitly called.\\n *\\n * Lazy evaluation allows several methods to support shortcut fusion.\\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\\n * the creation of intermediate arrays and can greatly reduce the number of\\n * iteratee executions. Sections of a chain sequence qualify for shortcut\\n * fusion if the section is applied to an array and iteratees accept only\\n * one argument. The heuristic for whether a section qualifies for shortcut\\n * fusion is subject to change.\\n *\\n * Chaining is supported in custom builds as long as the `_#value` method is\\n * directly or indirectly included in the build.\\n *\\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\\n *\\n * The wrapper `Array` methods are:\\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\\n *\\n * The wrapper `String` methods are:\\n * `replace` and `split`\\n *\\n * The wrapper methods that support shortcut fusion are:\\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\\n *\\n * The chainable wrapper methods are:\\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\\n * `zipObject`, `zipObjectDeep`, and `zipWith`\\n *\\n * The wrapper methods that are **not** chainable by default are:\\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\\n * `upperFirst`, `value`, and `words`\\n *\\n * @name _\\n * @constructor\\n * @category Seq\\n * @param {*} value The value to wrap in a `lodash` instance.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var wrapped = _([1, 2, 3]);\\n *\\n * // Returns an unwrapped value.\\n * wrapped.reduce(_.add);\\n * // => 6\\n *\\n * // Returns a wrapped value.\\n * var squares = wrapped.map(square);\\n *\\n * _.isArray(squares);\\n * // => false\\n *\\n * _.isArray(squares.value());\\n * // => true\\n */\\n function lodash(value) {\\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\\n if (value instanceof LodashWrapper) {\\n return value;\\n }\\n if (hasOwnProperty.call(value, '__wrapped__')) {\\n return wrapperClone(value);\\n }\\n }\\n return new LodashWrapper(value);\\n }\\n\\n /**\\n * The base implementation of `_.create` without support for assigning\\n * properties to the created object.\\n *\\n * @private\\n * @param {Object} proto The object to inherit from.\\n * @returns {Object} Returns the new object.\\n */\\n var baseCreate = (function() {\\n function object() {}\\n return function(proto) {\\n if (!isObject(proto)) {\\n return {};\\n }\\n if (objectCreate) {\\n return objectCreate(proto);\\n }\\n object.prototype = proto;\\n var result = new object;\\n object.prototype = undefined;\\n return result;\\n };\\n }());\\n\\n /**\\n * The function whose prototype chain sequence wrappers inherit from.\\n *\\n * @private\\n */\\n function baseLodash() {\\n // No operation performed.\\n }\\n\\n /**\\n * The base constructor for creating `lodash` wrapper objects.\\n *\\n * @private\\n * @param {*} value The value to wrap.\\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\\n */\\n function LodashWrapper(value, chainAll) {\\n this.__wrapped__ = value;\\n this.__actions__ = [];\\n this.__chain__ = !!chainAll;\\n this.__index__ = 0;\\n this.__values__ = undefined;\\n }\\n\\n /**\\n * By default, the template delimiters used by lodash are like those in\\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\\n * following template settings to use alternative delimiters.\\n *\\n * @static\\n * @memberOf _\\n * @type {Object}\\n */\\n lodash.templateSettings = {\\n\\n /**\\n * Used to detect `data` property values to be HTML-escaped.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'escape': reEscape,\\n\\n /**\\n * Used to detect code to be evaluated.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'evaluate': reEvaluate,\\n\\n /**\\n * Used to detect `data` property values to inject.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'interpolate': reInterpolate,\\n\\n /**\\n * Used to reference the data object in the template text.\\n *\\n * @memberOf _.templateSettings\\n * @type {string}\\n */\\n 'variable': '',\\n\\n /**\\n * Used to import variables into the compiled template.\\n *\\n * @memberOf _.templateSettings\\n * @type {Object}\\n */\\n 'imports': {\\n\\n /**\\n * A reference to the `lodash` function.\\n *\\n * @memberOf _.templateSettings.imports\\n * @type {Function}\\n */\\n '_': lodash\\n }\\n };\\n\\n // Ensure wrappers are instances of `baseLodash`.\\n lodash.prototype = baseLodash.prototype;\\n lodash.prototype.constructor = lodash;\\n\\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\\n LodashWrapper.prototype.constructor = LodashWrapper;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\\n *\\n * @private\\n * @constructor\\n * @param {*} value The value to wrap.\\n */\\n function LazyWrapper(value) {\\n this.__wrapped__ = value;\\n this.__actions__ = [];\\n this.__dir__ = 1;\\n this.__filtered__ = false;\\n this.__iteratees__ = [];\\n this.__takeCount__ = MAX_ARRAY_LENGTH;\\n this.__views__ = [];\\n }\\n\\n /**\\n * Creates a clone of the lazy wrapper object.\\n *\\n * @private\\n * @name clone\\n * @memberOf LazyWrapper\\n * @returns {Object} Returns the cloned `LazyWrapper` object.\\n */\\n function lazyClone() {\\n var result = new LazyWrapper(this.__wrapped__);\\n result.__actions__ = copyArray(this.__actions__);\\n result.__dir__ = this.__dir__;\\n result.__filtered__ = this.__filtered__;\\n result.__iteratees__ = copyArray(this.__iteratees__);\\n result.__takeCount__ = this.__takeCount__;\\n result.__views__ = copyArray(this.__views__);\\n return result;\\n }\\n\\n /**\\n * Reverses the direction of lazy iteration.\\n *\\n * @private\\n * @name reverse\\n * @memberOf LazyWrapper\\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\\n */\\n function lazyReverse() {\\n if (this.__filtered__) {\\n var result = new LazyWrapper(this);\\n result.__dir__ = -1;\\n result.__filtered__ = true;\\n } else {\\n result = this.clone();\\n result.__dir__ *= -1;\\n }\\n return result;\\n }\\n\\n /**\\n * Extracts the unwrapped value from its lazy wrapper.\\n *\\n * @private\\n * @name value\\n * @memberOf LazyWrapper\\n * @returns {*} Returns the unwrapped value.\\n */\\n function lazyValue() {\\n var array = this.__wrapped__.value(),\\n dir = this.__dir__,\\n isArr = isArray(array),\\n isRight = dir < 0,\\n arrLength = isArr ? array.length : 0,\\n view = getView(0, arrLength, this.__views__),\\n start = view.start,\\n end = view.end,\\n length = end - start,\\n index = isRight ? end : (start - 1),\\n iteratees = this.__iteratees__,\\n iterLength = iteratees.length,\\n resIndex = 0,\\n takeCount = nativeMin(length, this.__takeCount__);\\n\\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\\n return baseWrapperValue(array, this.__actions__);\\n }\\n var result = [];\\n\\n outer:\\n while (length-- && resIndex < takeCount) {\\n index += dir;\\n\\n var iterIndex = -1,\\n value = array[index];\\n\\n while (++iterIndex < iterLength) {\\n var data = iteratees[iterIndex],\\n iteratee = data.iteratee,\\n type = data.type,\\n computed = iteratee(value);\\n\\n if (type == LAZY_MAP_FLAG) {\\n value = computed;\\n } else if (!computed) {\\n if (type == LAZY_FILTER_FLAG) {\\n continue outer;\\n } else {\\n break outer;\\n }\\n }\\n }\\n result[resIndex++] = value;\\n }\\n return result;\\n }\\n\\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\\n LazyWrapper.prototype.constructor = LazyWrapper;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a hash object.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function Hash(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the hash.\\n *\\n * @private\\n * @name clear\\n * @memberOf Hash\\n */\\n function hashClear() {\\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the hash.\\n *\\n * @private\\n * @name delete\\n * @memberOf Hash\\n * @param {Object} hash The hash to modify.\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function hashDelete(key) {\\n var result = this.has(key) && delete this.__data__[key];\\n this.size -= result ? 1 : 0;\\n return result;\\n }\\n\\n /**\\n * Gets the hash value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf Hash\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function hashGet(key) {\\n var data = this.__data__;\\n if (nativeCreate) {\\n var result = data[key];\\n return result === HASH_UNDEFINED ? undefined : result;\\n }\\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\\n }\\n\\n /**\\n * Checks if a hash value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf Hash\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function hashHas(key) {\\n var data = this.__data__;\\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\\n }\\n\\n /**\\n * Sets the hash `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf Hash\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the hash instance.\\n */\\n function hashSet(key, value) {\\n var data = this.__data__;\\n this.size += this.has(key) ? 0 : 1;\\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\\n return this;\\n }\\n\\n // Add methods to `Hash`.\\n Hash.prototype.clear = hashClear;\\n Hash.prototype['delete'] = hashDelete;\\n Hash.prototype.get = hashGet;\\n Hash.prototype.has = hashHas;\\n Hash.prototype.set = hashSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an list cache object.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function ListCache(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the list cache.\\n *\\n * @private\\n * @name clear\\n * @memberOf ListCache\\n */\\n function listCacheClear() {\\n this.__data__ = [];\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the list cache.\\n *\\n * @private\\n * @name delete\\n * @memberOf ListCache\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function listCacheDelete(key) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n if (index < 0) {\\n return false;\\n }\\n var lastIndex = data.length - 1;\\n if (index == lastIndex) {\\n data.pop();\\n } else {\\n splice.call(data, index, 1);\\n }\\n --this.size;\\n return true;\\n }\\n\\n /**\\n * Gets the list cache value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf ListCache\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function listCacheGet(key) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n return index < 0 ? undefined : data[index][1];\\n }\\n\\n /**\\n * Checks if a list cache value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf ListCache\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function listCacheHas(key) {\\n return assocIndexOf(this.__data__, key) > -1;\\n }\\n\\n /**\\n * Sets the list cache `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf ListCache\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the list cache instance.\\n */\\n function listCacheSet(key, value) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n if (index < 0) {\\n ++this.size;\\n data.push([key, value]);\\n } else {\\n data[index][1] = value;\\n }\\n return this;\\n }\\n\\n // Add methods to `ListCache`.\\n ListCache.prototype.clear = listCacheClear;\\n ListCache.prototype['delete'] = listCacheDelete;\\n ListCache.prototype.get = listCacheGet;\\n ListCache.prototype.has = listCacheHas;\\n ListCache.prototype.set = listCacheSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a map cache object to store key-value pairs.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function MapCache(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the map.\\n *\\n * @private\\n * @name clear\\n * @memberOf MapCache\\n */\\n function mapCacheClear() {\\n this.size = 0;\\n this.__data__ = {\\n 'hash': new Hash,\\n 'map': new (Map || ListCache),\\n 'string': new Hash\\n };\\n }\\n\\n /**\\n * Removes `key` and its value from the map.\\n *\\n * @private\\n * @name delete\\n * @memberOf MapCache\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function mapCacheDelete(key) {\\n var result = getMapData(this, key)['delete'](key);\\n this.size -= result ? 1 : 0;\\n return result;\\n }\\n\\n /**\\n * Gets the map value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf MapCache\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function mapCacheGet(key) {\\n return getMapData(this, key).get(key);\\n }\\n\\n /**\\n * Checks if a map value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf MapCache\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function mapCacheHas(key) {\\n return getMapData(this, key).has(key);\\n }\\n\\n /**\\n * Sets the map `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf MapCache\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the map cache instance.\\n */\\n function mapCacheSet(key, value) {\\n var data = getMapData(this, key),\\n size = data.size;\\n\\n data.set(key, value);\\n this.size += data.size == size ? 0 : 1;\\n return this;\\n }\\n\\n // Add methods to `MapCache`.\\n MapCache.prototype.clear = mapCacheClear;\\n MapCache.prototype['delete'] = mapCacheDelete;\\n MapCache.prototype.get = mapCacheGet;\\n MapCache.prototype.has = mapCacheHas;\\n MapCache.prototype.set = mapCacheSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n *\\n * Creates an array cache object to store unique values.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [values] The values to cache.\\n */\\n function SetCache(values) {\\n var index = -1,\\n length = values == null ? 0 : values.length;\\n\\n this.__data__ = new MapCache;\\n while (++index < length) {\\n this.add(values[index]);\\n }\\n }\\n\\n /**\\n * Adds `value` to the array cache.\\n *\\n * @private\\n * @name add\\n * @memberOf SetCache\\n * @alias push\\n * @param {*} value The value to cache.\\n * @returns {Object} Returns the cache instance.\\n */\\n function setCacheAdd(value) {\\n this.__data__.set(value, HASH_UNDEFINED);\\n return this;\\n }\\n\\n /**\\n * Checks if `value` is in the array cache.\\n *\\n * @private\\n * @name has\\n * @memberOf SetCache\\n * @param {*} value The value to search for.\\n * @returns {number} Returns `true` if `value` is found, else `false`.\\n */\\n function setCacheHas(value) {\\n return this.__data__.has(value);\\n }\\n\\n // Add methods to `SetCache`.\\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\\n SetCache.prototype.has = setCacheHas;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a stack cache object to store key-value pairs.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function Stack(entries) {\\n var data = this.__data__ = new ListCache(entries);\\n this.size = data.size;\\n }\\n\\n /**\\n * Removes all key-value entries from the stack.\\n *\\n * @private\\n * @name clear\\n * @memberOf Stack\\n */\\n function stackClear() {\\n this.__data__ = new ListCache;\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the stack.\\n *\\n * @private\\n * @name delete\\n * @memberOf Stack\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function stackDelete(key) {\\n var data = this.__data__,\\n result = data['delete'](key);\\n\\n this.size = data.size;\\n return result;\\n }\\n\\n /**\\n * Gets the stack value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf Stack\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function stackGet(key) {\\n return this.__data__.get(key);\\n }\\n\\n /**\\n * Checks if a stack value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf Stack\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function stackHas(key) {\\n return this.__data__.has(key);\\n }\\n\\n /**\\n * Sets the stack `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf Stack\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the stack cache instance.\\n */\\n function stackSet(key, value) {\\n var data = this.__data__;\\n if (data instanceof ListCache) {\\n var pairs = data.__data__;\\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\\n pairs.push([key, value]);\\n this.size = ++data.size;\\n return this;\\n }\\n data = this.__data__ = new MapCache(pairs);\\n }\\n data.set(key, value);\\n this.size = data.size;\\n return this;\\n }\\n\\n // Add methods to `Stack`.\\n Stack.prototype.clear = stackClear;\\n Stack.prototype['delete'] = stackDelete;\\n Stack.prototype.get = stackGet;\\n Stack.prototype.has = stackHas;\\n Stack.prototype.set = stackSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an array of the enumerable property names of the array-like `value`.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @param {boolean} inherited Specify returning inherited property names.\\n * @returns {Array} Returns the array of property names.\\n */\\n function arrayLikeKeys(value, inherited) {\\n var isArr = isArray(value),\\n isArg = !isArr && isArguments(value),\\n isBuff = !isArr && !isArg && isBuffer(value),\\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\\n skipIndexes = isArr || isArg || isBuff || isType,\\n result = skipIndexes ? baseTimes(value.length, String) : [],\\n length = result.length;\\n\\n for (var key in value) {\\n if ((inherited || hasOwnProperty.call(value, key)) &&\\n !(skipIndexes && (\\n // Safari 9 has enumerable `arguments.length` in strict mode.\\n key == 'length' ||\\n // Node.js 0.10 has enumerable non-index properties on buffers.\\n (isBuff && (key == 'offset' || key == 'parent')) ||\\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\\n // Skip index properties.\\n isIndex(key, length)\\n ))) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.sample` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to sample.\\n * @returns {*} Returns the random element.\\n */\\n function arraySample(array) {\\n var length = array.length;\\n return length ? array[baseRandom(0, length - 1)] : undefined;\\n }\\n\\n /**\\n * A specialized version of `_.sampleSize` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to sample.\\n * @param {number} n The number of elements to sample.\\n * @returns {Array} Returns the random elements.\\n */\\n function arraySampleSize(array, n) {\\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\\n }\\n\\n /**\\n * A specialized version of `_.shuffle` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n */\\n function arrayShuffle(array) {\\n return shuffleSelf(copyArray(array));\\n }\\n\\n /**\\n * This function is like `assignValue` except that it doesn't assign\\n * `undefined` values.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function assignMergeValue(object, key, value) {\\n if ((value !== undefined && !eq(object[key], value)) ||\\n (value === undefined && !(key in object))) {\\n baseAssignValue(object, key, value);\\n }\\n }\\n\\n /**\\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function assignValue(object, key, value) {\\n var objValue = object[key];\\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\\n (value === undefined && !(key in object))) {\\n baseAssignValue(object, key, value);\\n }\\n }\\n\\n /**\\n * Gets the index at which the `key` is found in `array` of key-value pairs.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} key The key to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function assocIndexOf(array, key) {\\n var length = array.length;\\n while (length--) {\\n if (eq(array[length][0], key)) {\\n return length;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * Aggregates elements of `collection` on `accumulator` with keys transformed\\n * by `iteratee` and values set by `setter`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform keys.\\n * @param {Object} accumulator The initial aggregated object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function baseAggregator(collection, setter, iteratee, accumulator) {\\n baseEach(collection, function(value, key, collection) {\\n setter(accumulator, value, iteratee(value), collection);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.assign` without support for multiple sources\\n * or `customizer` functions.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @returns {Object} Returns `object`.\\n */\\n function baseAssign(object, source) {\\n return object && copyObject(source, keys(source), object);\\n }\\n\\n /**\\n * The base implementation of `_.assignIn` without support for multiple sources\\n * or `customizer` functions.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @returns {Object} Returns `object`.\\n */\\n function baseAssignIn(object, source) {\\n return object && copyObject(source, keysIn(source), object);\\n }\\n\\n /**\\n * The base implementation of `assignValue` and `assignMergeValue` without\\n * value checks.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function baseAssignValue(object, key, value) {\\n if (key == '__proto__' && defineProperty) {\\n defineProperty(object, key, {\\n 'configurable': true,\\n 'enumerable': true,\\n 'value': value,\\n 'writable': true\\n });\\n } else {\\n object[key] = value;\\n }\\n }\\n\\n /**\\n * The base implementation of `_.at` without support for individual paths.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {string[]} paths The property paths to pick.\\n * @returns {Array} Returns the picked elements.\\n */\\n function baseAt(object, paths) {\\n var index = -1,\\n length = paths.length,\\n result = Array(length),\\n skip = object == null;\\n\\n while (++index < length) {\\n result[index] = skip ? undefined : get(object, paths[index]);\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.clamp` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {number} number The number to clamp.\\n * @param {number} [lower] The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the clamped number.\\n */\\n function baseClamp(number, lower, upper) {\\n if (number === number) {\\n if (upper !== undefined) {\\n number = number <= upper ? number : upper;\\n }\\n if (lower !== undefined) {\\n number = number >= lower ? number : lower;\\n }\\n }\\n return number;\\n }\\n\\n /**\\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\\n * traversed objects.\\n *\\n * @private\\n * @param {*} value The value to clone.\\n * @param {boolean} bitmask The bitmask flags.\\n * 1 - Deep clone\\n * 2 - Flatten inherited properties\\n * 4 - Clone symbols\\n * @param {Function} [customizer] The function to customize cloning.\\n * @param {string} [key] The key of `value`.\\n * @param {Object} [object] The parent object of `value`.\\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\\n * @returns {*} Returns the cloned value.\\n */\\n function baseClone(value, bitmask, customizer, key, object, stack) {\\n var result,\\n isDeep = bitmask & CLONE_DEEP_FLAG,\\n isFlat = bitmask & CLONE_FLAT_FLAG,\\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\\n\\n if (customizer) {\\n result = object ? customizer(value, key, object, stack) : customizer(value);\\n }\\n if (result !== undefined) {\\n return result;\\n }\\n if (!isObject(value)) {\\n return value;\\n }\\n var isArr = isArray(value);\\n if (isArr) {\\n result = initCloneArray(value);\\n if (!isDeep) {\\n return copyArray(value, result);\\n }\\n } else {\\n var tag = getTag(value),\\n isFunc = tag == funcTag || tag == genTag;\\n\\n if (isBuffer(value)) {\\n return cloneBuffer(value, isDeep);\\n }\\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\\n if (!isDeep) {\\n return isFlat\\n ? copySymbolsIn(value, baseAssignIn(result, value))\\n : copySymbols(value, baseAssign(result, value));\\n }\\n } else {\\n if (!cloneableTags[tag]) {\\n return object ? value : {};\\n }\\n result = initCloneByTag(value, tag, baseClone, isDeep);\\n }\\n }\\n // Check for circular references and return its corresponding clone.\\n stack || (stack = new Stack);\\n var stacked = stack.get(value);\\n if (stacked) {\\n return stacked;\\n }\\n stack.set(value, result);\\n\\n var keysFunc = isFull\\n ? (isFlat ? getAllKeysIn : getAllKeys)\\n : (isFlat ? keysIn : keys);\\n\\n var props = isArr ? undefined : keysFunc(value);\\n arrayEach(props || value, function(subValue, key) {\\n if (props) {\\n key = subValue;\\n subValue = value[key];\\n }\\n // Recursively populate clone (susceptible to call stack limits).\\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.conforms` which doesn't clone `source`.\\n *\\n * @private\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseConforms(source) {\\n var props = keys(source);\\n return function(object) {\\n return baseConformsTo(object, source, props);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.conformsTo` which accepts `props` to check.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\\n */\\n function baseConformsTo(object, source, props) {\\n var length = props.length;\\n if (object == null) {\\n return !length;\\n }\\n object = Object(object);\\n while (length--) {\\n var key = props[length],\\n predicate = source[key],\\n value = object[key];\\n\\n if ((value === undefined && !(key in object)) || !predicate(value)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\\n * to provide to `func`.\\n *\\n * @private\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @param {Array} args The arguments to provide to `func`.\\n * @returns {number|Object} Returns the timer id or timeout object.\\n */\\n function baseDelay(func, wait, args) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n return setTimeout(function() { func.apply(undefined, args); }, wait);\\n }\\n\\n /**\\n * The base implementation of methods like `_.difference` without support\\n * for excluding multiple arrays or iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Array} values The values to exclude.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n */\\n function baseDifference(array, values, iteratee, comparator) {\\n var index = -1,\\n includes = arrayIncludes,\\n isCommon = true,\\n length = array.length,\\n result = [],\\n valuesLength = values.length;\\n\\n if (!length) {\\n return result;\\n }\\n if (iteratee) {\\n values = arrayMap(values, baseUnary(iteratee));\\n }\\n if (comparator) {\\n includes = arrayIncludesWith;\\n isCommon = false;\\n }\\n else if (values.length >= LARGE_ARRAY_SIZE) {\\n includes = cacheHas;\\n isCommon = false;\\n values = new SetCache(values);\\n }\\n outer:\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee == null ? value : iteratee(value);\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (isCommon && computed === computed) {\\n var valuesIndex = valuesLength;\\n while (valuesIndex--) {\\n if (values[valuesIndex] === computed) {\\n continue outer;\\n }\\n }\\n result.push(value);\\n }\\n else if (!includes(values, computed, comparator)) {\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.forEach` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n */\\n var baseEach = createBaseEach(baseForOwn);\\n\\n /**\\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n */\\n var baseEachRight = createBaseEach(baseForOwnRight, true);\\n\\n /**\\n * The base implementation of `_.every` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`\\n */\\n function baseEvery(collection, predicate) {\\n var result = true;\\n baseEach(collection, function(value, index, collection) {\\n result = !!predicate(value, index, collection);\\n return result;\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of methods like `_.max` and `_.min` which accepts a\\n * `comparator` to determine the extremum value.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The iteratee invoked per iteration.\\n * @param {Function} comparator The comparator used to compare values.\\n * @returns {*} Returns the extremum value.\\n */\\n function baseExtremum(array, iteratee, comparator) {\\n var index = -1,\\n length = array.length;\\n\\n while (++index < length) {\\n var value = array[index],\\n current = iteratee(value);\\n\\n if (current != null && (computed === undefined\\n ? (current === current && !isSymbol(current))\\n : comparator(current, computed)\\n )) {\\n var computed = current,\\n result = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.fill` without an iteratee call guard.\\n *\\n * @private\\n * @param {Array} array The array to fill.\\n * @param {*} value The value to fill `array` with.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns `array`.\\n */\\n function baseFill(array, value, start, end) {\\n var length = array.length;\\n\\n start = toInteger(start);\\n if (start < 0) {\\n start = -start > length ? 0 : (length + start);\\n }\\n end = (end === undefined || end > length) ? length : toInteger(end);\\n if (end < 0) {\\n end += length;\\n }\\n end = start > end ? 0 : toLength(end);\\n while (start < end) {\\n array[start++] = value;\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.filter` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n */\\n function baseFilter(collection, predicate) {\\n var result = [];\\n baseEach(collection, function(value, index, collection) {\\n if (predicate(value, index, collection)) {\\n result.push(value);\\n }\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.flatten` with support for restricting flattening.\\n *\\n * @private\\n * @param {Array} array The array to flatten.\\n * @param {number} depth The maximum recursion depth.\\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\\n * @param {Array} [result=[]] The initial result value.\\n * @returns {Array} Returns the new flattened array.\\n */\\n function baseFlatten(array, depth, predicate, isStrict, result) {\\n var index = -1,\\n length = array.length;\\n\\n predicate || (predicate = isFlattenable);\\n result || (result = []);\\n\\n while (++index < length) {\\n var value = array[index];\\n if (depth > 0 && predicate(value)) {\\n if (depth > 1) {\\n // Recursively flatten arrays (susceptible to call stack limits).\\n baseFlatten(value, depth - 1, predicate, isStrict, result);\\n } else {\\n arrayPush(result, value);\\n }\\n } else if (!isStrict) {\\n result[result.length] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `baseForOwn` which iterates over `object`\\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @returns {Object} Returns `object`.\\n */\\n var baseFor = createBaseFor();\\n\\n /**\\n * This function is like `baseFor` except that it iterates over properties\\n * in the opposite order.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @returns {Object} Returns `object`.\\n */\\n var baseForRight = createBaseFor(true);\\n\\n /**\\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n */\\n function baseForOwn(object, iteratee) {\\n return object && baseFor(object, iteratee, keys);\\n }\\n\\n /**\\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n */\\n function baseForOwnRight(object, iteratee) {\\n return object && baseForRight(object, iteratee, keys);\\n }\\n\\n /**\\n * The base implementation of `_.functions` which creates an array of\\n * `object` function property names filtered from `props`.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Array} props The property names to filter.\\n * @returns {Array} Returns the function names.\\n */\\n function baseFunctions(object, props) {\\n return arrayFilter(props, function(key) {\\n return isFunction(object[key]);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.get` without support for default values.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to get.\\n * @returns {*} Returns the resolved value.\\n */\\n function baseGet(object, path) {\\n path = castPath(path, object);\\n\\n var index = 0,\\n length = path.length;\\n\\n while (object != null && index < length) {\\n object = object[toKey(path[index++])];\\n }\\n return (index && index == length) ? object : undefined;\\n }\\n\\n /**\\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\\n * symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\\n var result = keysFunc(object);\\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\\n }\\n\\n /**\\n * The base implementation of `getTag` without fallbacks for buggy environments.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the `toStringTag`.\\n */\\n function baseGetTag(value) {\\n if (value == null) {\\n return value === undefined ? undefinedTag : nullTag;\\n }\\n return (symToStringTag && symToStringTag in Object(value))\\n ? getRawTag(value)\\n : objectToString(value);\\n }\\n\\n /**\\n * The base implementation of `_.gt` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\\n * else `false`.\\n */\\n function baseGt(value, other) {\\n return value > other;\\n }\\n\\n /**\\n * The base implementation of `_.has` without support for deep paths.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {Array|string} key The key to check.\\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\\n */\\n function baseHas(object, key) {\\n return object != null && hasOwnProperty.call(object, key);\\n }\\n\\n /**\\n * The base implementation of `_.hasIn` without support for deep paths.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {Array|string} key The key to check.\\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\\n */\\n function baseHasIn(object, key) {\\n return object != null && key in Object(object);\\n }\\n\\n /**\\n * The base implementation of `_.inRange` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {number} number The number to check.\\n * @param {number} start The start of the range.\\n * @param {number} end The end of the range.\\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\\n */\\n function baseInRange(number, start, end) {\\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\\n }\\n\\n /**\\n * The base implementation of methods like `_.intersection`, without support\\n * for iteratee shorthands, that accepts an array of arrays to inspect.\\n *\\n * @private\\n * @param {Array} arrays The arrays to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of shared values.\\n */\\n function baseIntersection(arrays, iteratee, comparator) {\\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\\n length = arrays[0].length,\\n othLength = arrays.length,\\n othIndex = othLength,\\n caches = Array(othLength),\\n maxLength = Infinity,\\n result = [];\\n\\n while (othIndex--) {\\n var array = arrays[othIndex];\\n if (othIndex && iteratee) {\\n array = arrayMap(array, baseUnary(iteratee));\\n }\\n maxLength = nativeMin(array.length, maxLength);\\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\\n ? new SetCache(othIndex && array)\\n : undefined;\\n }\\n array = arrays[0];\\n\\n var index = -1,\\n seen = caches[0];\\n\\n outer:\\n while (++index < length && result.length < maxLength) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (!(seen\\n ? cacheHas(seen, computed)\\n : includes(result, computed, comparator)\\n )) {\\n othIndex = othLength;\\n while (--othIndex) {\\n var cache = caches[othIndex];\\n if (!(cache\\n ? cacheHas(cache, computed)\\n : includes(arrays[othIndex], computed, comparator))\\n ) {\\n continue outer;\\n }\\n }\\n if (seen) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.invert` and `_.invertBy` which inverts\\n * `object` with values transformed by `iteratee` and set by `setter`.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform values.\\n * @param {Object} accumulator The initial inverted object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function baseInverter(object, setter, iteratee, accumulator) {\\n baseForOwn(object, function(value, key, object) {\\n setter(accumulator, iteratee(value), key, object);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.invoke` without support for individual\\n * method arguments.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the method to invoke.\\n * @param {Array} args The arguments to invoke the method with.\\n * @returns {*} Returns the result of the invoked method.\\n */\\n function baseInvoke(object, path, args) {\\n path = castPath(path, object);\\n object = parent(object, path);\\n var func = object == null ? object : object[toKey(last(path))];\\n return func == null ? undefined : apply(func, object, args);\\n }\\n\\n /**\\n * The base implementation of `_.isArguments`.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\\n */\\n function baseIsArguments(value) {\\n return isObjectLike(value) && baseGetTag(value) == argsTag;\\n }\\n\\n /**\\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\\n */\\n function baseIsArrayBuffer(value) {\\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\\n }\\n\\n /**\\n * The base implementation of `_.isDate` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\\n */\\n function baseIsDate(value) {\\n return isObjectLike(value) && baseGetTag(value) == dateTag;\\n }\\n\\n /**\\n * The base implementation of `_.isEqual` which supports partial comparisons\\n * and tracks traversed objects.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @param {boolean} bitmask The bitmask flags.\\n * 1 - Unordered comparison\\n * 2 - Partial comparison\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n */\\n function baseIsEqual(value, other, bitmask, customizer, stack) {\\n if (value === other) {\\n return true;\\n }\\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\\n return value !== value && other !== other;\\n }\\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\\n }\\n\\n /**\\n * A specialized version of `baseIsEqual` for arrays and objects which performs\\n * deep comparisons and tracks traversed objects enabling objects with circular\\n * references to be compared.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\\n var objIsArr = isArray(object),\\n othIsArr = isArray(other),\\n objTag = objIsArr ? arrayTag : getTag(object),\\n othTag = othIsArr ? arrayTag : getTag(other);\\n\\n objTag = objTag == argsTag ? objectTag : objTag;\\n othTag = othTag == argsTag ? objectTag : othTag;\\n\\n var objIsObj = objTag == objectTag,\\n othIsObj = othTag == objectTag,\\n isSameTag = objTag == othTag;\\n\\n if (isSameTag && isBuffer(object)) {\\n if (!isBuffer(other)) {\\n return false;\\n }\\n objIsArr = true;\\n objIsObj = false;\\n }\\n if (isSameTag && !objIsObj) {\\n stack || (stack = new Stack);\\n return (objIsArr || isTypedArray(object))\\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\\n }\\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\\n\\n if (objIsWrapped || othIsWrapped) {\\n var objUnwrapped = objIsWrapped ? object.value() : object,\\n othUnwrapped = othIsWrapped ? other.value() : other;\\n\\n stack || (stack = new Stack);\\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\\n }\\n }\\n if (!isSameTag) {\\n return false;\\n }\\n stack || (stack = new Stack);\\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\\n }\\n\\n /**\\n * The base implementation of `_.isMap` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\\n */\\n function baseIsMap(value) {\\n return isObjectLike(value) && getTag(value) == mapTag;\\n }\\n\\n /**\\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @param {Array} matchData The property names, values, and compare flags to match.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n */\\n function baseIsMatch(object, source, matchData, customizer) {\\n var index = matchData.length,\\n length = index,\\n noCustomizer = !customizer;\\n\\n if (object == null) {\\n return !length;\\n }\\n object = Object(object);\\n while (index--) {\\n var data = matchData[index];\\n if ((noCustomizer && data[2])\\n ? data[1] !== object[data[0]]\\n : !(data[0] in object)\\n ) {\\n return false;\\n }\\n }\\n while (++index < length) {\\n data = matchData[index];\\n var key = data[0],\\n objValue = object[key],\\n srcValue = data[1];\\n\\n if (noCustomizer && data[2]) {\\n if (objValue === undefined && !(key in object)) {\\n return false;\\n }\\n } else {\\n var stack = new Stack;\\n if (customizer) {\\n var result = customizer(objValue, srcValue, key, object, source, stack);\\n }\\n if (!(result === undefined\\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\\n : result\\n )) {\\n return false;\\n }\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * The base implementation of `_.isNative` without bad shim checks.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a native function,\\n * else `false`.\\n */\\n function baseIsNative(value) {\\n if (!isObject(value) || isMasked(value)) {\\n return false;\\n }\\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\\n return pattern.test(toSource(value));\\n }\\n\\n /**\\n * The base implementation of `_.isRegExp` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\\n */\\n function baseIsRegExp(value) {\\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\\n }\\n\\n /**\\n * The base implementation of `_.isSet` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\\n */\\n function baseIsSet(value) {\\n return isObjectLike(value) && getTag(value) == setTag;\\n }\\n\\n /**\\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\\n */\\n function baseIsTypedArray(value) {\\n return isObjectLike(value) &&\\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\\n }\\n\\n /**\\n * The base implementation of `_.iteratee`.\\n *\\n * @private\\n * @param {*} [value=_.identity] The value to convert to an iteratee.\\n * @returns {Function} Returns the iteratee.\\n */\\n function baseIteratee(value) {\\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\\n if (typeof value == 'function') {\\n return value;\\n }\\n if (value == null) {\\n return identity;\\n }\\n if (typeof value == 'object') {\\n return isArray(value)\\n ? baseMatchesProperty(value[0], value[1])\\n : baseMatches(value);\\n }\\n return property(value);\\n }\\n\\n /**\\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function baseKeys(object) {\\n if (!isPrototype(object)) {\\n return nativeKeys(object);\\n }\\n var result = [];\\n for (var key in Object(object)) {\\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function baseKeysIn(object) {\\n if (!isObject(object)) {\\n return nativeKeysIn(object);\\n }\\n var isProto = isPrototype(object),\\n result = [];\\n\\n for (var key in object) {\\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.lt` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than `other`,\\n * else `false`.\\n */\\n function baseLt(value, other) {\\n return value < other;\\n }\\n\\n /**\\n * The base implementation of `_.map` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n */\\n function baseMap(collection, iteratee) {\\n var index = -1,\\n result = isArrayLike(collection) ? Array(collection.length) : [];\\n\\n baseEach(collection, function(value, key, collection) {\\n result[++index] = iteratee(value, key, collection);\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.matches` which doesn't clone `source`.\\n *\\n * @private\\n * @param {Object} source The object of property values to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseMatches(source) {\\n var matchData = getMatchData(source);\\n if (matchData.length == 1 && matchData[0][2]) {\\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\\n }\\n return function(object) {\\n return object === source || baseIsMatch(object, source, matchData);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\\n *\\n * @private\\n * @param {string} path The path of the property to get.\\n * @param {*} srcValue The value to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseMatchesProperty(path, srcValue) {\\n if (isKey(path) && isStrictComparable(srcValue)) {\\n return matchesStrictComparable(toKey(path), srcValue);\\n }\\n return function(object) {\\n var objValue = get(object, path);\\n return (objValue === undefined && objValue === srcValue)\\n ? hasIn(object, path)\\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.merge` without support for multiple sources.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @param {number} srcIndex The index of `source`.\\n * @param {Function} [customizer] The function to customize merged values.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n */\\n function baseMerge(object, source, srcIndex, customizer, stack) {\\n if (object === source) {\\n return;\\n }\\n baseFor(source, function(srcValue, key) {\\n if (isObject(srcValue)) {\\n stack || (stack = new Stack);\\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\\n }\\n else {\\n var newValue = customizer\\n ? customizer(object[key], srcValue, (key + ''), object, source, stack)\\n : undefined;\\n\\n if (newValue === undefined) {\\n newValue = srcValue;\\n }\\n assignMergeValue(object, key, newValue);\\n }\\n }, keysIn);\\n }\\n\\n /**\\n * A specialized version of `baseMerge` for arrays and objects which performs\\n * deep merges and tracks traversed objects enabling objects with circular\\n * references to be merged.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @param {string} key The key of the value to merge.\\n * @param {number} srcIndex The index of `source`.\\n * @param {Function} mergeFunc The function to merge values.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n */\\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\\n var objValue = object[key],\\n srcValue = source[key],\\n stacked = stack.get(srcValue);\\n\\n if (stacked) {\\n assignMergeValue(object, key, stacked);\\n return;\\n }\\n var newValue = customizer\\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\\n : undefined;\\n\\n var isCommon = newValue === undefined;\\n\\n if (isCommon) {\\n var isArr = isArray(srcValue),\\n isBuff = !isArr && isBuffer(srcValue),\\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\\n\\n newValue = srcValue;\\n if (isArr || isBuff || isTyped) {\\n if (isArray(objValue)) {\\n newValue = objValue;\\n }\\n else if (isArrayLikeObject(objValue)) {\\n newValue = copyArray(objValue);\\n }\\n else if (isBuff) {\\n isCommon = false;\\n newValue = cloneBuffer(srcValue, true);\\n }\\n else if (isTyped) {\\n isCommon = false;\\n newValue = cloneTypedArray(srcValue, true);\\n }\\n else {\\n newValue = [];\\n }\\n }\\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\\n newValue = objValue;\\n if (isArguments(objValue)) {\\n newValue = toPlainObject(objValue);\\n }\\n else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\\n newValue = initCloneObject(srcValue);\\n }\\n }\\n else {\\n isCommon = false;\\n }\\n }\\n if (isCommon) {\\n // Recursively merge objects and arrays (susceptible to call stack limits).\\n stack.set(srcValue, newValue);\\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\\n stack['delete'](srcValue);\\n }\\n assignMergeValue(object, key, newValue);\\n }\\n\\n /**\\n * The base implementation of `_.nth` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {Array} array The array to query.\\n * @param {number} n The index of the element to return.\\n * @returns {*} Returns the nth element of `array`.\\n */\\n function baseNth(array, n) {\\n var length = array.length;\\n if (!length) {\\n return;\\n }\\n n += n < 0 ? length : 0;\\n return isIndex(n, length) ? array[n] : undefined;\\n }\\n\\n /**\\n * The base implementation of `_.orderBy` without param guards.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\\n * @param {string[]} orders The sort orders of `iteratees`.\\n * @returns {Array} Returns the new sorted array.\\n */\\n function baseOrderBy(collection, iteratees, orders) {\\n var index = -1;\\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\\n\\n var result = baseMap(collection, function(value, key, collection) {\\n var criteria = arrayMap(iteratees, function(iteratee) {\\n return iteratee(value);\\n });\\n return { 'criteria': criteria, 'index': ++index, 'value': value };\\n });\\n\\n return baseSortBy(result, function(object, other) {\\n return compareMultiple(object, other, orders);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.pick` without support for individual\\n * property identifiers.\\n *\\n * @private\\n * @param {Object} object The source object.\\n * @param {string[]} paths The property paths to pick.\\n * @returns {Object} Returns the new object.\\n */\\n function basePick(object, paths) {\\n return basePickBy(object, paths, function(value, path) {\\n return hasIn(object, path);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The source object.\\n * @param {string[]} paths The property paths to pick.\\n * @param {Function} predicate The function invoked per property.\\n * @returns {Object} Returns the new object.\\n */\\n function basePickBy(object, paths, predicate) {\\n var index = -1,\\n length = paths.length,\\n result = {};\\n\\n while (++index < length) {\\n var path = paths[index],\\n value = baseGet(object, path);\\n\\n if (predicate(value, path)) {\\n baseSet(result, castPath(path, object), value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseProperty` which supports deep paths.\\n *\\n * @private\\n * @param {Array|string} path The path of the property to get.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function basePropertyDeep(path) {\\n return function(object) {\\n return baseGet(object, path);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.pullAllBy` without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns `array`.\\n */\\n function basePullAll(array, values, iteratee, comparator) {\\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\\n index = -1,\\n length = values.length,\\n seen = array;\\n\\n if (array === values) {\\n values = copyArray(values);\\n }\\n if (iteratee) {\\n seen = arrayMap(array, baseUnary(iteratee));\\n }\\n while (++index < length) {\\n var fromIndex = 0,\\n value = values[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\\n if (seen !== array) {\\n splice.call(seen, fromIndex, 1);\\n }\\n splice.call(array, fromIndex, 1);\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.pullAt` without support for individual\\n * indexes or capturing the removed elements.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {number[]} indexes The indexes of elements to remove.\\n * @returns {Array} Returns `array`.\\n */\\n function basePullAt(array, indexes) {\\n var length = array ? indexes.length : 0,\\n lastIndex = length - 1;\\n\\n while (length--) {\\n var index = indexes[length];\\n if (length == lastIndex || index !== previous) {\\n var previous = index;\\n if (isIndex(index)) {\\n splice.call(array, index, 1);\\n } else {\\n baseUnset(array, index);\\n }\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.random` without support for returning\\n * floating-point numbers.\\n *\\n * @private\\n * @param {number} lower The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the random number.\\n */\\n function baseRandom(lower, upper) {\\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\\n }\\n\\n /**\\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\\n * coerce arguments.\\n *\\n * @private\\n * @param {number} start The start of the range.\\n * @param {number} end The end of the range.\\n * @param {number} step The value to increment or decrement by.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Array} Returns the range of numbers.\\n */\\n function baseRange(start, end, step, fromRight) {\\n var index = -1,\\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\\n result = Array(length);\\n\\n while (length--) {\\n result[fromRight ? length : ++index] = start;\\n start += step;\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.repeat` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {string} string The string to repeat.\\n * @param {number} n The number of times to repeat the string.\\n * @returns {string} Returns the repeated string.\\n */\\n function baseRepeat(string, n) {\\n var result = '';\\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\\n return result;\\n }\\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\\n do {\\n if (n % 2) {\\n result += string;\\n }\\n n = nativeFloor(n / 2);\\n if (n) {\\n string += string;\\n }\\n } while (n);\\n\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @returns {Function} Returns the new function.\\n */\\n function baseRest(func, start) {\\n return setToString(overRest(func, start, identity), func + '');\\n }\\n\\n /**\\n * The base implementation of `_.sample`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to sample.\\n * @returns {*} Returns the random element.\\n */\\n function baseSample(collection) {\\n return arraySample(values(collection));\\n }\\n\\n /**\\n * The base implementation of `_.sampleSize` without param guards.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to sample.\\n * @param {number} n The number of elements to sample.\\n * @returns {Array} Returns the random elements.\\n */\\n function baseSampleSize(collection, n) {\\n var array = values(collection);\\n return shuffleSelf(array, baseClamp(n, 0, array.length));\\n }\\n\\n /**\\n * The base implementation of `_.set`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @param {Function} [customizer] The function to customize path creation.\\n * @returns {Object} Returns `object`.\\n */\\n function baseSet(object, path, value, customizer) {\\n if (!isObject(object)) {\\n return object;\\n }\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length,\\n lastIndex = length - 1,\\n nested = object;\\n\\n while (nested != null && ++index < length) {\\n var key = toKey(path[index]),\\n newValue = value;\\n\\n if (index != lastIndex) {\\n var objValue = nested[key];\\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\\n if (newValue === undefined) {\\n newValue = isObject(objValue)\\n ? objValue\\n : (isIndex(path[index + 1]) ? [] : {});\\n }\\n }\\n assignValue(nested, key, newValue);\\n nested = nested[key];\\n }\\n return object;\\n }\\n\\n /**\\n * The base implementation of `setData` without support for hot loop shorting.\\n *\\n * @private\\n * @param {Function} func The function to associate metadata with.\\n * @param {*} data The metadata.\\n * @returns {Function} Returns `func`.\\n */\\n var baseSetData = !metaMap ? identity : function(func, data) {\\n metaMap.set(func, data);\\n return func;\\n };\\n\\n /**\\n * The base implementation of `setToString` without support for hot loop shorting.\\n *\\n * @private\\n * @param {Function} func The function to modify.\\n * @param {Function} string The `toString` result.\\n * @returns {Function} Returns `func`.\\n */\\n var baseSetToString = !defineProperty ? identity : function(func, string) {\\n return defineProperty(func, 'toString', {\\n 'configurable': true,\\n 'enumerable': false,\\n 'value': constant(string),\\n 'writable': true\\n });\\n };\\n\\n /**\\n * The base implementation of `_.shuffle`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n */\\n function baseShuffle(collection) {\\n return shuffleSelf(values(collection));\\n }\\n\\n /**\\n * The base implementation of `_.slice` without an iteratee call guard.\\n *\\n * @private\\n * @param {Array} array The array to slice.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function baseSlice(array, start, end) {\\n var index = -1,\\n length = array.length;\\n\\n if (start < 0) {\\n start = -start > length ? 0 : (length + start);\\n }\\n end = end > length ? length : end;\\n if (end < 0) {\\n end += length;\\n }\\n length = start > end ? 0 : ((end - start) >>> 0);\\n start >>>= 0;\\n\\n var result = Array(length);\\n while (++index < length) {\\n result[index] = array[index + start];\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.some` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n */\\n function baseSome(collection, predicate) {\\n var result;\\n\\n baseEach(collection, function(value, index, collection) {\\n result = predicate(value, index, collection);\\n return !result;\\n });\\n return !!result;\\n }\\n\\n /**\\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\\n * performs a binary search of `array` to determine the index at which `value`\\n * should be inserted into `array` in order to maintain its sort order.\\n *\\n * @private\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n */\\n function baseSortedIndex(array, value, retHighest) {\\n var low = 0,\\n high = array == null ? low : array.length;\\n\\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\\n while (low < high) {\\n var mid = (low + high) >>> 1,\\n computed = array[mid];\\n\\n if (computed !== null && !isSymbol(computed) &&\\n (retHighest ? (computed <= value) : (computed < value))) {\\n low = mid + 1;\\n } else {\\n high = mid;\\n }\\n }\\n return high;\\n }\\n return baseSortedIndexBy(array, value, identity, retHighest);\\n }\\n\\n /**\\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\\n * which invokes `iteratee` for `value` and each element of `array` to compute\\n * their sort ranking. The iteratee is invoked with one argument; (value).\\n *\\n * @private\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} iteratee The iteratee invoked per element.\\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n */\\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\\n value = iteratee(value);\\n\\n var low = 0,\\n high = array == null ? 0 : array.length,\\n valIsNaN = value !== value,\\n valIsNull = value === null,\\n valIsSymbol = isSymbol(value),\\n valIsUndefined = value === undefined;\\n\\n while (low < high) {\\n var mid = nativeFloor((low + high) / 2),\\n computed = iteratee(array[mid]),\\n othIsDefined = computed !== undefined,\\n othIsNull = computed === null,\\n othIsReflexive = computed === computed,\\n othIsSymbol = isSymbol(computed);\\n\\n if (valIsNaN) {\\n var setLow = retHighest || othIsReflexive;\\n } else if (valIsUndefined) {\\n setLow = othIsReflexive && (retHighest || othIsDefined);\\n } else if (valIsNull) {\\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\\n } else if (valIsSymbol) {\\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\\n } else if (othIsNull || othIsSymbol) {\\n setLow = false;\\n } else {\\n setLow = retHighest ? (computed <= value) : (computed < value);\\n }\\n if (setLow) {\\n low = mid + 1;\\n } else {\\n high = mid;\\n }\\n }\\n return nativeMin(high, MAX_ARRAY_INDEX);\\n }\\n\\n /**\\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\\n * support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n */\\n function baseSortedUniq(array, iteratee) {\\n var index = -1,\\n length = array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n if (!index || !eq(computed, seen)) {\\n var seen = computed;\\n result[resIndex++] = value === 0 ? 0 : value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.toNumber` which doesn't ensure correct\\n * conversions of binary, hexadecimal, or octal string values.\\n *\\n * @private\\n * @param {*} value The value to process.\\n * @returns {number} Returns the number.\\n */\\n function baseToNumber(value) {\\n if (typeof value == 'number') {\\n return value;\\n }\\n if (isSymbol(value)) {\\n return NAN;\\n }\\n return +value;\\n }\\n\\n /**\\n * The base implementation of `_.toString` which doesn't convert nullish\\n * values to empty strings.\\n *\\n * @private\\n * @param {*} value The value to process.\\n * @returns {string} Returns the string.\\n */\\n function baseToString(value) {\\n // Exit early for strings to avoid a performance hit in some environments.\\n if (typeof value == 'string') {\\n return value;\\n }\\n if (isArray(value)) {\\n // Recursively convert values (susceptible to call stack limits).\\n return arrayMap(value, baseToString) + '';\\n }\\n if (isSymbol(value)) {\\n return symbolToString ? symbolToString.call(value) : '';\\n }\\n var result = (value + '');\\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\\n }\\n\\n /**\\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n */\\n function baseUniq(array, iteratee, comparator) {\\n var index = -1,\\n includes = arrayIncludes,\\n length = array.length,\\n isCommon = true,\\n result = [],\\n seen = result;\\n\\n if (comparator) {\\n isCommon = false;\\n includes = arrayIncludesWith;\\n }\\n else if (length >= LARGE_ARRAY_SIZE) {\\n var set = iteratee ? null : createSet(array);\\n if (set) {\\n return setToArray(set);\\n }\\n isCommon = false;\\n includes = cacheHas;\\n seen = new SetCache;\\n }\\n else {\\n seen = iteratee ? [] : result;\\n }\\n outer:\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (isCommon && computed === computed) {\\n var seenIndex = seen.length;\\n while (seenIndex--) {\\n if (seen[seenIndex] === computed) {\\n continue outer;\\n }\\n }\\n if (iteratee) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n else if (!includes(seen, computed, comparator)) {\\n if (seen !== result) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.unset`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The property path to unset.\\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\\n */\\n function baseUnset(object, path) {\\n path = castPath(path, object);\\n object = parent(object, path);\\n return object == null || delete object[toKey(last(path))];\\n }\\n\\n /**\\n * The base implementation of `_.update`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to update.\\n * @param {Function} updater The function to produce the updated value.\\n * @param {Function} [customizer] The function to customize path creation.\\n * @returns {Object} Returns `object`.\\n */\\n function baseUpdate(object, path, updater, customizer) {\\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\\n }\\n\\n /**\\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\\n * without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to query.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function baseWhile(array, predicate, isDrop, fromRight) {\\n var length = array.length,\\n index = fromRight ? length : -1;\\n\\n while ((fromRight ? index-- : ++index < length) &&\\n predicate(array[index], index, array)) {}\\n\\n return isDrop\\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\\n }\\n\\n /**\\n * The base implementation of `wrapperValue` which returns the result of\\n * performing a sequence of actions on the unwrapped `value`, where each\\n * successive action is supplied the return value of the previous.\\n *\\n * @private\\n * @param {*} value The unwrapped value.\\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\\n * @returns {*} Returns the resolved value.\\n */\\n function baseWrapperValue(value, actions) {\\n var result = value;\\n if (result instanceof LazyWrapper) {\\n result = result.value();\\n }\\n return arrayReduce(actions, function(result, action) {\\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\\n }, result);\\n }\\n\\n /**\\n * The base implementation of methods like `_.xor`, without support for\\n * iteratee shorthands, that accepts an array of arrays to inspect.\\n *\\n * @private\\n * @param {Array} arrays The arrays to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of values.\\n */\\n function baseXor(arrays, iteratee, comparator) {\\n var length = arrays.length;\\n if (length < 2) {\\n return length ? baseUniq(arrays[0]) : [];\\n }\\n var index = -1,\\n result = Array(length);\\n\\n while (++index < length) {\\n var array = arrays[index],\\n othIndex = -1;\\n\\n while (++othIndex < length) {\\n if (othIndex != index) {\\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\\n }\\n }\\n }\\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\\n }\\n\\n /**\\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\\n *\\n * @private\\n * @param {Array} props The property identifiers.\\n * @param {Array} values The property values.\\n * @param {Function} assignFunc The function to assign values.\\n * @returns {Object} Returns the new object.\\n */\\n function baseZipObject(props, values, assignFunc) {\\n var index = -1,\\n length = props.length,\\n valsLength = values.length,\\n result = {};\\n\\n while (++index < length) {\\n var value = index < valsLength ? values[index] : undefined;\\n assignFunc(result, props[index], value);\\n }\\n return result;\\n }\\n\\n /**\\n * Casts `value` to an empty array if it's not an array like object.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {Array|Object} Returns the cast array-like object.\\n */\\n function castArrayLikeObject(value) {\\n return isArrayLikeObject(value) ? value : [];\\n }\\n\\n /**\\n * Casts `value` to `identity` if it's not a function.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {Function} Returns cast function.\\n */\\n function castFunction(value) {\\n return typeof value == 'function' ? value : identity;\\n }\\n\\n /**\\n * Casts `value` to a path array if it's not one.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @param {Object} [object] The object to query keys on.\\n * @returns {Array} Returns the cast property path array.\\n */\\n function castPath(value, object) {\\n if (isArray(value)) {\\n return value;\\n }\\n return isKey(value, object) ? [value] : stringToPath(toString(value));\\n }\\n\\n /**\\n * A `baseRest` alias which can be replaced with `identity` by module\\n * replacement plugins.\\n *\\n * @private\\n * @type {Function}\\n * @param {Function} func The function to apply a rest parameter to.\\n * @returns {Function} Returns the new function.\\n */\\n var castRest = baseRest;\\n\\n /**\\n * Casts `array` to a slice if it's needed.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {number} start The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the cast slice.\\n */\\n function castSlice(array, start, end) {\\n var length = array.length;\\n end = end === undefined ? length : end;\\n return (!start && end >= length) ? array : baseSlice(array, start, end);\\n }\\n\\n /**\\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\\n *\\n * @private\\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\\n */\\n var clearTimeout = ctxClearTimeout || function(id) {\\n return root.clearTimeout(id);\\n };\\n\\n /**\\n * Creates a clone of `buffer`.\\n *\\n * @private\\n * @param {Buffer} buffer The buffer to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Buffer} Returns the cloned buffer.\\n */\\n function cloneBuffer(buffer, isDeep) {\\n if (isDeep) {\\n return buffer.slice();\\n }\\n var length = buffer.length,\\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\\n\\n buffer.copy(result);\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `arrayBuffer`.\\n *\\n * @private\\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\\n * @returns {ArrayBuffer} Returns the cloned array buffer.\\n */\\n function cloneArrayBuffer(arrayBuffer) {\\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `dataView`.\\n *\\n * @private\\n * @param {Object} dataView The data view to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned data view.\\n */\\n function cloneDataView(dataView, isDeep) {\\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\\n }\\n\\n /**\\n * Creates a clone of `map`.\\n *\\n * @private\\n * @param {Object} map The map to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned map.\\n */\\n function cloneMap(map, isDeep, cloneFunc) {\\n var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);\\n return arrayReduce(array, addMapEntry, new map.constructor);\\n }\\n\\n /**\\n * Creates a clone of `regexp`.\\n *\\n * @private\\n * @param {Object} regexp The regexp to clone.\\n * @returns {Object} Returns the cloned regexp.\\n */\\n function cloneRegExp(regexp) {\\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\\n result.lastIndex = regexp.lastIndex;\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `set`.\\n *\\n * @private\\n * @param {Object} set The set to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned set.\\n */\\n function cloneSet(set, isDeep, cloneFunc) {\\n var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);\\n return arrayReduce(array, addSetEntry, new set.constructor);\\n }\\n\\n /**\\n * Creates a clone of the `symbol` object.\\n *\\n * @private\\n * @param {Object} symbol The symbol object to clone.\\n * @returns {Object} Returns the cloned symbol object.\\n */\\n function cloneSymbol(symbol) {\\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\\n }\\n\\n /**\\n * Creates a clone of `typedArray`.\\n *\\n * @private\\n * @param {Object} typedArray The typed array to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned typed array.\\n */\\n function cloneTypedArray(typedArray, isDeep) {\\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\\n }\\n\\n /**\\n * Compares values to sort them in ascending order.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {number} Returns the sort order indicator for `value`.\\n */\\n function compareAscending(value, other) {\\n if (value !== other) {\\n var valIsDefined = value !== undefined,\\n valIsNull = value === null,\\n valIsReflexive = value === value,\\n valIsSymbol = isSymbol(value);\\n\\n var othIsDefined = other !== undefined,\\n othIsNull = other === null,\\n othIsReflexive = other === other,\\n othIsSymbol = isSymbol(other);\\n\\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\\n (valIsNull && othIsDefined && othIsReflexive) ||\\n (!valIsDefined && othIsReflexive) ||\\n !valIsReflexive) {\\n return 1;\\n }\\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\\n (othIsNull && valIsDefined && valIsReflexive) ||\\n (!othIsDefined && valIsReflexive) ||\\n !othIsReflexive) {\\n return -1;\\n }\\n }\\n return 0;\\n }\\n\\n /**\\n * Used by `_.orderBy` to compare multiple properties of a value to another\\n * and stable sort them.\\n *\\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\\n * specify an order of \\\"desc\\\" for descending or \\\"asc\\\" for ascending sort order\\n * of corresponding values.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {boolean[]|string[]} orders The order to sort by for each property.\\n * @returns {number} Returns the sort order indicator for `object`.\\n */\\n function compareMultiple(object, other, orders) {\\n var index = -1,\\n objCriteria = object.criteria,\\n othCriteria = other.criteria,\\n length = objCriteria.length,\\n ordersLength = orders.length;\\n\\n while (++index < length) {\\n var result = compareAscending(objCriteria[index], othCriteria[index]);\\n if (result) {\\n if (index >= ordersLength) {\\n return result;\\n }\\n var order = orders[index];\\n return result * (order == 'desc' ? -1 : 1);\\n }\\n }\\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\\n // that causes it, under certain circumstances, to provide the same value for\\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\\n // for more details.\\n //\\n // This also ensures a stable sort in V8 and other engines.\\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\\n return object.index - other.index;\\n }\\n\\n /**\\n * Creates an array that is the composition of partially applied arguments,\\n * placeholders, and provided arguments into a single array of arguments.\\n *\\n * @private\\n * @param {Array} args The provided arguments.\\n * @param {Array} partials The arguments to prepend to those provided.\\n * @param {Array} holders The `partials` placeholder indexes.\\n * @params {boolean} [isCurried] Specify composing for a curried function.\\n * @returns {Array} Returns the new array of composed arguments.\\n */\\n function composeArgs(args, partials, holders, isCurried) {\\n var argsIndex = -1,\\n argsLength = args.length,\\n holdersLength = holders.length,\\n leftIndex = -1,\\n leftLength = partials.length,\\n rangeLength = nativeMax(argsLength - holdersLength, 0),\\n result = Array(leftLength + rangeLength),\\n isUncurried = !isCurried;\\n\\n while (++leftIndex < leftLength) {\\n result[leftIndex] = partials[leftIndex];\\n }\\n while (++argsIndex < holdersLength) {\\n if (isUncurried || argsIndex < argsLength) {\\n result[holders[argsIndex]] = args[argsIndex];\\n }\\n }\\n while (rangeLength--) {\\n result[leftIndex++] = args[argsIndex++];\\n }\\n return result;\\n }\\n\\n /**\\n * This function is like `composeArgs` except that the arguments composition\\n * is tailored for `_.partialRight`.\\n *\\n * @private\\n * @param {Array} args The provided arguments.\\n * @param {Array} partials The arguments to append to those provided.\\n * @param {Array} holders The `partials` placeholder indexes.\\n * @params {boolean} [isCurried] Specify composing for a curried function.\\n * @returns {Array} Returns the new array of composed arguments.\\n */\\n function composeArgsRight(args, partials, holders, isCurried) {\\n var argsIndex = -1,\\n argsLength = args.length,\\n holdersIndex = -1,\\n holdersLength = holders.length,\\n rightIndex = -1,\\n rightLength = partials.length,\\n rangeLength = nativeMax(argsLength - holdersLength, 0),\\n result = Array(rangeLength + rightLength),\\n isUncurried = !isCurried;\\n\\n while (++argsIndex < rangeLength) {\\n result[argsIndex] = args[argsIndex];\\n }\\n var offset = argsIndex;\\n while (++rightIndex < rightLength) {\\n result[offset + rightIndex] = partials[rightIndex];\\n }\\n while (++holdersIndex < holdersLength) {\\n if (isUncurried || argsIndex < argsLength) {\\n result[offset + holders[holdersIndex]] = args[argsIndex++];\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Copies the values of `source` to `array`.\\n *\\n * @private\\n * @param {Array} source The array to copy values from.\\n * @param {Array} [array=[]] The array to copy values to.\\n * @returns {Array} Returns `array`.\\n */\\n function copyArray(source, array) {\\n var index = -1,\\n length = source.length;\\n\\n array || (array = Array(length));\\n while (++index < length) {\\n array[index] = source[index];\\n }\\n return array;\\n }\\n\\n /**\\n * Copies properties of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy properties from.\\n * @param {Array} props The property identifiers to copy.\\n * @param {Object} [object={}] The object to copy properties to.\\n * @param {Function} [customizer] The function to customize copied values.\\n * @returns {Object} Returns `object`.\\n */\\n function copyObject(source, props, object, customizer) {\\n var isNew = !object;\\n object || (object = {});\\n\\n var index = -1,\\n length = props.length;\\n\\n while (++index < length) {\\n var key = props[index];\\n\\n var newValue = customizer\\n ? customizer(object[key], source[key], key, object, source)\\n : undefined;\\n\\n if (newValue === undefined) {\\n newValue = source[key];\\n }\\n if (isNew) {\\n baseAssignValue(object, key, newValue);\\n } else {\\n assignValue(object, key, newValue);\\n }\\n }\\n return object;\\n }\\n\\n /**\\n * Copies own symbols of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy symbols from.\\n * @param {Object} [object={}] The object to copy symbols to.\\n * @returns {Object} Returns `object`.\\n */\\n function copySymbols(source, object) {\\n return copyObject(source, getSymbols(source), object);\\n }\\n\\n /**\\n * Copies own and inherited symbols of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy symbols from.\\n * @param {Object} [object={}] The object to copy symbols to.\\n * @returns {Object} Returns `object`.\\n */\\n function copySymbolsIn(source, object) {\\n return copyObject(source, getSymbolsIn(source), object);\\n }\\n\\n /**\\n * Creates a function like `_.groupBy`.\\n *\\n * @private\\n * @param {Function} setter The function to set accumulator values.\\n * @param {Function} [initializer] The accumulator object initializer.\\n * @returns {Function} Returns the new aggregator function.\\n */\\n function createAggregator(setter, initializer) {\\n return function(collection, iteratee) {\\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\\n accumulator = initializer ? initializer() : {};\\n\\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\\n };\\n }\\n\\n /**\\n * Creates a function like `_.assign`.\\n *\\n * @private\\n * @param {Function} assigner The function to assign values.\\n * @returns {Function} Returns the new assigner function.\\n */\\n function createAssigner(assigner) {\\n return baseRest(function(object, sources) {\\n var index = -1,\\n length = sources.length,\\n customizer = length > 1 ? sources[length - 1] : undefined,\\n guard = length > 2 ? sources[2] : undefined;\\n\\n customizer = (assigner.length > 3 && typeof customizer == 'function')\\n ? (length--, customizer)\\n : undefined;\\n\\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\\n customizer = length < 3 ? undefined : customizer;\\n length = 1;\\n }\\n object = Object(object);\\n while (++index < length) {\\n var source = sources[index];\\n if (source) {\\n assigner(object, source, index, customizer);\\n }\\n }\\n return object;\\n });\\n }\\n\\n /**\\n * Creates a `baseEach` or `baseEachRight` function.\\n *\\n * @private\\n * @param {Function} eachFunc The function to iterate over a collection.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new base function.\\n */\\n function createBaseEach(eachFunc, fromRight) {\\n return function(collection, iteratee) {\\n if (collection == null) {\\n return collection;\\n }\\n if (!isArrayLike(collection)) {\\n return eachFunc(collection, iteratee);\\n }\\n var length = collection.length,\\n index = fromRight ? length : -1,\\n iterable = Object(collection);\\n\\n while ((fromRight ? index-- : ++index < length)) {\\n if (iteratee(iterable[index], index, iterable) === false) {\\n break;\\n }\\n }\\n return collection;\\n };\\n }\\n\\n /**\\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new base function.\\n */\\n function createBaseFor(fromRight) {\\n return function(object, iteratee, keysFunc) {\\n var index = -1,\\n iterable = Object(object),\\n props = keysFunc(object),\\n length = props.length;\\n\\n while (length--) {\\n var key = props[fromRight ? length : ++index];\\n if (iteratee(iterable[key], key, iterable) === false) {\\n break;\\n }\\n }\\n return object;\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with the optional `this`\\n * binding of `thisArg`.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createBind(func, bitmask, thisArg) {\\n var isBind = bitmask & WRAP_BIND_FLAG,\\n Ctor = createCtor(func);\\n\\n function wrapper() {\\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n return fn.apply(isBind ? thisArg : this, arguments);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a function like `_.lowerFirst`.\\n *\\n * @private\\n * @param {string} methodName The name of the `String` case method to use.\\n * @returns {Function} Returns the new case function.\\n */\\n function createCaseFirst(methodName) {\\n return function(string) {\\n string = toString(string);\\n\\n var strSymbols = hasUnicode(string)\\n ? stringToArray(string)\\n : undefined;\\n\\n var chr = strSymbols\\n ? strSymbols[0]\\n : string.charAt(0);\\n\\n var trailing = strSymbols\\n ? castSlice(strSymbols, 1).join('')\\n : string.slice(1);\\n\\n return chr[methodName]() + trailing;\\n };\\n }\\n\\n /**\\n * Creates a function like `_.camelCase`.\\n *\\n * @private\\n * @param {Function} callback The function to combine each word.\\n * @returns {Function} Returns the new compounder function.\\n */\\n function createCompounder(callback) {\\n return function(string) {\\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\\n };\\n }\\n\\n /**\\n * Creates a function that produces an instance of `Ctor` regardless of\\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\\n *\\n * @private\\n * @param {Function} Ctor The constructor to wrap.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createCtor(Ctor) {\\n return function() {\\n // Use a `switch` statement to work with class constructors. See\\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\\n // for more details.\\n var args = arguments;\\n switch (args.length) {\\n case 0: return new Ctor;\\n case 1: return new Ctor(args[0]);\\n case 2: return new Ctor(args[0], args[1]);\\n case 3: return new Ctor(args[0], args[1], args[2]);\\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\\n }\\n var thisBinding = baseCreate(Ctor.prototype),\\n result = Ctor.apply(thisBinding, args);\\n\\n // Mimic the constructor's `return` behavior.\\n // See https://es5.github.io/#x13.2.2 for more details.\\n return isObject(result) ? result : thisBinding;\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to enable currying.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {number} arity The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createCurry(func, bitmask, arity) {\\n var Ctor = createCtor(func);\\n\\n function wrapper() {\\n var length = arguments.length,\\n args = Array(length),\\n index = length,\\n placeholder = getHolder(wrapper);\\n\\n while (index--) {\\n args[index] = arguments[index];\\n }\\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\\n ? []\\n : replaceHolders(args, placeholder);\\n\\n length -= holders.length;\\n if (length < arity) {\\n return createRecurry(\\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\\n args, holders, undefined, undefined, arity - length);\\n }\\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n return apply(fn, this, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a `_.find` or `_.findLast` function.\\n *\\n * @private\\n * @param {Function} findIndexFunc The function to find the collection index.\\n * @returns {Function} Returns the new find function.\\n */\\n function createFind(findIndexFunc) {\\n return function(collection, predicate, fromIndex) {\\n var iterable = Object(collection);\\n if (!isArrayLike(collection)) {\\n var iteratee = getIteratee(predicate, 3);\\n collection = keys(collection);\\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\\n }\\n var index = findIndexFunc(collection, predicate, fromIndex);\\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\\n };\\n }\\n\\n /**\\n * Creates a `_.flow` or `_.flowRight` function.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new flow function.\\n */\\n function createFlow(fromRight) {\\n return flatRest(function(funcs) {\\n var length = funcs.length,\\n index = length,\\n prereq = LodashWrapper.prototype.thru;\\n\\n if (fromRight) {\\n funcs.reverse();\\n }\\n while (index--) {\\n var func = funcs[index];\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\\n var wrapper = new LodashWrapper([], true);\\n }\\n }\\n index = wrapper ? index : length;\\n while (++index < length) {\\n func = funcs[index];\\n\\n var funcName = getFuncName(func),\\n data = funcName == 'wrapper' ? getData(func) : undefined;\\n\\n if (data && isLaziable(data[0]) &&\\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\\n !data[4].length && data[9] == 1\\n ) {\\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\\n } else {\\n wrapper = (func.length == 1 && isLaziable(func))\\n ? wrapper[funcName]()\\n : wrapper.thru(func);\\n }\\n }\\n return function() {\\n var args = arguments,\\n value = args[0];\\n\\n if (wrapper && args.length == 1 && isArray(value)) {\\n return wrapper.plant(value).value();\\n }\\n var index = 0,\\n result = length ? funcs[index].apply(this, args) : value;\\n\\n while (++index < length) {\\n result = funcs[index].call(this, result);\\n }\\n return result;\\n };\\n });\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with optional `this`\\n * binding of `thisArg`, partial application, and currying.\\n *\\n * @private\\n * @param {Function|string} func The function or method name to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to prepend to those provided to\\n * the new function.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [partialsRight] The arguments to append to those provided\\n * to the new function.\\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\\n var isAry = bitmask & WRAP_ARY_FLAG,\\n isBind = bitmask & WRAP_BIND_FLAG,\\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\\n isFlip = bitmask & WRAP_FLIP_FLAG,\\n Ctor = isBindKey ? undefined : createCtor(func);\\n\\n function wrapper() {\\n var length = arguments.length,\\n args = Array(length),\\n index = length;\\n\\n while (index--) {\\n args[index] = arguments[index];\\n }\\n if (isCurried) {\\n var placeholder = getHolder(wrapper),\\n holdersCount = countHolders(args, placeholder);\\n }\\n if (partials) {\\n args = composeArgs(args, partials, holders, isCurried);\\n }\\n if (partialsRight) {\\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\\n }\\n length -= holdersCount;\\n if (isCurried && length < arity) {\\n var newHolders = replaceHolders(args, placeholder);\\n return createRecurry(\\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\\n args, newHolders, argPos, ary, arity - length\\n );\\n }\\n var thisBinding = isBind ? thisArg : this,\\n fn = isBindKey ? thisBinding[func] : func;\\n\\n length = args.length;\\n if (argPos) {\\n args = reorder(args, argPos);\\n } else if (isFlip && length > 1) {\\n args.reverse();\\n }\\n if (isAry && ary < length) {\\n args.length = ary;\\n }\\n if (this && this !== root && this instanceof wrapper) {\\n fn = Ctor || createCtor(fn);\\n }\\n return fn.apply(thisBinding, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a function like `_.invertBy`.\\n *\\n * @private\\n * @param {Function} setter The function to set accumulator values.\\n * @param {Function} toIteratee The function to resolve iteratees.\\n * @returns {Function} Returns the new inverter function.\\n */\\n function createInverter(setter, toIteratee) {\\n return function(object, iteratee) {\\n return baseInverter(object, setter, toIteratee(iteratee), {});\\n };\\n }\\n\\n /**\\n * Creates a function that performs a mathematical operation on two values.\\n *\\n * @private\\n * @param {Function} operator The function to perform the operation.\\n * @param {number} [defaultValue] The value used for `undefined` arguments.\\n * @returns {Function} Returns the new mathematical operation function.\\n */\\n function createMathOperation(operator, defaultValue) {\\n return function(value, other) {\\n var result;\\n if (value === undefined && other === undefined) {\\n return defaultValue;\\n }\\n if (value !== undefined) {\\n result = value;\\n }\\n if (other !== undefined) {\\n if (result === undefined) {\\n return other;\\n }\\n if (typeof value == 'string' || typeof other == 'string') {\\n value = baseToString(value);\\n other = baseToString(other);\\n } else {\\n value = baseToNumber(value);\\n other = baseToNumber(other);\\n }\\n result = operator(value, other);\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Creates a function like `_.over`.\\n *\\n * @private\\n * @param {Function} arrayFunc The function to iterate over iteratees.\\n * @returns {Function} Returns the new over function.\\n */\\n function createOver(arrayFunc) {\\n return flatRest(function(iteratees) {\\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\\n return baseRest(function(args) {\\n var thisArg = this;\\n return arrayFunc(iteratees, function(iteratee) {\\n return apply(iteratee, thisArg, args);\\n });\\n });\\n });\\n }\\n\\n /**\\n * Creates the padding for `string` based on `length`. The `chars` string\\n * is truncated if the number of characters exceeds `length`.\\n *\\n * @private\\n * @param {number} length The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padding for `string`.\\n */\\n function createPadding(length, chars) {\\n chars = chars === undefined ? ' ' : baseToString(chars);\\n\\n var charsLength = chars.length;\\n if (charsLength < 2) {\\n return charsLength ? baseRepeat(chars, length) : chars;\\n }\\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\\n return hasUnicode(chars)\\n ? castSlice(stringToArray(result), 0, length).join('')\\n : result.slice(0, length);\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with the `this` binding\\n * of `thisArg` and `partials` prepended to the arguments it receives.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {Array} partials The arguments to prepend to those provided to\\n * the new function.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createPartial(func, bitmask, thisArg, partials) {\\n var isBind = bitmask & WRAP_BIND_FLAG,\\n Ctor = createCtor(func);\\n\\n function wrapper() {\\n var argsIndex = -1,\\n argsLength = arguments.length,\\n leftIndex = -1,\\n leftLength = partials.length,\\n args = Array(leftLength + argsLength),\\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n\\n while (++leftIndex < leftLength) {\\n args[leftIndex] = partials[leftIndex];\\n }\\n while (argsLength--) {\\n args[leftIndex++] = arguments[++argsIndex];\\n }\\n return apply(fn, isBind ? thisArg : this, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a `_.range` or `_.rangeRight` function.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new range function.\\n */\\n function createRange(fromRight) {\\n return function(start, end, step) {\\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\\n end = step = undefined;\\n }\\n // Ensure the sign of `-0` is preserved.\\n start = toFinite(start);\\n if (end === undefined) {\\n end = start;\\n start = 0;\\n } else {\\n end = toFinite(end);\\n }\\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\\n return baseRange(start, end, step, fromRight);\\n };\\n }\\n\\n /**\\n * Creates a function that performs a relational operation on two values.\\n *\\n * @private\\n * @param {Function} operator The function to perform the operation.\\n * @returns {Function} Returns the new relational operation function.\\n */\\n function createRelationalOperation(operator) {\\n return function(value, other) {\\n if (!(typeof value == 'string' && typeof other == 'string')) {\\n value = toNumber(value);\\n other = toNumber(other);\\n }\\n return operator(value, other);\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to continue currying.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {Function} wrapFunc The function to create the `func` wrapper.\\n * @param {*} placeholder The placeholder value.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to prepend to those provided to\\n * the new function.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\\n var isCurry = bitmask & WRAP_CURRY_FLAG,\\n newHolders = isCurry ? holders : undefined,\\n newHoldersRight = isCurry ? undefined : holders,\\n newPartials = isCurry ? partials : undefined,\\n newPartialsRight = isCurry ? undefined : partials;\\n\\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\\n\\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\\n }\\n var newData = [\\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\\n newHoldersRight, argPos, ary, arity\\n ];\\n\\n var result = wrapFunc.apply(undefined, newData);\\n if (isLaziable(func)) {\\n setData(result, newData);\\n }\\n result.placeholder = placeholder;\\n return setWrapToString(result, func, bitmask);\\n }\\n\\n /**\\n * Creates a function like `_.round`.\\n *\\n * @private\\n * @param {string} methodName The name of the `Math` method to use when rounding.\\n * @returns {Function} Returns the new round function.\\n */\\n function createRound(methodName) {\\n var func = Math[methodName];\\n return function(number, precision) {\\n number = toNumber(number);\\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\\n if (precision) {\\n // Shift with exponential notation to avoid floating-point issues.\\n // See [MDN](https://mdn.io/round#Examples) for more details.\\n var pair = (toString(number) + 'e').split('e'),\\n value = func(pair[0] + 'e' + (+pair[1] + precision));\\n\\n pair = (toString(value) + 'e').split('e');\\n return +(pair[0] + 'e' + (+pair[1] - precision));\\n }\\n return func(number);\\n };\\n }\\n\\n /**\\n * Creates a set object of `values`.\\n *\\n * @private\\n * @param {Array} values The values to add to the set.\\n * @returns {Object} Returns the new set.\\n */\\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\\n return new Set(values);\\n };\\n\\n /**\\n * Creates a `_.toPairs` or `_.toPairsIn` function.\\n *\\n * @private\\n * @param {Function} keysFunc The function to get the keys of a given object.\\n * @returns {Function} Returns the new pairs function.\\n */\\n function createToPairs(keysFunc) {\\n return function(object) {\\n var tag = getTag(object);\\n if (tag == mapTag) {\\n return mapToArray(object);\\n }\\n if (tag == setTag) {\\n return setToPairs(object);\\n }\\n return baseToPairs(object, keysFunc(object));\\n };\\n }\\n\\n /**\\n * Creates a function that either curries or invokes `func` with optional\\n * `this` binding and partially applied arguments.\\n *\\n * @private\\n * @param {Function|string} func The function or method name to wrap.\\n * @param {number} bitmask The bitmask flags.\\n * 1 - `_.bind`\\n * 2 - `_.bindKey`\\n * 4 - `_.curry` or `_.curryRight` of a bound function\\n * 8 - `_.curry`\\n * 16 - `_.curryRight`\\n * 32 - `_.partial`\\n * 64 - `_.partialRight`\\n * 128 - `_.rearg`\\n * 256 - `_.ary`\\n * 512 - `_.flip`\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to be partially applied.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\\n if (!isBindKey && typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n var length = partials ? partials.length : 0;\\n if (!length) {\\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\\n partials = holders = undefined;\\n }\\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\\n arity = arity === undefined ? arity : toInteger(arity);\\n length -= holders ? holders.length : 0;\\n\\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\\n var partialsRight = partials,\\n holdersRight = holders;\\n\\n partials = holders = undefined;\\n }\\n var data = isBindKey ? undefined : getData(func);\\n\\n var newData = [\\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\\n argPos, ary, arity\\n ];\\n\\n if (data) {\\n mergeData(newData, data);\\n }\\n func = newData[0];\\n bitmask = newData[1];\\n thisArg = newData[2];\\n partials = newData[3];\\n holders = newData[4];\\n arity = newData[9] = newData[9] === undefined\\n ? (isBindKey ? 0 : func.length)\\n : nativeMax(newData[9] - length, 0);\\n\\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\\n }\\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\\n var result = createBind(func, bitmask, thisArg);\\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\\n result = createCurry(func, bitmask, arity);\\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\\n result = createPartial(func, bitmask, thisArg, partials);\\n } else {\\n result = createHybrid.apply(undefined, newData);\\n }\\n var setter = data ? baseSetData : setData;\\n return setWrapToString(setter(result, newData), func, bitmask);\\n }\\n\\n /**\\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\\n * of source objects to the destination object for all destination properties\\n * that resolve to `undefined`.\\n *\\n * @private\\n * @param {*} objValue The destination value.\\n * @param {*} srcValue The source value.\\n * @param {string} key The key of the property to assign.\\n * @param {Object} object The parent object of `objValue`.\\n * @returns {*} Returns the value to assign.\\n */\\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\\n if (objValue === undefined ||\\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\\n return srcValue;\\n }\\n return objValue;\\n }\\n\\n /**\\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\\n * objects into destination objects that are passed thru.\\n *\\n * @private\\n * @param {*} objValue The destination value.\\n * @param {*} srcValue The source value.\\n * @param {string} key The key of the property to merge.\\n * @param {Object} object The parent object of `objValue`.\\n * @param {Object} source The parent object of `srcValue`.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n * @returns {*} Returns the value to assign.\\n */\\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\\n if (isObject(objValue) && isObject(srcValue)) {\\n // Recursively merge objects and arrays (susceptible to call stack limits).\\n stack.set(srcValue, objValue);\\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\\n stack['delete'](srcValue);\\n }\\n return objValue;\\n }\\n\\n /**\\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\\n * objects.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @param {string} key The key of the property to inspect.\\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\\n */\\n function customOmitClone(value) {\\n return isPlainObject(value) ? undefined : value;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for arrays with support for\\n * partial deep comparisons.\\n *\\n * @private\\n * @param {Array} array The array to compare.\\n * @param {Array} other The other array to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `array` and `other` objects.\\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\\n */\\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\\n arrLength = array.length,\\n othLength = other.length;\\n\\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\\n return false;\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(array);\\n if (stacked && stack.get(other)) {\\n return stacked == other;\\n }\\n var index = -1,\\n result = true,\\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\\n\\n stack.set(array, other);\\n stack.set(other, array);\\n\\n // Ignore non-index properties.\\n while (++index < arrLength) {\\n var arrValue = array[index],\\n othValue = other[index];\\n\\n if (customizer) {\\n var compared = isPartial\\n ? customizer(othValue, arrValue, index, other, array, stack)\\n : customizer(arrValue, othValue, index, array, other, stack);\\n }\\n if (compared !== undefined) {\\n if (compared) {\\n continue;\\n }\\n result = false;\\n break;\\n }\\n // Recursively compare arrays (susceptible to call stack limits).\\n if (seen) {\\n if (!arraySome(other, function(othValue, othIndex) {\\n if (!cacheHas(seen, othIndex) &&\\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\\n return seen.push(othIndex);\\n }\\n })) {\\n result = false;\\n break;\\n }\\n } else if (!(\\n arrValue === othValue ||\\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\\n )) {\\n result = false;\\n break;\\n }\\n }\\n stack['delete'](array);\\n stack['delete'](other);\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for comparing objects of\\n * the same `toStringTag`.\\n *\\n * **Note:** This function only supports comparing values with tags of\\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {string} tag The `toStringTag` of the objects to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\\n switch (tag) {\\n case dataViewTag:\\n if ((object.byteLength != other.byteLength) ||\\n (object.byteOffset != other.byteOffset)) {\\n return false;\\n }\\n object = object.buffer;\\n other = other.buffer;\\n\\n case arrayBufferTag:\\n if ((object.byteLength != other.byteLength) ||\\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\\n return false;\\n }\\n return true;\\n\\n case boolTag:\\n case dateTag:\\n case numberTag:\\n // Coerce booleans to `1` or `0` and dates to milliseconds.\\n // Invalid dates are coerced to `NaN`.\\n return eq(+object, +other);\\n\\n case errorTag:\\n return object.name == other.name && object.message == other.message;\\n\\n case regexpTag:\\n case stringTag:\\n // Coerce regexes to strings and treat strings, primitives and objects,\\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\\n // for more details.\\n return object == (other + '');\\n\\n case mapTag:\\n var convert = mapToArray;\\n\\n case setTag:\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\\n convert || (convert = setToArray);\\n\\n if (object.size != other.size && !isPartial) {\\n return false;\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(object);\\n if (stacked) {\\n return stacked == other;\\n }\\n bitmask |= COMPARE_UNORDERED_FLAG;\\n\\n // Recursively compare objects (susceptible to call stack limits).\\n stack.set(object, other);\\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\\n stack['delete'](object);\\n return result;\\n\\n case symbolTag:\\n if (symbolValueOf) {\\n return symbolValueOf.call(object) == symbolValueOf.call(other);\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for objects with support for\\n * partial deep comparisons.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\\n objProps = getAllKeys(object),\\n objLength = objProps.length,\\n othProps = getAllKeys(other),\\n othLength = othProps.length;\\n\\n if (objLength != othLength && !isPartial) {\\n return false;\\n }\\n var index = objLength;\\n while (index--) {\\n var key = objProps[index];\\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\\n return false;\\n }\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(object);\\n if (stacked && stack.get(other)) {\\n return stacked == other;\\n }\\n var result = true;\\n stack.set(object, other);\\n stack.set(other, object);\\n\\n var skipCtor = isPartial;\\n while (++index < objLength) {\\n key = objProps[index];\\n var objValue = object[key],\\n othValue = other[key];\\n\\n if (customizer) {\\n var compared = isPartial\\n ? customizer(othValue, objValue, key, other, object, stack)\\n : customizer(objValue, othValue, key, object, other, stack);\\n }\\n // Recursively compare objects (susceptible to call stack limits).\\n if (!(compared === undefined\\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\\n : compared\\n )) {\\n result = false;\\n break;\\n }\\n skipCtor || (skipCtor = key == 'constructor');\\n }\\n if (result && !skipCtor) {\\n var objCtor = object.constructor,\\n othCtor = other.constructor;\\n\\n // Non `Object` object instances with different constructors are not equal.\\n if (objCtor != othCtor &&\\n ('constructor' in object && 'constructor' in other) &&\\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\\n result = false;\\n }\\n }\\n stack['delete'](object);\\n stack['delete'](other);\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseRest` which flattens the rest array.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @returns {Function} Returns the new function.\\n */\\n function flatRest(func) {\\n return setToString(overRest(func, undefined, flatten), func + '');\\n }\\n\\n /**\\n * Creates an array of own enumerable property names and symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function getAllKeys(object) {\\n return baseGetAllKeys(object, keys, getSymbols);\\n }\\n\\n /**\\n * Creates an array of own and inherited enumerable property names and\\n * symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function getAllKeysIn(object) {\\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\\n }\\n\\n /**\\n * Gets metadata for `func`.\\n *\\n * @private\\n * @param {Function} func The function to query.\\n * @returns {*} Returns the metadata for `func`.\\n */\\n var getData = !metaMap ? noop : function(func) {\\n return metaMap.get(func);\\n };\\n\\n /**\\n * Gets the name of `func`.\\n *\\n * @private\\n * @param {Function} func The function to query.\\n * @returns {string} Returns the function name.\\n */\\n function getFuncName(func) {\\n var result = (func.name + ''),\\n array = realNames[result],\\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\\n\\n while (length--) {\\n var data = array[length],\\n otherFunc = data.func;\\n if (otherFunc == null || otherFunc == func) {\\n return data.name;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the argument placeholder value for `func`.\\n *\\n * @private\\n * @param {Function} func The function to inspect.\\n * @returns {*} Returns the placeholder value.\\n */\\n function getHolder(func) {\\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\\n return object.placeholder;\\n }\\n\\n /**\\n * Gets the appropriate \\\"iteratee\\\" function. If `_.iteratee` is customized,\\n * this function returns the custom method, otherwise it returns `baseIteratee`.\\n * If arguments are provided, the chosen function is invoked with them and\\n * its result is returned.\\n *\\n * @private\\n * @param {*} [value] The value to convert to an iteratee.\\n * @param {number} [arity] The arity of the created iteratee.\\n * @returns {Function} Returns the chosen function or its result.\\n */\\n function getIteratee() {\\n var result = lodash.iteratee || iteratee;\\n result = result === iteratee ? baseIteratee : result;\\n return arguments.length ? result(arguments[0], arguments[1]) : result;\\n }\\n\\n /**\\n * Gets the data for `map`.\\n *\\n * @private\\n * @param {Object} map The map to query.\\n * @param {string} key The reference key.\\n * @returns {*} Returns the map data.\\n */\\n function getMapData(map, key) {\\n var data = map.__data__;\\n return isKeyable(key)\\n ? data[typeof key == 'string' ? 'string' : 'hash']\\n : data.map;\\n }\\n\\n /**\\n * Gets the property names, values, and compare flags of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the match data of `object`.\\n */\\n function getMatchData(object) {\\n var result = keys(object),\\n length = result.length;\\n\\n while (length--) {\\n var key = result[length],\\n value = object[key];\\n\\n result[length] = [key, value, isStrictComparable(value)];\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the native function at `key` of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {string} key The key of the method to get.\\n * @returns {*} Returns the function if it's native, else `undefined`.\\n */\\n function getNative(object, key) {\\n var value = getValue(object, key);\\n return baseIsNative(value) ? value : undefined;\\n }\\n\\n /**\\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the raw `toStringTag`.\\n */\\n function getRawTag(value) {\\n var isOwn = hasOwnProperty.call(value, symToStringTag),\\n tag = value[symToStringTag];\\n\\n try {\\n value[symToStringTag] = undefined;\\n var unmasked = true;\\n } catch (e) {}\\n\\n var result = nativeObjectToString.call(value);\\n if (unmasked) {\\n if (isOwn) {\\n value[symToStringTag] = tag;\\n } else {\\n delete value[symToStringTag];\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Creates an array of the own enumerable symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of symbols.\\n */\\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\\n if (object == null) {\\n return [];\\n }\\n object = Object(object);\\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\\n return propertyIsEnumerable.call(object, symbol);\\n });\\n };\\n\\n /**\\n * Creates an array of the own and inherited enumerable symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of symbols.\\n */\\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\\n var result = [];\\n while (object) {\\n arrayPush(result, getSymbols(object));\\n object = getPrototype(object);\\n }\\n return result;\\n };\\n\\n /**\\n * Gets the `toStringTag` of `value`.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the `toStringTag`.\\n */\\n var getTag = baseGetTag;\\n\\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\\n (Map && getTag(new Map) != mapTag) ||\\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\\n (Set && getTag(new Set) != setTag) ||\\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\\n getTag = function(value) {\\n var result = baseGetTag(value),\\n Ctor = result == objectTag ? value.constructor : undefined,\\n ctorString = Ctor ? toSource(Ctor) : '';\\n\\n if (ctorString) {\\n switch (ctorString) {\\n case dataViewCtorString: return dataViewTag;\\n case mapCtorString: return mapTag;\\n case promiseCtorString: return promiseTag;\\n case setCtorString: return setTag;\\n case weakMapCtorString: return weakMapTag;\\n }\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\\n *\\n * @private\\n * @param {number} start The start of the view.\\n * @param {number} end The end of the view.\\n * @param {Array} transforms The transformations to apply to the view.\\n * @returns {Object} Returns an object containing the `start` and `end`\\n * positions of the view.\\n */\\n function getView(start, end, transforms) {\\n var index = -1,\\n length = transforms.length;\\n\\n while (++index < length) {\\n var data = transforms[index],\\n size = data.size;\\n\\n switch (data.type) {\\n case 'drop': start += size; break;\\n case 'dropRight': end -= size; break;\\n case 'take': end = nativeMin(end, start + size); break;\\n case 'takeRight': start = nativeMax(start, end - size); break;\\n }\\n }\\n return { 'start': start, 'end': end };\\n }\\n\\n /**\\n * Extracts wrapper details from the `source` body comment.\\n *\\n * @private\\n * @param {string} source The source to inspect.\\n * @returns {Array} Returns the wrapper details.\\n */\\n function getWrapDetails(source) {\\n var match = source.match(reWrapDetails);\\n return match ? match[1].split(reSplitDetails) : [];\\n }\\n\\n /**\\n * Checks if `path` exists on `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @param {Function} hasFunc The function to check properties.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n */\\n function hasPath(object, path, hasFunc) {\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length,\\n result = false;\\n\\n while (++index < length) {\\n var key = toKey(path[index]);\\n if (!(result = object != null && hasFunc(object, key))) {\\n break;\\n }\\n object = object[key];\\n }\\n if (result || ++index != length) {\\n return result;\\n }\\n length = object == null ? 0 : object.length;\\n return !!length && isLength(length) && isIndex(key, length) &&\\n (isArray(object) || isArguments(object));\\n }\\n\\n /**\\n * Initializes an array clone.\\n *\\n * @private\\n * @param {Array} array The array to clone.\\n * @returns {Array} Returns the initialized clone.\\n */\\n function initCloneArray(array) {\\n var length = array.length,\\n result = array.constructor(length);\\n\\n // Add properties assigned by `RegExp#exec`.\\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\\n result.index = array.index;\\n result.input = array.input;\\n }\\n return result;\\n }\\n\\n /**\\n * Initializes an object clone.\\n *\\n * @private\\n * @param {Object} object The object to clone.\\n * @returns {Object} Returns the initialized clone.\\n */\\n function initCloneObject(object) {\\n return (typeof object.constructor == 'function' && !isPrototype(object))\\n ? baseCreate(getPrototype(object))\\n : {};\\n }\\n\\n /**\\n * Initializes an object clone based on its `toStringTag`.\\n *\\n * **Note:** This function only supports cloning values with tags of\\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\\n *\\n * @private\\n * @param {Object} object The object to clone.\\n * @param {string} tag The `toStringTag` of the object to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the initialized clone.\\n */\\n function initCloneByTag(object, tag, cloneFunc, isDeep) {\\n var Ctor = object.constructor;\\n switch (tag) {\\n case arrayBufferTag:\\n return cloneArrayBuffer(object);\\n\\n case boolTag:\\n case dateTag:\\n return new Ctor(+object);\\n\\n case dataViewTag:\\n return cloneDataView(object, isDeep);\\n\\n case float32Tag: case float64Tag:\\n case int8Tag: case int16Tag: case int32Tag:\\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\\n return cloneTypedArray(object, isDeep);\\n\\n case mapTag:\\n return cloneMap(object, isDeep, cloneFunc);\\n\\n case numberTag:\\n case stringTag:\\n return new Ctor(object);\\n\\n case regexpTag:\\n return cloneRegExp(object);\\n\\n case setTag:\\n return cloneSet(object, isDeep, cloneFunc);\\n\\n case symbolTag:\\n return cloneSymbol(object);\\n }\\n }\\n\\n /**\\n * Inserts wrapper `details` in a comment at the top of the `source` body.\\n *\\n * @private\\n * @param {string} source The source to modify.\\n * @returns {Array} details The details to insert.\\n * @returns {string} Returns the modified source.\\n */\\n function insertWrapDetails(source, details) {\\n var length = details.length;\\n if (!length) {\\n return source;\\n }\\n var lastIndex = length - 1;\\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\\n details = details.join(length > 2 ? ', ' : ' ');\\n return source.replace(reWrapComment, '{\\\\n/* [wrapped with ' + details + '] */\\\\n');\\n }\\n\\n /**\\n * Checks if `value` is a flattenable `arguments` object or array.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\\n */\\n function isFlattenable(value) {\\n return isArray(value) || isArguments(value) ||\\n !!(spreadableSymbol && value && value[spreadableSymbol]);\\n }\\n\\n /**\\n * Checks if `value` is a valid array-like index.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\\n */\\n function isIndex(value, length) {\\n length = length == null ? MAX_SAFE_INTEGER : length;\\n return !!length &&\\n (typeof value == 'number' || reIsUint.test(value)) &&\\n (value > -1 && value % 1 == 0 && value < length);\\n }\\n\\n /**\\n * Checks if the given arguments are from an iteratee call.\\n *\\n * @private\\n * @param {*} value The potential iteratee value argument.\\n * @param {*} index The potential iteratee index or key argument.\\n * @param {*} object The potential iteratee object argument.\\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\\n * else `false`.\\n */\\n function isIterateeCall(value, index, object) {\\n if (!isObject(object)) {\\n return false;\\n }\\n var type = typeof index;\\n if (type == 'number'\\n ? (isArrayLike(object) && isIndex(index, object.length))\\n : (type == 'string' && index in object)\\n ) {\\n return eq(object[index], value);\\n }\\n return false;\\n }\\n\\n /**\\n * Checks if `value` is a property name and not a property path.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @param {Object} [object] The object to query keys on.\\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\\n */\\n function isKey(value, object) {\\n if (isArray(value)) {\\n return false;\\n }\\n var type = typeof value;\\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\\n value == null || isSymbol(value)) {\\n return true;\\n }\\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\\n (object != null && value in Object(object));\\n }\\n\\n /**\\n * Checks if `value` is suitable for use as unique object key.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\\n */\\n function isKeyable(value) {\\n var type = typeof value;\\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\\n ? (value !== '__proto__')\\n : (value === null);\\n }\\n\\n /**\\n * Checks if `func` has a lazy counterpart.\\n *\\n * @private\\n * @param {Function} func The function to check.\\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\\n * else `false`.\\n */\\n function isLaziable(func) {\\n var funcName = getFuncName(func),\\n other = lodash[funcName];\\n\\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\\n return false;\\n }\\n if (func === other) {\\n return true;\\n }\\n var data = getData(other);\\n return !!data && func === data[0];\\n }\\n\\n /**\\n * Checks if `func` has its source masked.\\n *\\n * @private\\n * @param {Function} func The function to check.\\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\\n */\\n function isMasked(func) {\\n return !!maskSrcKey && (maskSrcKey in func);\\n }\\n\\n /**\\n * Checks if `func` is capable of being masked.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\\n */\\n var isMaskable = coreJsData ? isFunction : stubFalse;\\n\\n /**\\n * Checks if `value` is likely a prototype object.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\\n */\\n function isPrototype(value) {\\n var Ctor = value && value.constructor,\\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\\n\\n return value === proto;\\n }\\n\\n /**\\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` if suitable for strict\\n * equality comparisons, else `false`.\\n */\\n function isStrictComparable(value) {\\n return value === value && !isObject(value);\\n }\\n\\n /**\\n * A specialized version of `matchesProperty` for source values suitable\\n * for strict equality comparisons, i.e. `===`.\\n *\\n * @private\\n * @param {string} key The key of the property to get.\\n * @param {*} srcValue The value to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function matchesStrictComparable(key, srcValue) {\\n return function(object) {\\n if (object == null) {\\n return false;\\n }\\n return object[key] === srcValue &&\\n (srcValue !== undefined || (key in Object(object)));\\n };\\n }\\n\\n /**\\n * A specialized version of `_.memoize` which clears the memoized function's\\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\\n *\\n * @private\\n * @param {Function} func The function to have its output memoized.\\n * @returns {Function} Returns the new memoized function.\\n */\\n function memoizeCapped(func) {\\n var result = memoize(func, function(key) {\\n if (cache.size === MAX_MEMOIZE_SIZE) {\\n cache.clear();\\n }\\n return key;\\n });\\n\\n var cache = result.cache;\\n return result;\\n }\\n\\n /**\\n * Merges the function metadata of `source` into `data`.\\n *\\n * Merging metadata reduces the number of wrappers used to invoke a function.\\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\\n * may be applied regardless of execution order. Methods like `_.ary` and\\n * `_.rearg` modify function arguments, making the order in which they are\\n * executed important, preventing the merging of metadata. However, we make\\n * an exception for a safe combined case where curried functions have `_.ary`\\n * and or `_.rearg` applied.\\n *\\n * @private\\n * @param {Array} data The destination metadata.\\n * @param {Array} source The source metadata.\\n * @returns {Array} Returns `data`.\\n */\\n function mergeData(data, source) {\\n var bitmask = data[1],\\n srcBitmask = source[1],\\n newBitmask = bitmask | srcBitmask,\\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\\n\\n var isCombo =\\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\\n\\n // Exit early if metadata can't be merged.\\n if (!(isCommon || isCombo)) {\\n return data;\\n }\\n // Use source `thisArg` if available.\\n if (srcBitmask & WRAP_BIND_FLAG) {\\n data[2] = source[2];\\n // Set when currying a bound function.\\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\\n }\\n // Compose partial arguments.\\n var value = source[3];\\n if (value) {\\n var partials = data[3];\\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\\n }\\n // Compose partial right arguments.\\n value = source[5];\\n if (value) {\\n partials = data[5];\\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\\n }\\n // Use source `argPos` if available.\\n value = source[7];\\n if (value) {\\n data[7] = value;\\n }\\n // Use source `ary` if it's smaller.\\n if (srcBitmask & WRAP_ARY_FLAG) {\\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\\n }\\n // Use source `arity` if one is not provided.\\n if (data[9] == null) {\\n data[9] = source[9];\\n }\\n // Use source `func` and merge bitmasks.\\n data[0] = source[0];\\n data[1] = newBitmask;\\n\\n return data;\\n }\\n\\n /**\\n * This function is like\\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\\n * except that it includes inherited enumerable properties.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function nativeKeysIn(object) {\\n var result = [];\\n if (object != null) {\\n for (var key in Object(object)) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `value` to a string using `Object.prototype.toString`.\\n *\\n * @private\\n * @param {*} value The value to convert.\\n * @returns {string} Returns the converted string.\\n */\\n function objectToString(value) {\\n return nativeObjectToString.call(value);\\n }\\n\\n /**\\n * A specialized version of `baseRest` which transforms the rest array.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @param {Function} transform The rest array transform.\\n * @returns {Function} Returns the new function.\\n */\\n function overRest(func, start, transform) {\\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\\n return function() {\\n var args = arguments,\\n index = -1,\\n length = nativeMax(args.length - start, 0),\\n array = Array(length);\\n\\n while (++index < length) {\\n array[index] = args[start + index];\\n }\\n index = -1;\\n var otherArgs = Array(start + 1);\\n while (++index < start) {\\n otherArgs[index] = args[index];\\n }\\n otherArgs[start] = transform(array);\\n return apply(func, this, otherArgs);\\n };\\n }\\n\\n /**\\n * Gets the parent value at `path` of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} path The path to get the parent value of.\\n * @returns {*} Returns the parent value.\\n */\\n function parent(object, path) {\\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\\n }\\n\\n /**\\n * Reorder `array` according to the specified indexes where the element at\\n * the first index is assigned as the first element, the element at\\n * the second index is assigned as the second element, and so on.\\n *\\n * @private\\n * @param {Array} array The array to reorder.\\n * @param {Array} indexes The arranged array indexes.\\n * @returns {Array} Returns `array`.\\n */\\n function reorder(array, indexes) {\\n var arrLength = array.length,\\n length = nativeMin(indexes.length, arrLength),\\n oldArray = copyArray(array);\\n\\n while (length--) {\\n var index = indexes[length];\\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\\n }\\n return array;\\n }\\n\\n /**\\n * Sets metadata for `func`.\\n *\\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\\n * period of time, it will trip its breaker and transition to an identity\\n * function to avoid garbage collection pauses in V8. See\\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\\n * for more details.\\n *\\n * @private\\n * @param {Function} func The function to associate metadata with.\\n * @param {*} data The metadata.\\n * @returns {Function} Returns `func`.\\n */\\n var setData = shortOut(baseSetData);\\n\\n /**\\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\\n *\\n * @private\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @returns {number|Object} Returns the timer id or timeout object.\\n */\\n var setTimeout = ctxSetTimeout || function(func, wait) {\\n return root.setTimeout(func, wait);\\n };\\n\\n /**\\n * Sets the `toString` method of `func` to return `string`.\\n *\\n * @private\\n * @param {Function} func The function to modify.\\n * @param {Function} string The `toString` result.\\n * @returns {Function} Returns `func`.\\n */\\n var setToString = shortOut(baseSetToString);\\n\\n /**\\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\\n * with wrapper details in a comment at the top of the source body.\\n *\\n * @private\\n * @param {Function} wrapper The function to modify.\\n * @param {Function} reference The reference function.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @returns {Function} Returns `wrapper`.\\n */\\n function setWrapToString(wrapper, reference, bitmask) {\\n var source = (reference + '');\\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\\n }\\n\\n /**\\n * Creates a function that'll short out and invoke `identity` instead\\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\\n * milliseconds.\\n *\\n * @private\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new shortable function.\\n */\\n function shortOut(func) {\\n var count = 0,\\n lastCalled = 0;\\n\\n return function() {\\n var stamp = nativeNow(),\\n remaining = HOT_SPAN - (stamp - lastCalled);\\n\\n lastCalled = stamp;\\n if (remaining > 0) {\\n if (++count >= HOT_COUNT) {\\n return arguments[0];\\n }\\n } else {\\n count = 0;\\n }\\n return func.apply(undefined, arguments);\\n };\\n }\\n\\n /**\\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\\n *\\n * @private\\n * @param {Array} array The array to shuffle.\\n * @param {number} [size=array.length] The size of `array`.\\n * @returns {Array} Returns `array`.\\n */\\n function shuffleSelf(array, size) {\\n var index = -1,\\n length = array.length,\\n lastIndex = length - 1;\\n\\n size = size === undefined ? length : size;\\n while (++index < size) {\\n var rand = baseRandom(index, lastIndex),\\n value = array[rand];\\n\\n array[rand] = array[index];\\n array[index] = value;\\n }\\n array.length = size;\\n return array;\\n }\\n\\n /**\\n * Converts `string` to a property path array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the property path array.\\n */\\n var stringToPath = memoizeCapped(function(string) {\\n var result = [];\\n if (reLeadingDot.test(string)) {\\n result.push('');\\n }\\n string.replace(rePropName, function(match, number, quote, string) {\\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\\n });\\n return result;\\n });\\n\\n /**\\n * Converts `value` to a string key if it's not a string or symbol.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {string|symbol} Returns the key.\\n */\\n function toKey(value) {\\n if (typeof value == 'string' || isSymbol(value)) {\\n return value;\\n }\\n var result = (value + '');\\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\\n }\\n\\n /**\\n * Converts `func` to its source code.\\n *\\n * @private\\n * @param {Function} func The function to convert.\\n * @returns {string} Returns the source code.\\n */\\n function toSource(func) {\\n if (func != null) {\\n try {\\n return funcToString.call(func);\\n } catch (e) {}\\n try {\\n return (func + '');\\n } catch (e) {}\\n }\\n return '';\\n }\\n\\n /**\\n * Updates wrapper `details` based on `bitmask` flags.\\n *\\n * @private\\n * @returns {Array} details The details to modify.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @returns {Array} Returns `details`.\\n */\\n function updateWrapDetails(details, bitmask) {\\n arrayEach(wrapFlags, function(pair) {\\n var value = '_.' + pair[0];\\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\\n details.push(value);\\n }\\n });\\n return details.sort();\\n }\\n\\n /**\\n * Creates a clone of `wrapper`.\\n *\\n * @private\\n * @param {Object} wrapper The wrapper to clone.\\n * @returns {Object} Returns the cloned wrapper.\\n */\\n function wrapperClone(wrapper) {\\n if (wrapper instanceof LazyWrapper) {\\n return wrapper.clone();\\n }\\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\\n result.__actions__ = copyArray(wrapper.__actions__);\\n result.__index__ = wrapper.__index__;\\n result.__values__ = wrapper.__values__;\\n return result;\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an array of elements split into groups the length of `size`.\\n * If `array` can't be split evenly, the final chunk will be the remaining\\n * elements.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to process.\\n * @param {number} [size=1] The length of each chunk\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the new array of chunks.\\n * @example\\n *\\n * _.chunk(['a', 'b', 'c', 'd'], 2);\\n * // => [['a', 'b'], ['c', 'd']]\\n *\\n * _.chunk(['a', 'b', 'c', 'd'], 3);\\n * // => [['a', 'b', 'c'], ['d']]\\n */\\n function chunk(array, size, guard) {\\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\\n size = 1;\\n } else {\\n size = nativeMax(toInteger(size), 0);\\n }\\n var length = array == null ? 0 : array.length;\\n if (!length || size < 1) {\\n return [];\\n }\\n var index = 0,\\n resIndex = 0,\\n result = Array(nativeCeil(length / size));\\n\\n while (index < length) {\\n result[resIndex++] = baseSlice(array, index, (index += size));\\n }\\n return result;\\n }\\n\\n /**\\n * Creates an array with all falsey values removed. The values `false`, `null`,\\n * `0`, `\\\"\\\"`, `undefined`, and `NaN` are falsey.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to compact.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.compact([0, 1, false, 2, '', 3]);\\n * // => [1, 2, 3]\\n */\\n function compact(array) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (value) {\\n result[resIndex++] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Creates a new array concatenating `array` with any additional arrays\\n * and/or values.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to concatenate.\\n * @param {...*} [values] The values to concatenate.\\n * @returns {Array} Returns the new concatenated array.\\n * @example\\n *\\n * var array = [1];\\n * var other = _.concat(array, 2, [3], [[4]]);\\n *\\n * console.log(other);\\n * // => [1, 2, 3, [4]]\\n *\\n * console.log(array);\\n * // => [1]\\n */\\n function concat() {\\n var length = arguments.length;\\n if (!length) {\\n return [];\\n }\\n var args = Array(length - 1),\\n array = arguments[0],\\n index = length;\\n\\n while (index--) {\\n args[index - 1] = arguments[index];\\n }\\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\\n }\\n\\n /**\\n * Creates an array of `array` values not included in the other given arrays\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. The order and references of result values are\\n * determined by the first array.\\n *\\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.without, _.xor\\n * @example\\n *\\n * _.difference([2, 1], [2, 3]);\\n * // => [1]\\n */\\n var difference = baseRest(function(array, values) {\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.difference` except that it accepts `iteratee` which\\n * is invoked for each element of `array` and `values` to generate the criterion\\n * by which they're compared. The order and references of result values are\\n * determined by the first array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\\n * // => [{ 'x': 2 }]\\n */\\n var differenceBy = baseRest(function(array, values) {\\n var iteratee = last(values);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.difference` except that it accepts `comparator`\\n * which is invoked to compare elements of `array` to `values`. The order and\\n * references of result values are determined by the first array. The comparator\\n * is invoked with two arguments: (arrVal, othVal).\\n *\\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n *\\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\\n * // => [{ 'x': 2, 'y': 1 }]\\n */\\n var differenceWith = baseRest(function(array, values) {\\n var comparator = last(values);\\n if (isArrayLikeObject(comparator)) {\\n comparator = undefined;\\n }\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\\n : [];\\n });\\n\\n /**\\n * Creates a slice of `array` with `n` elements dropped from the beginning.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to drop.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.drop([1, 2, 3]);\\n * // => [2, 3]\\n *\\n * _.drop([1, 2, 3], 2);\\n * // => [3]\\n *\\n * _.drop([1, 2, 3], 5);\\n * // => []\\n *\\n * _.drop([1, 2, 3], 0);\\n * // => [1, 2, 3]\\n */\\n function drop(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n return baseSlice(array, n < 0 ? 0 : n, length);\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements dropped from the end.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to drop.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.dropRight([1, 2, 3]);\\n * // => [1, 2]\\n *\\n * _.dropRight([1, 2, 3], 2);\\n * // => [1]\\n *\\n * _.dropRight([1, 2, 3], 5);\\n * // => []\\n *\\n * _.dropRight([1, 2, 3], 0);\\n * // => [1, 2, 3]\\n */\\n function dropRight(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n n = length - n;\\n return baseSlice(array, 0, n < 0 ? 0 : n);\\n }\\n\\n /**\\n * Creates a slice of `array` excluding elements dropped from the end.\\n * Elements are dropped until `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.dropRightWhile(users, function(o) { return !o.active; });\\n * // => objects for ['barney']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.dropRightWhile(users, ['active', false]);\\n * // => objects for ['barney']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.dropRightWhile(users, 'active');\\n * // => objects for ['barney', 'fred', 'pebbles']\\n */\\n function dropRightWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\\n : [];\\n }\\n\\n /**\\n * Creates a slice of `array` excluding elements dropped from the beginning.\\n * Elements are dropped until `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.dropWhile(users, function(o) { return !o.active; });\\n * // => objects for ['pebbles']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.dropWhile(users, ['active', false]);\\n * // => objects for ['pebbles']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.dropWhile(users, 'active');\\n * // => objects for ['barney', 'fred', 'pebbles']\\n */\\n function dropWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), true)\\n : [];\\n }\\n\\n /**\\n * Fills elements of `array` with `value` from `start` up to, but not\\n * including, `end`.\\n *\\n * **Note:** This method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.2.0\\n * @category Array\\n * @param {Array} array The array to fill.\\n * @param {*} value The value to fill `array` with.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _.fill(array, 'a');\\n * console.log(array);\\n * // => ['a', 'a', 'a']\\n *\\n * _.fill(Array(3), 2);\\n * // => [2, 2, 2]\\n *\\n * _.fill([4, 6, 8, 10], '*', 1, 3);\\n * // => [4, '*', '*', 10]\\n */\\n function fill(array, value, start, end) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\\n start = 0;\\n end = length;\\n }\\n return baseFill(array, value, start, end);\\n }\\n\\n /**\\n * This method is like `_.find` except that it returns the index of the first\\n * element `predicate` returns truthy for instead of the element itself.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {number} Returns the index of the found element, else `-1`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\\n * // => 0\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findIndex(users, { 'user': 'fred', 'active': false });\\n * // => 1\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findIndex(users, ['active', false]);\\n * // => 0\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findIndex(users, 'active');\\n * // => 2\\n */\\n function findIndex(array, predicate, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\\n if (index < 0) {\\n index = nativeMax(length + index, 0);\\n }\\n return baseFindIndex(array, getIteratee(predicate, 3), index);\\n }\\n\\n /**\\n * This method is like `_.findIndex` except that it iterates over elements\\n * of `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=array.length-1] The index to search from.\\n * @returns {number} Returns the index of the found element, else `-1`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\\n * // => 2\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\\n * // => 0\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findLastIndex(users, ['active', false]);\\n * // => 2\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findLastIndex(users, 'active');\\n * // => 0\\n */\\n function findLastIndex(array, predicate, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = length - 1;\\n if (fromIndex !== undefined) {\\n index = toInteger(fromIndex);\\n index = fromIndex < 0\\n ? nativeMax(length + index, 0)\\n : nativeMin(index, length - 1);\\n }\\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\\n }\\n\\n /**\\n * Flattens `array` a single level deep.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * _.flatten([1, [2, [3, [4]], 5]]);\\n * // => [1, 2, [3, [4]], 5]\\n */\\n function flatten(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseFlatten(array, 1) : [];\\n }\\n\\n /**\\n * Recursively flattens `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\\n * // => [1, 2, 3, 4, 5]\\n */\\n function flattenDeep(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseFlatten(array, INFINITY) : [];\\n }\\n\\n /**\\n * Recursively flatten `array` up to `depth` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.4.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @param {number} [depth=1] The maximum recursion depth.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * var array = [1, [2, [3, [4]], 5]];\\n *\\n * _.flattenDepth(array, 1);\\n * // => [1, 2, [3, [4]], 5]\\n *\\n * _.flattenDepth(array, 2);\\n * // => [1, 2, 3, [4], 5]\\n */\\n function flattenDepth(array, depth) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n depth = depth === undefined ? 1 : toInteger(depth);\\n return baseFlatten(array, depth);\\n }\\n\\n /**\\n * The inverse of `_.toPairs`; this method returns an object composed\\n * from key-value `pairs`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} pairs The key-value pairs.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.fromPairs([['a', 1], ['b', 2]]);\\n * // => { 'a': 1, 'b': 2 }\\n */\\n function fromPairs(pairs) {\\n var index = -1,\\n length = pairs == null ? 0 : pairs.length,\\n result = {};\\n\\n while (++index < length) {\\n var pair = pairs[index];\\n result[pair[0]] = pair[1];\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the first element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @alias first\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {*} Returns the first element of `array`.\\n * @example\\n *\\n * _.head([1, 2, 3]);\\n * // => 1\\n *\\n * _.head([]);\\n * // => undefined\\n */\\n function head(array) {\\n return (array && array.length) ? array[0] : undefined;\\n }\\n\\n /**\\n * Gets the index at which the first occurrence of `value` is found in `array`\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. If `fromIndex` is negative, it's used as the\\n * offset from the end of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.indexOf([1, 2, 1, 2], 2);\\n * // => 1\\n *\\n * // Search from the `fromIndex`.\\n * _.indexOf([1, 2, 1, 2], 2, 2);\\n * // => 3\\n */\\n function indexOf(array, value, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\\n if (index < 0) {\\n index = nativeMax(length + index, 0);\\n }\\n return baseIndexOf(array, value, index);\\n }\\n\\n /**\\n * Gets all but the last element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.initial([1, 2, 3]);\\n * // => [1, 2]\\n */\\n function initial(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseSlice(array, 0, -1) : [];\\n }\\n\\n /**\\n * Creates an array of unique values that are included in all given arrays\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. The order and references of result values are\\n * determined by the first array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * _.intersection([2, 1], [2, 3]);\\n * // => [2]\\n */\\n var intersection = baseRest(function(arrays) {\\n var mapped = arrayMap(arrays, castArrayLikeObject);\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped)\\n : [];\\n });\\n\\n /**\\n * This method is like `_.intersection` except that it accepts `iteratee`\\n * which is invoked for each element of each `arrays` to generate the criterion\\n * by which they're compared. The order and references of result values are\\n * determined by the first array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [2.1]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }]\\n */\\n var intersectionBy = baseRest(function(arrays) {\\n var iteratee = last(arrays),\\n mapped = arrayMap(arrays, castArrayLikeObject);\\n\\n if (iteratee === last(mapped)) {\\n iteratee = undefined;\\n } else {\\n mapped.pop();\\n }\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.intersection` except that it accepts `comparator`\\n * which is invoked to compare elements of `arrays`. The order and references\\n * of result values are determined by the first array. The comparator is\\n * invoked with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.intersectionWith(objects, others, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }]\\n */\\n var intersectionWith = baseRest(function(arrays) {\\n var comparator = last(arrays),\\n mapped = arrayMap(arrays, castArrayLikeObject);\\n\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n if (comparator) {\\n mapped.pop();\\n }\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped, undefined, comparator)\\n : [];\\n });\\n\\n /**\\n * Converts all elements in `array` into a string separated by `separator`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to convert.\\n * @param {string} [separator=','] The element separator.\\n * @returns {string} Returns the joined string.\\n * @example\\n *\\n * _.join(['a', 'b', 'c'], '~');\\n * // => 'a~b~c'\\n */\\n function join(array, separator) {\\n return array == null ? '' : nativeJoin.call(array, separator);\\n }\\n\\n /**\\n * Gets the last element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {*} Returns the last element of `array`.\\n * @example\\n *\\n * _.last([1, 2, 3]);\\n * // => 3\\n */\\n function last(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? array[length - 1] : undefined;\\n }\\n\\n /**\\n * This method is like `_.indexOf` except that it iterates over elements of\\n * `array` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=array.length-1] The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.lastIndexOf([1, 2, 1, 2], 2);\\n * // => 3\\n *\\n * // Search from the `fromIndex`.\\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\\n * // => 1\\n */\\n function lastIndexOf(array, value, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = length;\\n if (fromIndex !== undefined) {\\n index = toInteger(fromIndex);\\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\\n }\\n return value === value\\n ? strictLastIndexOf(array, value, index)\\n : baseFindIndex(array, baseIsNaN, index, true);\\n }\\n\\n /**\\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\\n * element from the end is returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.11.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=0] The index of the element to return.\\n * @returns {*} Returns the nth element of `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'd'];\\n *\\n * _.nth(array, 1);\\n * // => 'b'\\n *\\n * _.nth(array, -2);\\n * // => 'c';\\n */\\n function nth(array, n) {\\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\\n }\\n\\n /**\\n * Removes all given values from `array` using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\\n * to remove elements from an array by predicate.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {...*} [values] The values to remove.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\\n *\\n * _.pull(array, 'a', 'c');\\n * console.log(array);\\n * // => ['b', 'b']\\n */\\n var pull = baseRest(pullAll);\\n\\n /**\\n * This method is like `_.pull` except that it accepts an array of values to remove.\\n *\\n * **Note:** Unlike `_.difference`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\\n *\\n * _.pullAll(array, ['a', 'c']);\\n * console.log(array);\\n * // => ['b', 'b']\\n */\\n function pullAll(array, values) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values)\\n : array;\\n }\\n\\n /**\\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\\n * invoked for each element of `array` and `values` to generate the criterion\\n * by which they're compared. The iteratee is invoked with one argument: (value).\\n *\\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\\n *\\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\\n * console.log(array);\\n * // => [{ 'x': 2 }]\\n */\\n function pullAllBy(array, values, iteratee) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values, getIteratee(iteratee, 2))\\n : array;\\n }\\n\\n /**\\n * This method is like `_.pullAll` except that it accepts `comparator` which\\n * is invoked to compare elements of `array` to `values`. The comparator is\\n * invoked with two arguments: (arrVal, othVal).\\n *\\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\\n *\\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\\n * console.log(array);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\\n */\\n function pullAllWith(array, values, comparator) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values, undefined, comparator)\\n : array;\\n }\\n\\n /**\\n * Removes elements from `array` corresponding to `indexes` and returns an\\n * array of removed elements.\\n *\\n * **Note:** Unlike `_.at`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\\n * @returns {Array} Returns the new array of removed elements.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'd'];\\n * var pulled = _.pullAt(array, [1, 3]);\\n *\\n * console.log(array);\\n * // => ['a', 'c']\\n *\\n * console.log(pulled);\\n * // => ['b', 'd']\\n */\\n var pullAt = flatRest(function(array, indexes) {\\n var length = array == null ? 0 : array.length,\\n result = baseAt(array, indexes);\\n\\n basePullAt(array, arrayMap(indexes, function(index) {\\n return isIndex(index, length) ? +index : index;\\n }).sort(compareAscending));\\n\\n return result;\\n });\\n\\n /**\\n * Removes all elements from `array` that `predicate` returns truthy for\\n * and returns an array of the removed elements. The predicate is invoked\\n * with three arguments: (value, index, array).\\n *\\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\\n * to pull elements from an array by value.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new array of removed elements.\\n * @example\\n *\\n * var array = [1, 2, 3, 4];\\n * var evens = _.remove(array, function(n) {\\n * return n % 2 == 0;\\n * });\\n *\\n * console.log(array);\\n * // => [1, 3]\\n *\\n * console.log(evens);\\n * // => [2, 4]\\n */\\n function remove(array, predicate) {\\n var result = [];\\n if (!(array && array.length)) {\\n return result;\\n }\\n var index = -1,\\n indexes = [],\\n length = array.length;\\n\\n predicate = getIteratee(predicate, 3);\\n while (++index < length) {\\n var value = array[index];\\n if (predicate(value, index, array)) {\\n result.push(value);\\n indexes.push(index);\\n }\\n }\\n basePullAt(array, indexes);\\n return result;\\n }\\n\\n /**\\n * Reverses `array` so that the first element becomes the last, the second\\n * element becomes the second to last, and so on.\\n *\\n * **Note:** This method mutates `array` and is based on\\n * [`Array#reverse`](https://mdn.io/Array/reverse).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _.reverse(array);\\n * // => [3, 2, 1]\\n *\\n * console.log(array);\\n * // => [3, 2, 1]\\n */\\n function reverse(array) {\\n return array == null ? array : nativeReverse.call(array);\\n }\\n\\n /**\\n * Creates a slice of `array` from `start` up to, but not including, `end`.\\n *\\n * **Note:** This method is used instead of\\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\\n * returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to slice.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function slice(array, start, end) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\\n start = 0;\\n end = length;\\n }\\n else {\\n start = start == null ? 0 : toInteger(start);\\n end = end === undefined ? length : toInteger(end);\\n }\\n return baseSlice(array, start, end);\\n }\\n\\n /**\\n * Uses a binary search to determine the lowest index at which `value`\\n * should be inserted into `array` in order to maintain its sort order.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * _.sortedIndex([30, 50], 40);\\n * // => 1\\n */\\n function sortedIndex(array, value) {\\n return baseSortedIndex(array, value);\\n }\\n\\n /**\\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\\n * which is invoked for `value` and each element of `array` to compute their\\n * sort ranking. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\\n *\\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\\n * // => 0\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\\n * // => 0\\n */\\n function sortedIndexBy(array, value, iteratee) {\\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\\n }\\n\\n /**\\n * This method is like `_.indexOf` except that it performs a binary\\n * search on a sorted `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\\n * // => 1\\n */\\n function sortedIndexOf(array, value) {\\n var length = array == null ? 0 : array.length;\\n if (length) {\\n var index = baseSortedIndex(array, value);\\n if (index < length && eq(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * This method is like `_.sortedIndex` except that it returns the highest\\n * index at which `value` should be inserted into `array` in order to\\n * maintain its sort order.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\\n * // => 4\\n */\\n function sortedLastIndex(array, value) {\\n return baseSortedIndex(array, value, true);\\n }\\n\\n /**\\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\\n * which is invoked for `value` and each element of `array` to compute their\\n * sort ranking. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\\n *\\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\\n * // => 1\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\\n * // => 1\\n */\\n function sortedLastIndexBy(array, value, iteratee) {\\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\\n }\\n\\n /**\\n * This method is like `_.lastIndexOf` except that it performs a binary\\n * search on a sorted `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\\n * // => 3\\n */\\n function sortedLastIndexOf(array, value) {\\n var length = array == null ? 0 : array.length;\\n if (length) {\\n var index = baseSortedIndex(array, value, true) - 1;\\n if (eq(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it's designed and optimized\\n * for sorted arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.sortedUniq([1, 1, 2]);\\n * // => [1, 2]\\n */\\n function sortedUniq(array) {\\n return (array && array.length)\\n ? baseSortedUniq(array)\\n : [];\\n }\\n\\n /**\\n * This method is like `_.uniqBy` except that it's designed and optimized\\n * for sorted arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\\n * // => [1.1, 2.3]\\n */\\n function sortedUniqBy(array, iteratee) {\\n return (array && array.length)\\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\\n : [];\\n }\\n\\n /**\\n * Gets all but the first element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.tail([1, 2, 3]);\\n * // => [2, 3]\\n */\\n function tail(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseSlice(array, 1, length) : [];\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements taken from the beginning.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to take.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.take([1, 2, 3]);\\n * // => [1]\\n *\\n * _.take([1, 2, 3], 2);\\n * // => [1, 2]\\n *\\n * _.take([1, 2, 3], 5);\\n * // => [1, 2, 3]\\n *\\n * _.take([1, 2, 3], 0);\\n * // => []\\n */\\n function take(array, n, guard) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n return baseSlice(array, 0, n < 0 ? 0 : n);\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements taken from the end.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to take.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.takeRight([1, 2, 3]);\\n * // => [3]\\n *\\n * _.takeRight([1, 2, 3], 2);\\n * // => [2, 3]\\n *\\n * _.takeRight([1, 2, 3], 5);\\n * // => [1, 2, 3]\\n *\\n * _.takeRight([1, 2, 3], 0);\\n * // => []\\n */\\n function takeRight(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n n = length - n;\\n return baseSlice(array, n < 0 ? 0 : n, length);\\n }\\n\\n /**\\n * Creates a slice of `array` with elements taken from the end. Elements are\\n * taken until `predicate` returns falsey. The predicate is invoked with\\n * three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.takeRightWhile(users, function(o) { return !o.active; });\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\\n * // => objects for ['pebbles']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.takeRightWhile(users, ['active', false]);\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.takeRightWhile(users, 'active');\\n * // => []\\n */\\n function takeRightWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\\n : [];\\n }\\n\\n /**\\n * Creates a slice of `array` with elements taken from the beginning. Elements\\n * are taken until `predicate` returns falsey. The predicate is invoked with\\n * three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.takeWhile(users, function(o) { return !o.active; });\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.takeWhile(users, ['active', false]);\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.takeWhile(users, 'active');\\n * // => []\\n */\\n function takeWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3))\\n : [];\\n }\\n\\n /**\\n * Creates an array of unique values, in order, from all given arrays using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * _.union([2], [1, 2]);\\n * // => [2, 1]\\n */\\n var union = baseRest(function(arrays) {\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\\n });\\n\\n /**\\n * This method is like `_.union` except that it accepts `iteratee` which is\\n * invoked for each element of each `arrays` to generate the criterion by\\n * which uniqueness is computed. Result values are chosen from the first\\n * array in which the value occurs. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\\n * // => [2.1, 1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }, { 'x': 2 }]\\n */\\n var unionBy = baseRest(function(arrays) {\\n var iteratee = last(arrays);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\\n });\\n\\n /**\\n * This method is like `_.union` except that it accepts `comparator` which\\n * is invoked to compare elements of `arrays`. Result values are chosen from\\n * the first array in which the value occurs. The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.unionWith(objects, others, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\\n */\\n var unionWith = baseRest(function(arrays) {\\n var comparator = last(arrays);\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\\n });\\n\\n /**\\n * Creates a duplicate-free version of an array, using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons, in which only the first occurrence of each element\\n * is kept. The order of result values is determined by the order they occur\\n * in the array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.uniq([2, 1, 2]);\\n * // => [2, 1]\\n */\\n function uniq(array) {\\n return (array && array.length) ? baseUniq(array) : [];\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it accepts `iteratee` which is\\n * invoked for each element in `array` to generate the criterion by which\\n * uniqueness is computed. The order of result values is determined by the\\n * order they occur in the array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\\n * // => [2.1, 1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }, { 'x': 2 }]\\n */\\n function uniqBy(array, iteratee) {\\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it accepts `comparator` which\\n * is invoked to compare elements of `array`. The order of result values is\\n * determined by the order they occur in the array.The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.uniqWith(objects, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\\n */\\n function uniqWith(array, comparator) {\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\\n }\\n\\n /**\\n * This method is like `_.zip` except that it accepts an array of grouped\\n * elements and creates an array regrouping the elements to their pre-zip\\n * configuration.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.2.0\\n * @category Array\\n * @param {Array} array The array of grouped elements to process.\\n * @returns {Array} Returns the new array of regrouped elements.\\n * @example\\n *\\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\\n * // => [['a', 1, true], ['b', 2, false]]\\n *\\n * _.unzip(zipped);\\n * // => [['a', 'b'], [1, 2], [true, false]]\\n */\\n function unzip(array) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n var length = 0;\\n array = arrayFilter(array, function(group) {\\n if (isArrayLikeObject(group)) {\\n length = nativeMax(group.length, length);\\n return true;\\n }\\n });\\n return baseTimes(length, function(index) {\\n return arrayMap(array, baseProperty(index));\\n });\\n }\\n\\n /**\\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\\n * how regrouped values should be combined. The iteratee is invoked with the\\n * elements of each group: (...group).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Array\\n * @param {Array} array The array of grouped elements to process.\\n * @param {Function} [iteratee=_.identity] The function to combine\\n * regrouped values.\\n * @returns {Array} Returns the new array of regrouped elements.\\n * @example\\n *\\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\\n * // => [[1, 10, 100], [2, 20, 200]]\\n *\\n * _.unzipWith(zipped, _.add);\\n * // => [3, 30, 300]\\n */\\n function unzipWith(array, iteratee) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n var result = unzip(array);\\n if (iteratee == null) {\\n return result;\\n }\\n return arrayMap(result, function(group) {\\n return apply(iteratee, undefined, group);\\n });\\n }\\n\\n /**\\n * Creates an array excluding all given values using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * **Note:** Unlike `_.pull`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...*} [values] The values to exclude.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.difference, _.xor\\n * @example\\n *\\n * _.without([2, 1, 2, 3], 1, 2);\\n * // => [3]\\n */\\n var without = baseRest(function(array, values) {\\n return isArrayLikeObject(array)\\n ? baseDifference(array, values)\\n : [];\\n });\\n\\n /**\\n * Creates an array of unique values that is the\\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\\n * of the given arrays. The order of result values is determined by the order\\n * they occur in the arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.difference, _.without\\n * @example\\n *\\n * _.xor([2, 1], [2, 3]);\\n * // => [1, 3]\\n */\\n var xor = baseRest(function(arrays) {\\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\\n });\\n\\n /**\\n * This method is like `_.xor` except that it accepts `iteratee` which is\\n * invoked for each element of each `arrays` to generate the criterion by\\n * which by which they're compared. The order of result values is determined\\n * by the order they occur in the arrays. The iteratee is invoked with one\\n * argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [1.2, 3.4]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 2 }]\\n */\\n var xorBy = baseRest(function(arrays) {\\n var iteratee = last(arrays);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\\n });\\n\\n /**\\n * This method is like `_.xor` except that it accepts `comparator` which is\\n * invoked to compare elements of `arrays`. The order of result values is\\n * determined by the order they occur in the arrays. The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.xorWith(objects, others, _.isEqual);\\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\\n */\\n var xorWith = baseRest(function(arrays) {\\n var comparator = last(arrays);\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\\n });\\n\\n /**\\n * Creates an array of grouped elements, the first of which contains the\\n * first elements of the given arrays, the second of which contains the\\n * second elements of the given arrays, and so on.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to process.\\n * @returns {Array} Returns the new array of grouped elements.\\n * @example\\n *\\n * _.zip(['a', 'b'], [1, 2], [true, false]);\\n * // => [['a', 1, true], ['b', 2, false]]\\n */\\n var zip = baseRest(unzip);\\n\\n /**\\n * This method is like `_.fromPairs` except that it accepts two arrays,\\n * one of property identifiers and one of corresponding values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.4.0\\n * @category Array\\n * @param {Array} [props=[]] The property identifiers.\\n * @param {Array} [values=[]] The property values.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.zipObject(['a', 'b'], [1, 2]);\\n * // => { 'a': 1, 'b': 2 }\\n */\\n function zipObject(props, values) {\\n return baseZipObject(props || [], values || [], assignValue);\\n }\\n\\n /**\\n * This method is like `_.zipObject` except that it supports property paths.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.1.0\\n * @category Array\\n * @param {Array} [props=[]] The property identifiers.\\n * @param {Array} [values=[]] The property values.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\\n */\\n function zipObjectDeep(props, values) {\\n return baseZipObject(props || [], values || [], baseSet);\\n }\\n\\n /**\\n * This method is like `_.zip` except that it accepts `iteratee` to specify\\n * how grouped values should be combined. The iteratee is invoked with the\\n * elements of each group: (...group).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to process.\\n * @param {Function} [iteratee=_.identity] The function to combine\\n * grouped values.\\n * @returns {Array} Returns the new array of grouped elements.\\n * @example\\n *\\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\\n * return a + b + c;\\n * });\\n * // => [111, 222]\\n */\\n var zipWith = baseRest(function(arrays) {\\n var length = arrays.length,\\n iteratee = length > 1 ? arrays[length - 1] : undefined;\\n\\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\\n return unzipWith(arrays, iteratee);\\n });\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\\n * chain sequences enabled. The result of such sequences must be unwrapped\\n * with `_#value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.3.0\\n * @category Seq\\n * @param {*} value The value to wrap.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'pebbles', 'age': 1 }\\n * ];\\n *\\n * var youngest = _\\n * .chain(users)\\n * .sortBy('age')\\n * .map(function(o) {\\n * return o.user + ' is ' + o.age;\\n * })\\n * .head()\\n * .value();\\n * // => 'pebbles is 1'\\n */\\n function chain(value) {\\n var result = lodash(value);\\n result.__chain__ = true;\\n return result;\\n }\\n\\n /**\\n * This method invokes `interceptor` and returns `value`. The interceptor\\n * is invoked with one argument; (value). The purpose of this method is to\\n * \\\"tap into\\\" a method chain sequence in order to modify intermediate results.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @param {*} value The value to provide to `interceptor`.\\n * @param {Function} interceptor The function to invoke.\\n * @returns {*} Returns `value`.\\n * @example\\n *\\n * _([1, 2, 3])\\n * .tap(function(array) {\\n * // Mutate input array.\\n * array.pop();\\n * })\\n * .reverse()\\n * .value();\\n * // => [2, 1]\\n */\\n function tap(value, interceptor) {\\n interceptor(value);\\n return value;\\n }\\n\\n /**\\n * This method is like `_.tap` except that it returns the result of `interceptor`.\\n * The purpose of this method is to \\\"pass thru\\\" values replacing intermediate\\n * results in a method chain sequence.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Seq\\n * @param {*} value The value to provide to `interceptor`.\\n * @param {Function} interceptor The function to invoke.\\n * @returns {*} Returns the result of `interceptor`.\\n * @example\\n *\\n * _(' abc ')\\n * .chain()\\n * .trim()\\n * .thru(function(value) {\\n * return [value];\\n * })\\n * .value();\\n * // => ['abc']\\n */\\n function thru(value, interceptor) {\\n return interceptor(value);\\n }\\n\\n /**\\n * This method is the wrapper version of `_.at`.\\n *\\n * @name at\\n * @memberOf _\\n * @since 1.0.0\\n * @category Seq\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\\n *\\n * _(object).at(['a[0].b.c', 'a[1]']).value();\\n * // => [3, 4]\\n */\\n var wrapperAt = flatRest(function(paths) {\\n var length = paths.length,\\n start = length ? paths[0] : 0,\\n value = this.__wrapped__,\\n interceptor = function(object) { return baseAt(object, paths); };\\n\\n if (length > 1 || this.__actions__.length ||\\n !(value instanceof LazyWrapper) || !isIndex(start)) {\\n return this.thru(interceptor);\\n }\\n value = value.slice(start, +start + (length ? 1 : 0));\\n value.__actions__.push({\\n 'func': thru,\\n 'args': [interceptor],\\n 'thisArg': undefined\\n });\\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\\n if (length && !array.length) {\\n array.push(undefined);\\n }\\n return array;\\n });\\n });\\n\\n /**\\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\\n *\\n * @name chain\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 }\\n * ];\\n *\\n * // A sequence without explicit chaining.\\n * _(users).head();\\n * // => { 'user': 'barney', 'age': 36 }\\n *\\n * // A sequence with explicit chaining.\\n * _(users)\\n * .chain()\\n * .head()\\n * .pick('user')\\n * .value();\\n * // => { 'user': 'barney' }\\n */\\n function wrapperChain() {\\n return chain(this);\\n }\\n\\n /**\\n * Executes the chain sequence and returns the wrapped result.\\n *\\n * @name commit\\n * @memberOf _\\n * @since 3.2.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var array = [1, 2];\\n * var wrapped = _(array).push(3);\\n *\\n * console.log(array);\\n * // => [1, 2]\\n *\\n * wrapped = wrapped.commit();\\n * console.log(array);\\n * // => [1, 2, 3]\\n *\\n * wrapped.last();\\n * // => 3\\n *\\n * console.log(array);\\n * // => [1, 2, 3]\\n */\\n function wrapperCommit() {\\n return new LodashWrapper(this.value(), this.__chain__);\\n }\\n\\n /**\\n * Gets the next value on a wrapped object following the\\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\\n *\\n * @name next\\n * @memberOf _\\n * @since 4.0.0\\n * @category Seq\\n * @returns {Object} Returns the next iterator value.\\n * @example\\n *\\n * var wrapped = _([1, 2]);\\n *\\n * wrapped.next();\\n * // => { 'done': false, 'value': 1 }\\n *\\n * wrapped.next();\\n * // => { 'done': false, 'value': 2 }\\n *\\n * wrapped.next();\\n * // => { 'done': true, 'value': undefined }\\n */\\n function wrapperNext() {\\n if (this.__values__ === undefined) {\\n this.__values__ = toArray(this.value());\\n }\\n var done = this.__index__ >= this.__values__.length,\\n value = done ? undefined : this.__values__[this.__index__++];\\n\\n return { 'done': done, 'value': value };\\n }\\n\\n /**\\n * Enables the wrapper to be iterable.\\n *\\n * @name Symbol.iterator\\n * @memberOf _\\n * @since 4.0.0\\n * @category Seq\\n * @returns {Object} Returns the wrapper object.\\n * @example\\n *\\n * var wrapped = _([1, 2]);\\n *\\n * wrapped[Symbol.iterator]() === wrapped;\\n * // => true\\n *\\n * Array.from(wrapped);\\n * // => [1, 2]\\n */\\n function wrapperToIterator() {\\n return this;\\n }\\n\\n /**\\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\\n *\\n * @name plant\\n * @memberOf _\\n * @since 3.2.0\\n * @category Seq\\n * @param {*} value The value to plant.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var wrapped = _([1, 2]).map(square);\\n * var other = wrapped.plant([3, 4]);\\n *\\n * other.value();\\n * // => [9, 16]\\n *\\n * wrapped.value();\\n * // => [1, 4]\\n */\\n function wrapperPlant(value) {\\n var result,\\n parent = this;\\n\\n while (parent instanceof baseLodash) {\\n var clone = wrapperClone(parent);\\n clone.__index__ = 0;\\n clone.__values__ = undefined;\\n if (result) {\\n previous.__wrapped__ = clone;\\n } else {\\n result = clone;\\n }\\n var previous = clone;\\n parent = parent.__wrapped__;\\n }\\n previous.__wrapped__ = value;\\n return result;\\n }\\n\\n /**\\n * This method is the wrapper version of `_.reverse`.\\n *\\n * **Note:** This method mutates the wrapped array.\\n *\\n * @name reverse\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _(array).reverse().value()\\n * // => [3, 2, 1]\\n *\\n * console.log(array);\\n * // => [3, 2, 1]\\n */\\n function wrapperReverse() {\\n var value = this.__wrapped__;\\n if (value instanceof LazyWrapper) {\\n var wrapped = value;\\n if (this.__actions__.length) {\\n wrapped = new LazyWrapper(this);\\n }\\n wrapped = wrapped.reverse();\\n wrapped.__actions__.push({\\n 'func': thru,\\n 'args': [reverse],\\n 'thisArg': undefined\\n });\\n return new LodashWrapper(wrapped, this.__chain__);\\n }\\n return this.thru(reverse);\\n }\\n\\n /**\\n * Executes the chain sequence to resolve the unwrapped value.\\n *\\n * @name value\\n * @memberOf _\\n * @since 0.1.0\\n * @alias toJSON, valueOf\\n * @category Seq\\n * @returns {*} Returns the resolved unwrapped value.\\n * @example\\n *\\n * _([1, 2, 3]).value();\\n * // => [1, 2, 3]\\n */\\n function wrapperValue() {\\n return baseWrapperValue(this.__wrapped__, this.__actions__);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The corresponding value of\\n * each key is the number of times the key was returned by `iteratee`. The\\n * iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\\n * // => { '4': 1, '6': 2 }\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.countBy(['one', 'two', 'three'], 'length');\\n * // => { '3': 2, '5': 1 }\\n */\\n var countBy = createAggregator(function(result, value, key) {\\n if (hasOwnProperty.call(result, key)) {\\n ++result[key];\\n } else {\\n baseAssignValue(result, key, 1);\\n }\\n });\\n\\n /**\\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\\n * Iteration is stopped once `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index|key, collection).\\n *\\n * **Note:** This method returns `true` for\\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\\n * elements of empty collections.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`.\\n * @example\\n *\\n * _.every([true, 1, null, 'yes'], Boolean);\\n * // => false\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': false }\\n * ];\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.every(users, { 'user': 'barney', 'active': false });\\n * // => false\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.every(users, ['active', false]);\\n * // => true\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.every(users, 'active');\\n * // => false\\n */\\n function every(collection, predicate, guard) {\\n var func = isArray(collection) ? arrayEvery : baseEvery;\\n if (guard && isIterateeCall(collection, predicate, guard)) {\\n predicate = undefined;\\n }\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Iterates over elements of `collection`, returning an array of all elements\\n * `predicate` returns truthy for. The predicate is invoked with three\\n * arguments: (value, index|key, collection).\\n *\\n * **Note:** Unlike `_.remove`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n * @see _.reject\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': true },\\n * { 'user': 'fred', 'age': 40, 'active': false }\\n * ];\\n *\\n * _.filter(users, function(o) { return !o.active; });\\n * // => objects for ['fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.filter(users, { 'age': 36, 'active': true });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.filter(users, ['active', false]);\\n * // => objects for ['fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.filter(users, 'active');\\n * // => objects for ['barney']\\n */\\n function filter(collection, predicate) {\\n var func = isArray(collection) ? arrayFilter : baseFilter;\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Iterates over elements of `collection`, returning the first element\\n * `predicate` returns truthy for. The predicate is invoked with three\\n * arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {*} Returns the matched element, else `undefined`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': true },\\n * { 'user': 'fred', 'age': 40, 'active': false },\\n * { 'user': 'pebbles', 'age': 1, 'active': true }\\n * ];\\n *\\n * _.find(users, function(o) { return o.age < 40; });\\n * // => object for 'barney'\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.find(users, { 'age': 1, 'active': true });\\n * // => object for 'pebbles'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.find(users, ['active', false]);\\n * // => object for 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.find(users, 'active');\\n * // => object for 'barney'\\n */\\n var find = createFind(findIndex);\\n\\n /**\\n * This method is like `_.find` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=collection.length-1] The index to search from.\\n * @returns {*} Returns the matched element, else `undefined`.\\n * @example\\n *\\n * _.findLast([1, 2, 3, 4], function(n) {\\n * return n % 2 == 1;\\n * });\\n * // => 3\\n */\\n var findLast = createFind(findLastIndex);\\n\\n /**\\n * Creates a flattened array of values by running each element in `collection`\\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\\n * with three arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [n, n];\\n * }\\n *\\n * _.flatMap([1, 2], duplicate);\\n * // => [1, 1, 2, 2]\\n */\\n function flatMap(collection, iteratee) {\\n return baseFlatten(map(collection, iteratee), 1);\\n }\\n\\n /**\\n * This method is like `_.flatMap` except that it recursively flattens the\\n * mapped results.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.7.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [[[n, n]]];\\n * }\\n *\\n * _.flatMapDeep([1, 2], duplicate);\\n * // => [1, 1, 2, 2]\\n */\\n function flatMapDeep(collection, iteratee) {\\n return baseFlatten(map(collection, iteratee), INFINITY);\\n }\\n\\n /**\\n * This method is like `_.flatMap` except that it recursively flattens the\\n * mapped results up to `depth` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.7.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {number} [depth=1] The maximum recursion depth.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [[[n, n]]];\\n * }\\n *\\n * _.flatMapDepth([1, 2], duplicate, 2);\\n * // => [[1, 1], [2, 2]]\\n */\\n function flatMapDepth(collection, iteratee, depth) {\\n depth = depth === undefined ? 1 : toInteger(depth);\\n return baseFlatten(map(collection, iteratee), depth);\\n }\\n\\n /**\\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\\n * The iteratee is invoked with three arguments: (value, index|key, collection).\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * **Note:** As with other \\\"Collections\\\" methods, objects with a \\\"length\\\"\\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\\n * or `_.forOwn` for object iteration.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @alias each\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n * @see _.forEachRight\\n * @example\\n *\\n * _.forEach([1, 2], function(value) {\\n * console.log(value);\\n * });\\n * // => Logs `1` then `2`.\\n *\\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\\n */\\n function forEach(collection, iteratee) {\\n var func = isArray(collection) ? arrayEach : baseEach;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.forEach` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @alias eachRight\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n * @see _.forEach\\n * @example\\n *\\n * _.forEachRight([1, 2], function(value) {\\n * console.log(value);\\n * });\\n * // => Logs `2` then `1`.\\n */\\n function forEachRight(collection, iteratee) {\\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The order of grouped values\\n * is determined by the order they occur in `collection`. The corresponding\\n * value of each key is an array of elements responsible for generating the\\n * key. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\\n * // => { '4': [4.2], '6': [6.1, 6.3] }\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.groupBy(['one', 'two', 'three'], 'length');\\n * // => { '3': ['one', 'two'], '5': ['three'] }\\n */\\n var groupBy = createAggregator(function(result, value, key) {\\n if (hasOwnProperty.call(result, key)) {\\n result[key].push(value);\\n } else {\\n baseAssignValue(result, key, [value]);\\n }\\n });\\n\\n /**\\n * Checks if `value` is in `collection`. If `collection` is a string, it's\\n * checked for a substring of `value`, otherwise\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\\n * the offset from the end of `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object|string} collection The collection to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\\n * @example\\n *\\n * _.includes([1, 2, 3], 1);\\n * // => true\\n *\\n * _.includes([1, 2, 3], 1, 2);\\n * // => false\\n *\\n * _.includes({ 'a': 1, 'b': 2 }, 1);\\n * // => true\\n *\\n * _.includes('abcd', 'bc');\\n * // => true\\n */\\n function includes(collection, value, fromIndex, guard) {\\n collection = isArrayLike(collection) ? collection : values(collection);\\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\\n\\n var length = collection.length;\\n if (fromIndex < 0) {\\n fromIndex = nativeMax(length + fromIndex, 0);\\n }\\n return isString(collection)\\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\\n }\\n\\n /**\\n * Invokes the method at `path` of each element in `collection`, returning\\n * an array of the results of each invoked method. Any additional arguments\\n * are provided to each invoked method. If `path` is a function, it's invoked\\n * for, and `this` bound to, each element in `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Array|Function|string} path The path of the method to invoke or\\n * the function invoked per iteration.\\n * @param {...*} [args] The arguments to invoke each method with.\\n * @returns {Array} Returns the array of results.\\n * @example\\n *\\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\\n * // => [[1, 5, 7], [1, 2, 3]]\\n *\\n * _.invokeMap([123, 456], String.prototype.split, '');\\n * // => [['1', '2', '3'], ['4', '5', '6']]\\n */\\n var invokeMap = baseRest(function(collection, path, args) {\\n var index = -1,\\n isFunc = typeof path == 'function',\\n result = isArrayLike(collection) ? Array(collection.length) : [];\\n\\n baseEach(collection, function(value) {\\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\\n });\\n return result;\\n });\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The corresponding value of\\n * each key is the last element responsible for generating the key. The\\n * iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * var array = [\\n * { 'dir': 'left', 'code': 97 },\\n * { 'dir': 'right', 'code': 100 }\\n * ];\\n *\\n * _.keyBy(array, function(o) {\\n * return String.fromCharCode(o.code);\\n * });\\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\\n *\\n * _.keyBy(array, 'dir');\\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\\n */\\n var keyBy = createAggregator(function(result, value, key) {\\n baseAssignValue(result, key, value);\\n });\\n\\n /**\\n * Creates an array of values by running each element in `collection` thru\\n * `iteratee`. The iteratee is invoked with three arguments:\\n * (value, index|key, collection).\\n *\\n * Many lodash methods are guarded to work as iteratees for methods like\\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\\n *\\n * The guarded methods are:\\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * _.map([4, 8], square);\\n * // => [16, 64]\\n *\\n * _.map({ 'a': 4, 'b': 8 }, square);\\n * // => [16, 64] (iteration order is not guaranteed)\\n *\\n * var users = [\\n * { 'user': 'barney' },\\n * { 'user': 'fred' }\\n * ];\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.map(users, 'user');\\n * // => ['barney', 'fred']\\n */\\n function map(collection, iteratee) {\\n var func = isArray(collection) ? arrayMap : baseMap;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.sortBy` except that it allows specifying the sort\\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\\n * are sorted in ascending order. Otherwise, specify an order of \\\"desc\\\" for\\n * descending or \\\"asc\\\" for ascending sort order of corresponding values.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\\n * The iteratees to sort by.\\n * @param {string[]} [orders] The sort orders of `iteratees`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\\n * @returns {Array} Returns the new sorted array.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'fred', 'age': 48 },\\n * { 'user': 'barney', 'age': 34 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'barney', 'age': 36 }\\n * ];\\n *\\n * // Sort by `user` in ascending order and by `age` in descending order.\\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\\n */\\n function orderBy(collection, iteratees, orders, guard) {\\n if (collection == null) {\\n return [];\\n }\\n if (!isArray(iteratees)) {\\n iteratees = iteratees == null ? [] : [iteratees];\\n }\\n orders = guard ? undefined : orders;\\n if (!isArray(orders)) {\\n orders = orders == null ? [] : [orders];\\n }\\n return baseOrderBy(collection, iteratees, orders);\\n }\\n\\n /**\\n * Creates an array of elements split into two groups, the first of which\\n * contains elements `predicate` returns truthy for, the second of which\\n * contains elements `predicate` returns falsey for. The predicate is\\n * invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the array of grouped elements.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': true },\\n * { 'user': 'pebbles', 'age': 1, 'active': false }\\n * ];\\n *\\n * _.partition(users, function(o) { return o.active; });\\n * // => objects for [['fred'], ['barney', 'pebbles']]\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.partition(users, { 'age': 1, 'active': false });\\n * // => objects for [['pebbles'], ['barney', 'fred']]\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.partition(users, ['active', false]);\\n * // => objects for [['barney', 'pebbles'], ['fred']]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.partition(users, 'active');\\n * // => objects for [['fred'], ['barney', 'pebbles']]\\n */\\n var partition = createAggregator(function(result, value, key) {\\n result[key ? 0 : 1].push(value);\\n }, function() { return [[], []]; });\\n\\n /**\\n * Reduces `collection` to a value which is the accumulated result of running\\n * each element in `collection` thru `iteratee`, where each successive\\n * invocation is supplied the return value of the previous. If `accumulator`\\n * is not given, the first element of `collection` is used as the initial\\n * value. The iteratee is invoked with four arguments:\\n * (accumulator, value, index|key, collection).\\n *\\n * Many lodash methods are guarded to work as iteratees for methods like\\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\\n *\\n * The guarded methods are:\\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\\n * and `sortBy`\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @returns {*} Returns the accumulated value.\\n * @see _.reduceRight\\n * @example\\n *\\n * _.reduce([1, 2], function(sum, n) {\\n * return sum + n;\\n * }, 0);\\n * // => 3\\n *\\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\\n * (result[value] || (result[value] = [])).push(key);\\n * return result;\\n * }, {});\\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\\n */\\n function reduce(collection, iteratee, accumulator) {\\n var func = isArray(collection) ? arrayReduce : baseReduce,\\n initAccum = arguments.length < 3;\\n\\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\\n }\\n\\n /**\\n * This method is like `_.reduce` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @returns {*} Returns the accumulated value.\\n * @see _.reduce\\n * @example\\n *\\n * var array = [[0, 1], [2, 3], [4, 5]];\\n *\\n * _.reduceRight(array, function(flattened, other) {\\n * return flattened.concat(other);\\n * }, []);\\n * // => [4, 5, 2, 3, 0, 1]\\n */\\n function reduceRight(collection, iteratee, accumulator) {\\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\\n initAccum = arguments.length < 3;\\n\\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\\n }\\n\\n /**\\n * The opposite of `_.filter`; this method returns the elements of `collection`\\n * that `predicate` does **not** return truthy for.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n * @see _.filter\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': true }\\n * ];\\n *\\n * _.reject(users, function(o) { return !o.active; });\\n * // => objects for ['fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.reject(users, { 'age': 40, 'active': true });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.reject(users, ['active', false]);\\n * // => objects for ['fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.reject(users, 'active');\\n * // => objects for ['barney']\\n */\\n function reject(collection, predicate) {\\n var func = isArray(collection) ? arrayFilter : baseFilter;\\n return func(collection, negate(getIteratee(predicate, 3)));\\n }\\n\\n /**\\n * Gets a random element from `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to sample.\\n * @returns {*} Returns the random element.\\n * @example\\n *\\n * _.sample([1, 2, 3, 4]);\\n * // => 2\\n */\\n function sample(collection) {\\n var func = isArray(collection) ? arraySample : baseSample;\\n return func(collection);\\n }\\n\\n /**\\n * Gets `n` random elements at unique keys from `collection` up to the\\n * size of `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to sample.\\n * @param {number} [n=1] The number of elements to sample.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the random elements.\\n * @example\\n *\\n * _.sampleSize([1, 2, 3], 2);\\n * // => [3, 1]\\n *\\n * _.sampleSize([1, 2, 3], 4);\\n * // => [2, 3, 1]\\n */\\n function sampleSize(collection, n, guard) {\\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\\n n = 1;\\n } else {\\n n = toInteger(n);\\n }\\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\\n return func(collection, n);\\n }\\n\\n /**\\n * Creates an array of shuffled values, using a version of the\\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n * @example\\n *\\n * _.shuffle([1, 2, 3, 4]);\\n * // => [4, 1, 3, 2]\\n */\\n function shuffle(collection) {\\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\\n return func(collection);\\n }\\n\\n /**\\n * Gets the size of `collection` by returning its length for array-like\\n * values or the number of own enumerable string keyed properties for objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object|string} collection The collection to inspect.\\n * @returns {number} Returns the collection size.\\n * @example\\n *\\n * _.size([1, 2, 3]);\\n * // => 3\\n *\\n * _.size({ 'a': 1, 'b': 2 });\\n * // => 2\\n *\\n * _.size('pebbles');\\n * // => 7\\n */\\n function size(collection) {\\n if (collection == null) {\\n return 0;\\n }\\n if (isArrayLike(collection)) {\\n return isString(collection) ? stringSize(collection) : collection.length;\\n }\\n var tag = getTag(collection);\\n if (tag == mapTag || tag == setTag) {\\n return collection.size;\\n }\\n return baseKeys(collection).length;\\n }\\n\\n /**\\n * Checks if `predicate` returns truthy for **any** element of `collection`.\\n * Iteration is stopped once `predicate` returns truthy. The predicate is\\n * invoked with three arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n * @example\\n *\\n * _.some([null, 0, 'yes', false], Boolean);\\n * // => true\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false }\\n * ];\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.some(users, { 'user': 'barney', 'active': false });\\n * // => false\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.some(users, ['active', false]);\\n * // => true\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.some(users, 'active');\\n * // => true\\n */\\n function some(collection, predicate, guard) {\\n var func = isArray(collection) ? arraySome : baseSome;\\n if (guard && isIterateeCall(collection, predicate, guard)) {\\n predicate = undefined;\\n }\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Creates an array of elements, sorted in ascending order by the results of\\n * running each element in a collection thru each iteratee. This method\\n * performs a stable sort, that is, it preserves the original sort order of\\n * equal elements. The iteratees are invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\\n * The iteratees to sort by.\\n * @returns {Array} Returns the new sorted array.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'fred', 'age': 48 },\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'barney', 'age': 34 }\\n * ];\\n *\\n * _.sortBy(users, [function(o) { return o.user; }]);\\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\\n *\\n * _.sortBy(users, ['user', 'age']);\\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\\n */\\n var sortBy = baseRest(function(collection, iteratees) {\\n if (collection == null) {\\n return [];\\n }\\n var length = iteratees.length;\\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\\n iteratees = [];\\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\\n iteratees = [iteratees[0]];\\n }\\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\\n });\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Gets the timestamp of the number of milliseconds that have elapsed since\\n * the Unix epoch (1 January 1970 00:00:00 UTC).\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Date\\n * @returns {number} Returns the timestamp.\\n * @example\\n *\\n * _.defer(function(stamp) {\\n * console.log(_.now() - stamp);\\n * }, _.now());\\n * // => Logs the number of milliseconds it took for the deferred invocation.\\n */\\n var now = ctxNow || function() {\\n return root.Date.now();\\n };\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * The opposite of `_.before`; this method creates a function that invokes\\n * `func` once it's called `n` or more times.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {number} n The number of calls before `func` is invoked.\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * var saves = ['profile', 'settings'];\\n *\\n * var done = _.after(saves.length, function() {\\n * console.log('done saving!');\\n * });\\n *\\n * _.forEach(saves, function(type) {\\n * asyncSave({ 'type': type, 'complete': done });\\n * });\\n * // => Logs 'done saving!' after the two async saves have completed.\\n */\\n function after(n, func) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n n = toInteger(n);\\n return function() {\\n if (--n < 1) {\\n return func.apply(this, arguments);\\n }\\n };\\n }\\n\\n /**\\n * Creates a function that invokes `func`, with up to `n` arguments,\\n * ignoring any additional arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to cap arguments for.\\n * @param {number} [n=func.length] The arity cap.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new capped function.\\n * @example\\n *\\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\\n * // => [6, 8, 10]\\n */\\n function ary(func, n, guard) {\\n n = guard ? undefined : n;\\n n = (func && n == null) ? func.length : n;\\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\\n }\\n\\n /**\\n * Creates a function that invokes `func`, with the `this` binding and arguments\\n * of the created function, while it's called less than `n` times. Subsequent\\n * calls to the created function return the result of the last `func` invocation.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {number} n The number of calls at which `func` is no longer invoked.\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * jQuery(element).on('click', _.before(5, addContactToList));\\n * // => Allows adding up to 4 contacts to the list.\\n */\\n function before(n, func) {\\n var result;\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n n = toInteger(n);\\n return function() {\\n if (--n > 0) {\\n result = func.apply(this, arguments);\\n }\\n if (n <= 1) {\\n func = undefined;\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\\n * and `partials` prepended to the arguments it receives.\\n *\\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\\n * may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \\\"length\\\"\\n * property of bound functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to bind.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new bound function.\\n * @example\\n *\\n * function greet(greeting, punctuation) {\\n * return greeting + ' ' + this.user + punctuation;\\n * }\\n *\\n * var object = { 'user': 'fred' };\\n *\\n * var bound = _.bind(greet, object, 'hi');\\n * bound('!');\\n * // => 'hi fred!'\\n *\\n * // Bound with placeholders.\\n * var bound = _.bind(greet, object, _, '!');\\n * bound('hi');\\n * // => 'hi fred!'\\n */\\n var bind = baseRest(function(func, thisArg, partials) {\\n var bitmask = WRAP_BIND_FLAG;\\n if (partials.length) {\\n var holders = replaceHolders(partials, getHolder(bind));\\n bitmask |= WRAP_PARTIAL_FLAG;\\n }\\n return createWrap(func, bitmask, thisArg, partials, holders);\\n });\\n\\n /**\\n * Creates a function that invokes the method at `object[key]` with `partials`\\n * prepended to the arguments it receives.\\n *\\n * This method differs from `_.bind` by allowing bound functions to reference\\n * methods that may be redefined or don't yet exist. See\\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\\n * for more details.\\n *\\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.10.0\\n * @category Function\\n * @param {Object} object The object to invoke the method on.\\n * @param {string} key The key of the method.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new bound function.\\n * @example\\n *\\n * var object = {\\n * 'user': 'fred',\\n * 'greet': function(greeting, punctuation) {\\n * return greeting + ' ' + this.user + punctuation;\\n * }\\n * };\\n *\\n * var bound = _.bindKey(object, 'greet', 'hi');\\n * bound('!');\\n * // => 'hi fred!'\\n *\\n * object.greet = function(greeting, punctuation) {\\n * return greeting + 'ya ' + this.user + punctuation;\\n * };\\n *\\n * bound('!');\\n * // => 'hiya fred!'\\n *\\n * // Bound with placeholders.\\n * var bound = _.bindKey(object, 'greet', _, '!');\\n * bound('hi');\\n * // => 'hiya fred!'\\n */\\n var bindKey = baseRest(function(object, key, partials) {\\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\\n if (partials.length) {\\n var holders = replaceHolders(partials, getHolder(bindKey));\\n bitmask |= WRAP_PARTIAL_FLAG;\\n }\\n return createWrap(key, bitmask, object, partials, holders);\\n });\\n\\n /**\\n * Creates a function that accepts arguments of `func` and either invokes\\n * `func` returning its result, if at least `arity` number of arguments have\\n * been provided, or returns a function that accepts the remaining `func`\\n * arguments, and so on. The arity of `func` may be specified if `func.length`\\n * is not sufficient.\\n *\\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\\n * may be used as a placeholder for provided arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of curried functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Function\\n * @param {Function} func The function to curry.\\n * @param {number} [arity=func.length] The arity of `func`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new curried function.\\n * @example\\n *\\n * var abc = function(a, b, c) {\\n * return [a, b, c];\\n * };\\n *\\n * var curried = _.curry(abc);\\n *\\n * curried(1)(2)(3);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2)(3);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2, 3);\\n * // => [1, 2, 3]\\n *\\n * // Curried with placeholders.\\n * curried(1)(_, 3)(2);\\n * // => [1, 2, 3]\\n */\\n function curry(func, arity, guard) {\\n arity = guard ? undefined : arity;\\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\\n result.placeholder = curry.placeholder;\\n return result;\\n }\\n\\n /**\\n * This method is like `_.curry` except that arguments are applied to `func`\\n * in the manner of `_.partialRight` instead of `_.partial`.\\n *\\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for provided arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of curried functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to curry.\\n * @param {number} [arity=func.length] The arity of `func`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new curried function.\\n * @example\\n *\\n * var abc = function(a, b, c) {\\n * return [a, b, c];\\n * };\\n *\\n * var curried = _.curryRight(abc);\\n *\\n * curried(3)(2)(1);\\n * // => [1, 2, 3]\\n *\\n * curried(2, 3)(1);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2, 3);\\n * // => [1, 2, 3]\\n *\\n * // Curried with placeholders.\\n * curried(3)(1, _)(2);\\n * // => [1, 2, 3]\\n */\\n function curryRight(func, arity, guard) {\\n arity = guard ? undefined : arity;\\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\\n result.placeholder = curryRight.placeholder;\\n return result;\\n }\\n\\n /**\\n * Creates a debounced function that delays invoking `func` until after `wait`\\n * milliseconds have elapsed since the last time the debounced function was\\n * invoked. The debounced function comes with a `cancel` method to cancel\\n * delayed `func` invocations and a `flush` method to immediately invoke them.\\n * Provide `options` to indicate whether `func` should be invoked on the\\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\\n * with the last arguments provided to the debounced function. Subsequent\\n * calls to the debounced function return the result of the last `func`\\n * invocation.\\n *\\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\\n * invoked on the trailing edge of the timeout only if the debounced function\\n * is invoked more than once during the `wait` timeout.\\n *\\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\\n *\\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\\n * for details over the differences between `_.debounce` and `_.throttle`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to debounce.\\n * @param {number} [wait=0] The number of milliseconds to delay.\\n * @param {Object} [options={}] The options object.\\n * @param {boolean} [options.leading=false]\\n * Specify invoking on the leading edge of the timeout.\\n * @param {number} [options.maxWait]\\n * The maximum time `func` is allowed to be delayed before it's invoked.\\n * @param {boolean} [options.trailing=true]\\n * Specify invoking on the trailing edge of the timeout.\\n * @returns {Function} Returns the new debounced function.\\n * @example\\n *\\n * // Avoid costly calculations while the window size is in flux.\\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\\n *\\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\\n * 'leading': true,\\n * 'trailing': false\\n * }));\\n *\\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\\n * var source = new EventSource('/stream');\\n * jQuery(source).on('message', debounced);\\n *\\n * // Cancel the trailing debounced invocation.\\n * jQuery(window).on('popstate', debounced.cancel);\\n */\\n function debounce(func, wait, options) {\\n var lastArgs,\\n lastThis,\\n maxWait,\\n result,\\n timerId,\\n lastCallTime,\\n lastInvokeTime = 0,\\n leading = false,\\n maxing = false,\\n trailing = true;\\n\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n wait = toNumber(wait) || 0;\\n if (isObject(options)) {\\n leading = !!options.leading;\\n maxing = 'maxWait' in options;\\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\\n trailing = 'trailing' in options ? !!options.trailing : trailing;\\n }\\n\\n function invokeFunc(time) {\\n var args = lastArgs,\\n thisArg = lastThis;\\n\\n lastArgs = lastThis = undefined;\\n lastInvokeTime = time;\\n result = func.apply(thisArg, args);\\n return result;\\n }\\n\\n function leadingEdge(time) {\\n // Reset any `maxWait` timer.\\n lastInvokeTime = time;\\n // Start the timer for the trailing edge.\\n timerId = setTimeout(timerExpired, wait);\\n // Invoke the leading edge.\\n return leading ? invokeFunc(time) : result;\\n }\\n\\n function remainingWait(time) {\\n var timeSinceLastCall = time - lastCallTime,\\n timeSinceLastInvoke = time - lastInvokeTime,\\n result = wait - timeSinceLastCall;\\n\\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\\n }\\n\\n function shouldInvoke(time) {\\n var timeSinceLastCall = time - lastCallTime,\\n timeSinceLastInvoke = time - lastInvokeTime;\\n\\n // Either this is the first call, activity has stopped and we're at the\\n // trailing edge, the system time has gone backwards and we're treating\\n // it as the trailing edge, or we've hit the `maxWait` limit.\\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\\n }\\n\\n function timerExpired() {\\n var time = now();\\n if (shouldInvoke(time)) {\\n return trailingEdge(time);\\n }\\n // Restart the timer.\\n timerId = setTimeout(timerExpired, remainingWait(time));\\n }\\n\\n function trailingEdge(time) {\\n timerId = undefined;\\n\\n // Only invoke if we have `lastArgs` which means `func` has been\\n // debounced at least once.\\n if (trailing && lastArgs) {\\n return invokeFunc(time);\\n }\\n lastArgs = lastThis = undefined;\\n return result;\\n }\\n\\n function cancel() {\\n if (timerId !== undefined) {\\n clearTimeout(timerId);\\n }\\n lastInvokeTime = 0;\\n lastArgs = lastCallTime = lastThis = timerId = undefined;\\n }\\n\\n function flush() {\\n return timerId === undefined ? result : trailingEdge(now());\\n }\\n\\n function debounced() {\\n var time = now(),\\n isInvoking = shouldInvoke(time);\\n\\n lastArgs = arguments;\\n lastThis = this;\\n lastCallTime = time;\\n\\n if (isInvoking) {\\n if (timerId === undefined) {\\n return leadingEdge(lastCallTime);\\n }\\n if (maxing) {\\n // Handle invocations in a tight loop.\\n timerId = setTimeout(timerExpired, wait);\\n return invokeFunc(lastCallTime);\\n }\\n }\\n if (timerId === undefined) {\\n timerId = setTimeout(timerExpired, wait);\\n }\\n return result;\\n }\\n debounced.cancel = cancel;\\n debounced.flush = flush;\\n return debounced;\\n }\\n\\n /**\\n * Defers invoking the `func` until the current call stack has cleared. Any\\n * additional arguments are provided to `func` when it's invoked.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to defer.\\n * @param {...*} [args] The arguments to invoke `func` with.\\n * @returns {number} Returns the timer id.\\n * @example\\n *\\n * _.defer(function(text) {\\n * console.log(text);\\n * }, 'deferred');\\n * // => Logs 'deferred' after one millisecond.\\n */\\n var defer = baseRest(function(func, args) {\\n return baseDelay(func, 1, args);\\n });\\n\\n /**\\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\\n * provided to `func` when it's invoked.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @param {...*} [args] The arguments to invoke `func` with.\\n * @returns {number} Returns the timer id.\\n * @example\\n *\\n * _.delay(function(text) {\\n * console.log(text);\\n * }, 1000, 'later');\\n * // => Logs 'later' after one second.\\n */\\n var delay = baseRest(function(func, wait, args) {\\n return baseDelay(func, toNumber(wait) || 0, args);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with arguments reversed.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to flip arguments for.\\n * @returns {Function} Returns the new flipped function.\\n * @example\\n *\\n * var flipped = _.flip(function() {\\n * return _.toArray(arguments);\\n * });\\n *\\n * flipped('a', 'b', 'c', 'd');\\n * // => ['d', 'c', 'b', 'a']\\n */\\n function flip(func) {\\n return createWrap(func, WRAP_FLIP_FLAG);\\n }\\n\\n /**\\n * Creates a function that memoizes the result of `func`. If `resolver` is\\n * provided, it determines the cache key for storing the result based on the\\n * arguments provided to the memoized function. By default, the first argument\\n * provided to the memoized function is used as the map cache key. The `func`\\n * is invoked with the `this` binding of the memoized function.\\n *\\n * **Note:** The cache is exposed as the `cache` property on the memoized\\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\\n * constructor with one whose instances implement the\\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to have its output memoized.\\n * @param {Function} [resolver] The function to resolve the cache key.\\n * @returns {Function} Returns the new memoized function.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n * var other = { 'c': 3, 'd': 4 };\\n *\\n * var values = _.memoize(_.values);\\n * values(object);\\n * // => [1, 2]\\n *\\n * values(other);\\n * // => [3, 4]\\n *\\n * object.a = 2;\\n * values(object);\\n * // => [1, 2]\\n *\\n * // Modify the result cache.\\n * values.cache.set(object, ['a', 'b']);\\n * values(object);\\n * // => ['a', 'b']\\n *\\n * // Replace `_.memoize.Cache`.\\n * _.memoize.Cache = WeakMap;\\n */\\n function memoize(func, resolver) {\\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n var memoized = function() {\\n var args = arguments,\\n key = resolver ? resolver.apply(this, args) : args[0],\\n cache = memoized.cache;\\n\\n if (cache.has(key)) {\\n return cache.get(key);\\n }\\n var result = func.apply(this, args);\\n memoized.cache = cache.set(key, result) || cache;\\n return result;\\n };\\n memoized.cache = new (memoize.Cache || MapCache);\\n return memoized;\\n }\\n\\n // Expose `MapCache`.\\n memoize.Cache = MapCache;\\n\\n /**\\n * Creates a function that negates the result of the predicate `func`. The\\n * `func` predicate is invoked with the `this` binding and arguments of the\\n * created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} predicate The predicate to negate.\\n * @returns {Function} Returns the new negated function.\\n * @example\\n *\\n * function isEven(n) {\\n * return n % 2 == 0;\\n * }\\n *\\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\\n * // => [1, 3, 5]\\n */\\n function negate(predicate) {\\n if (typeof predicate != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n return function() {\\n var args = arguments;\\n switch (args.length) {\\n case 0: return !predicate.call(this);\\n case 1: return !predicate.call(this, args[0]);\\n case 2: return !predicate.call(this, args[0], args[1]);\\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\\n }\\n return !predicate.apply(this, args);\\n };\\n }\\n\\n /**\\n * Creates a function that is restricted to invoking `func` once. Repeat calls\\n * to the function return the value of the first invocation. The `func` is\\n * invoked with the `this` binding and arguments of the created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * var initialize = _.once(createApplication);\\n * initialize();\\n * initialize();\\n * // => `createApplication` is invoked once\\n */\\n function once(func) {\\n return before(2, func);\\n }\\n\\n /**\\n * Creates a function that invokes `func` with its arguments transformed.\\n *\\n * @static\\n * @since 4.0.0\\n * @memberOf _\\n * @category Function\\n * @param {Function} func The function to wrap.\\n * @param {...(Function|Function[])} [transforms=[_.identity]]\\n * The argument transforms.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * function doubled(n) {\\n * return n * 2;\\n * }\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var func = _.overArgs(function(x, y) {\\n * return [x, y];\\n * }, [square, doubled]);\\n *\\n * func(9, 3);\\n * // => [81, 6]\\n *\\n * func(10, 5);\\n * // => [100, 10]\\n */\\n var overArgs = castRest(function(func, transforms) {\\n transforms = (transforms.length == 1 && isArray(transforms[0]))\\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\\n\\n var funcsLength = transforms.length;\\n return baseRest(function(args) {\\n var index = -1,\\n length = nativeMin(args.length, funcsLength);\\n\\n while (++index < length) {\\n args[index] = transforms[index].call(this, args[index]);\\n }\\n return apply(func, this, args);\\n });\\n });\\n\\n /**\\n * Creates a function that invokes `func` with `partials` prepended to the\\n * arguments it receives. This method is like `_.bind` except it does **not**\\n * alter the `this` binding.\\n *\\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of partially\\n * applied functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.2.0\\n * @category Function\\n * @param {Function} func The function to partially apply arguments to.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new partially applied function.\\n * @example\\n *\\n * function greet(greeting, name) {\\n * return greeting + ' ' + name;\\n * }\\n *\\n * var sayHelloTo = _.partial(greet, 'hello');\\n * sayHelloTo('fred');\\n * // => 'hello fred'\\n *\\n * // Partially applied with placeholders.\\n * var greetFred = _.partial(greet, _, 'fred');\\n * greetFred('hi');\\n * // => 'hi fred'\\n */\\n var partial = baseRest(function(func, partials) {\\n var holders = replaceHolders(partials, getHolder(partial));\\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\\n });\\n\\n /**\\n * This method is like `_.partial` except that partially applied arguments\\n * are appended to the arguments it receives.\\n *\\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of partially\\n * applied functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Function\\n * @param {Function} func The function to partially apply arguments to.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new partially applied function.\\n * @example\\n *\\n * function greet(greeting, name) {\\n * return greeting + ' ' + name;\\n * }\\n *\\n * var greetFred = _.partialRight(greet, 'fred');\\n * greetFred('hi');\\n * // => 'hi fred'\\n *\\n * // Partially applied with placeholders.\\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\\n * sayHelloTo('fred');\\n * // => 'hello fred'\\n */\\n var partialRight = baseRest(function(func, partials) {\\n var holders = replaceHolders(partials, getHolder(partialRight));\\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with arguments arranged according\\n * to the specified `indexes` where the argument value at the first index is\\n * provided as the first argument, the argument value at the second index is\\n * provided as the second argument, and so on.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to rearrange arguments for.\\n * @param {...(number|number[])} indexes The arranged argument indexes.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var rearged = _.rearg(function(a, b, c) {\\n * return [a, b, c];\\n * }, [2, 0, 1]);\\n *\\n * rearged('b', 'c', 'a')\\n * // => ['a', 'b', 'c']\\n */\\n var rearg = flatRest(function(func, indexes) {\\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of the\\n * created function and arguments from `start` and beyond provided as\\n * an array.\\n *\\n * **Note:** This method is based on the\\n * [rest parameter](https://mdn.io/rest_parameters).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var say = _.rest(function(what, names) {\\n * return what + ' ' + _.initial(names).join(', ') +\\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\\n * });\\n *\\n * say('hello', 'fred', 'barney', 'pebbles');\\n * // => 'hello fred, barney, & pebbles'\\n */\\n function rest(func, start) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n start = start === undefined ? start : toInteger(start);\\n return baseRest(func, start);\\n }\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of the\\n * create function and an array of arguments much like\\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\\n *\\n * **Note:** This method is based on the\\n * [spread operator](https://mdn.io/spread_operator).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.2.0\\n * @category Function\\n * @param {Function} func The function to spread arguments over.\\n * @param {number} [start=0] The start position of the spread.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var say = _.spread(function(who, what) {\\n * return who + ' says ' + what;\\n * });\\n *\\n * say(['fred', 'hello']);\\n * // => 'fred says hello'\\n *\\n * var numbers = Promise.all([\\n * Promise.resolve(40),\\n * Promise.resolve(36)\\n * ]);\\n *\\n * numbers.then(_.spread(function(x, y) {\\n * return x + y;\\n * }));\\n * // => a Promise of 76\\n */\\n function spread(func, start) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\\n return baseRest(function(args) {\\n var array = args[start],\\n otherArgs = castSlice(args, 0, start);\\n\\n if (array) {\\n arrayPush(otherArgs, array);\\n }\\n return apply(func, this, otherArgs);\\n });\\n }\\n\\n /**\\n * Creates a throttled function that only invokes `func` at most once per\\n * every `wait` milliseconds. The throttled function comes with a `cancel`\\n * method to cancel delayed `func` invocations and a `flush` method to\\n * immediately invoke them. Provide `options` to indicate whether `func`\\n * should be invoked on the leading and/or trailing edge of the `wait`\\n * timeout. The `func` is invoked with the last arguments provided to the\\n * throttled function. Subsequent calls to the throttled function return the\\n * result of the last `func` invocation.\\n *\\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\\n * invoked on the trailing edge of the timeout only if the throttled function\\n * is invoked more than once during the `wait` timeout.\\n *\\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\\n *\\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\\n * for details over the differences between `_.throttle` and `_.debounce`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to throttle.\\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\\n * @param {Object} [options={}] The options object.\\n * @param {boolean} [options.leading=true]\\n * Specify invoking on the leading edge of the timeout.\\n * @param {boolean} [options.trailing=true]\\n * Specify invoking on the trailing edge of the timeout.\\n * @returns {Function} Returns the new throttled function.\\n * @example\\n *\\n * // Avoid excessively updating the position while scrolling.\\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\\n *\\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\\n * jQuery(element).on('click', throttled);\\n *\\n * // Cancel the trailing throttled invocation.\\n * jQuery(window).on('popstate', throttled.cancel);\\n */\\n function throttle(func, wait, options) {\\n var leading = true,\\n trailing = true;\\n\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n if (isObject(options)) {\\n leading = 'leading' in options ? !!options.leading : leading;\\n trailing = 'trailing' in options ? !!options.trailing : trailing;\\n }\\n return debounce(func, wait, {\\n 'leading': leading,\\n 'maxWait': wait,\\n 'trailing': trailing\\n });\\n }\\n\\n /**\\n * Creates a function that accepts up to one argument, ignoring any\\n * additional arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to cap arguments for.\\n * @returns {Function} Returns the new capped function.\\n * @example\\n *\\n * _.map(['6', '8', '10'], _.unary(parseInt));\\n * // => [6, 8, 10]\\n */\\n function unary(func) {\\n return ary(func, 1);\\n }\\n\\n /**\\n * Creates a function that provides `value` to `wrapper` as its first\\n * argument. Any additional arguments provided to the function are appended\\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\\n * binding of the created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {*} value The value to wrap.\\n * @param {Function} [wrapper=identity] The wrapper function.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var p = _.wrap(_.escape, function(func, text) {\\n * return '

' + func(text) + '

';\\n * });\\n *\\n * p('fred, barney, & pebbles');\\n * // => '

fred, barney, & pebbles

'\\n */\\n function wrap(value, wrapper) {\\n return partial(castFunction(wrapper), value);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Casts `value` as an array if it's not one.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.4.0\\n * @category Lang\\n * @param {*} value The value to inspect.\\n * @returns {Array} Returns the cast array.\\n * @example\\n *\\n * _.castArray(1);\\n * // => [1]\\n *\\n * _.castArray({ 'a': 1 });\\n * // => [{ 'a': 1 }]\\n *\\n * _.castArray('abc');\\n * // => ['abc']\\n *\\n * _.castArray(null);\\n * // => [null]\\n *\\n * _.castArray(undefined);\\n * // => [undefined]\\n *\\n * _.castArray();\\n * // => []\\n *\\n * var array = [1, 2, 3];\\n * console.log(_.castArray(array) === array);\\n * // => true\\n */\\n function castArray() {\\n if (!arguments.length) {\\n return [];\\n }\\n var value = arguments[0];\\n return isArray(value) ? value : [value];\\n }\\n\\n /**\\n * Creates a shallow clone of `value`.\\n *\\n * **Note:** This method is loosely based on the\\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\\n * arrays. The own enumerable properties of `arguments` objects are cloned\\n * as plain objects. An empty object is returned for uncloneable values such\\n * as error objects, functions, DOM nodes, and WeakMaps.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to clone.\\n * @returns {*} Returns the cloned value.\\n * @see _.cloneDeep\\n * @example\\n *\\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\\n *\\n * var shallow = _.clone(objects);\\n * console.log(shallow[0] === objects[0]);\\n * // => true\\n */\\n function clone(value) {\\n return baseClone(value, CLONE_SYMBOLS_FLAG);\\n }\\n\\n /**\\n * This method is like `_.clone` except that it accepts `customizer` which\\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\\n * cloning is handled by the method instead. The `customizer` is invoked with\\n * up to four arguments; (value [, index|key, object, stack]).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to clone.\\n * @param {Function} [customizer] The function to customize cloning.\\n * @returns {*} Returns the cloned value.\\n * @see _.cloneDeepWith\\n * @example\\n *\\n * function customizer(value) {\\n * if (_.isElement(value)) {\\n * return value.cloneNode(false);\\n * }\\n * }\\n *\\n * var el = _.cloneWith(document.body, customizer);\\n *\\n * console.log(el === document.body);\\n * // => false\\n * console.log(el.nodeName);\\n * // => 'BODY'\\n * console.log(el.childNodes.length);\\n * // => 0\\n */\\n function cloneWith(value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\\n }\\n\\n /**\\n * This method is like `_.clone` except that it recursively clones `value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Lang\\n * @param {*} value The value to recursively clone.\\n * @returns {*} Returns the deep cloned value.\\n * @see _.clone\\n * @example\\n *\\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\\n *\\n * var deep = _.cloneDeep(objects);\\n * console.log(deep[0] === objects[0]);\\n * // => false\\n */\\n function cloneDeep(value) {\\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\\n }\\n\\n /**\\n * This method is like `_.cloneWith` except that it recursively clones `value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to recursively clone.\\n * @param {Function} [customizer] The function to customize cloning.\\n * @returns {*} Returns the deep cloned value.\\n * @see _.cloneWith\\n * @example\\n *\\n * function customizer(value) {\\n * if (_.isElement(value)) {\\n * return value.cloneNode(true);\\n * }\\n * }\\n *\\n * var el = _.cloneDeepWith(document.body, customizer);\\n *\\n * console.log(el === document.body);\\n * // => false\\n * console.log(el.nodeName);\\n * // => 'BODY'\\n * console.log(el.childNodes.length);\\n * // => 20\\n */\\n function cloneDeepWith(value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\\n }\\n\\n /**\\n * Checks if `object` conforms to `source` by invoking the predicate\\n * properties of `source` with the corresponding property values of `object`.\\n *\\n * **Note:** This method is equivalent to `_.conforms` when `source` is\\n * partially applied.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.14.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n *\\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\\n * // => true\\n *\\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\\n * // => false\\n */\\n function conformsTo(object, source) {\\n return source == null || baseConformsTo(object, source, keys(source));\\n }\\n\\n /**\\n * Performs a\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * comparison between two values to determine if they are equivalent.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1 };\\n * var other = { 'a': 1 };\\n *\\n * _.eq(object, object);\\n * // => true\\n *\\n * _.eq(object, other);\\n * // => false\\n *\\n * _.eq('a', 'a');\\n * // => true\\n *\\n * _.eq('a', Object('a'));\\n * // => false\\n *\\n * _.eq(NaN, NaN);\\n * // => true\\n */\\n function eq(value, other) {\\n return value === other || (value !== value && other !== other);\\n }\\n\\n /**\\n * Checks if `value` is greater than `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\\n * else `false`.\\n * @see _.lt\\n * @example\\n *\\n * _.gt(3, 1);\\n * // => true\\n *\\n * _.gt(3, 3);\\n * // => false\\n *\\n * _.gt(1, 3);\\n * // => false\\n */\\n var gt = createRelationalOperation(baseGt);\\n\\n /**\\n * Checks if `value` is greater than or equal to `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\\n * `other`, else `false`.\\n * @see _.lte\\n * @example\\n *\\n * _.gte(3, 1);\\n * // => true\\n *\\n * _.gte(3, 3);\\n * // => true\\n *\\n * _.gte(1, 3);\\n * // => false\\n */\\n var gte = createRelationalOperation(function(value, other) {\\n return value >= other;\\n });\\n\\n /**\\n * Checks if `value` is likely an `arguments` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\\n * else `false`.\\n * @example\\n *\\n * _.isArguments(function() { return arguments; }());\\n * // => true\\n *\\n * _.isArguments([1, 2, 3]);\\n * // => false\\n */\\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\\n !propertyIsEnumerable.call(value, 'callee');\\n };\\n\\n /**\\n * Checks if `value` is classified as an `Array` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\\n * @example\\n *\\n * _.isArray([1, 2, 3]);\\n * // => true\\n *\\n * _.isArray(document.body.children);\\n * // => false\\n *\\n * _.isArray('abc');\\n * // => false\\n *\\n * _.isArray(_.noop);\\n * // => false\\n */\\n var isArray = Array.isArray;\\n\\n /**\\n * Checks if `value` is classified as an `ArrayBuffer` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\\n * @example\\n *\\n * _.isArrayBuffer(new ArrayBuffer(2));\\n * // => true\\n *\\n * _.isArrayBuffer(new Array(2));\\n * // => false\\n */\\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\\n\\n /**\\n * Checks if `value` is array-like. A value is considered array-like if it's\\n * not a function and has a `value.length` that's an integer greater than or\\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\\n * @example\\n *\\n * _.isArrayLike([1, 2, 3]);\\n * // => true\\n *\\n * _.isArrayLike(document.body.children);\\n * // => true\\n *\\n * _.isArrayLike('abc');\\n * // => true\\n *\\n * _.isArrayLike(_.noop);\\n * // => false\\n */\\n function isArrayLike(value) {\\n return value != null && isLength(value.length) && !isFunction(value);\\n }\\n\\n /**\\n * This method is like `_.isArrayLike` except that it also checks if `value`\\n * is an object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array-like object,\\n * else `false`.\\n * @example\\n *\\n * _.isArrayLikeObject([1, 2, 3]);\\n * // => true\\n *\\n * _.isArrayLikeObject(document.body.children);\\n * // => true\\n *\\n * _.isArrayLikeObject('abc');\\n * // => false\\n *\\n * _.isArrayLikeObject(_.noop);\\n * // => false\\n */\\n function isArrayLikeObject(value) {\\n return isObjectLike(value) && isArrayLike(value);\\n }\\n\\n /**\\n * Checks if `value` is classified as a boolean primitive or object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\\n * @example\\n *\\n * _.isBoolean(false);\\n * // => true\\n *\\n * _.isBoolean(null);\\n * // => false\\n */\\n function isBoolean(value) {\\n return value === true || value === false ||\\n (isObjectLike(value) && baseGetTag(value) == boolTag);\\n }\\n\\n /**\\n * Checks if `value` is a buffer.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\\n * @example\\n *\\n * _.isBuffer(new Buffer(2));\\n * // => true\\n *\\n * _.isBuffer(new Uint8Array(2));\\n * // => false\\n */\\n var isBuffer = nativeIsBuffer || stubFalse;\\n\\n /**\\n * Checks if `value` is classified as a `Date` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\\n * @example\\n *\\n * _.isDate(new Date);\\n * // => true\\n *\\n * _.isDate('Mon April 23 2012');\\n * // => false\\n */\\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\\n\\n /**\\n * Checks if `value` is likely a DOM element.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\\n * @example\\n *\\n * _.isElement(document.body);\\n * // => true\\n *\\n * _.isElement('');\\n * // => false\\n */\\n function isElement(value) {\\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\\n }\\n\\n /**\\n * Checks if `value` is an empty object, collection, map, or set.\\n *\\n * Objects are considered empty if they have no own enumerable string keyed\\n * properties.\\n *\\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\\n * jQuery-like collections are considered empty if they have a `length` of `0`.\\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\\n * @example\\n *\\n * _.isEmpty(null);\\n * // => true\\n *\\n * _.isEmpty(true);\\n * // => true\\n *\\n * _.isEmpty(1);\\n * // => true\\n *\\n * _.isEmpty([1, 2, 3]);\\n * // => false\\n *\\n * _.isEmpty({ 'a': 1 });\\n * // => false\\n */\\n function isEmpty(value) {\\n if (value == null) {\\n return true;\\n }\\n if (isArrayLike(value) &&\\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\\n return !value.length;\\n }\\n var tag = getTag(value);\\n if (tag == mapTag || tag == setTag) {\\n return !value.size;\\n }\\n if (isPrototype(value)) {\\n return !baseKeys(value).length;\\n }\\n for (var key in value) {\\n if (hasOwnProperty.call(value, key)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * Performs a deep comparison between two values to determine if they are\\n * equivalent.\\n *\\n * **Note:** This method supports comparing arrays, array buffers, booleans,\\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\\n * by their own, not inherited, enumerable properties. Functions and DOM\\n * nodes are compared by strict equality, i.e. `===`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1 };\\n * var other = { 'a': 1 };\\n *\\n * _.isEqual(object, other);\\n * // => true\\n *\\n * object === other;\\n * // => false\\n */\\n function isEqual(value, other) {\\n return baseIsEqual(value, other);\\n }\\n\\n /**\\n * This method is like `_.isEqual` except that it accepts `customizer` which\\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\\n * are handled by the method instead. The `customizer` is invoked with up to\\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * function isGreeting(value) {\\n * return /^h(?:i|ello)$/.test(value);\\n * }\\n *\\n * function customizer(objValue, othValue) {\\n * if (isGreeting(objValue) && isGreeting(othValue)) {\\n * return true;\\n * }\\n * }\\n *\\n * var array = ['hello', 'goodbye'];\\n * var other = ['hi', 'goodbye'];\\n *\\n * _.isEqualWith(array, other, customizer);\\n * // => true\\n */\\n function isEqualWith(value, other, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n var result = customizer ? customizer(value, other) : undefined;\\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\\n }\\n\\n /**\\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\\n * `SyntaxError`, `TypeError`, or `URIError` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\\n * @example\\n *\\n * _.isError(new Error);\\n * // => true\\n *\\n * _.isError(Error);\\n * // => false\\n */\\n function isError(value) {\\n if (!isObjectLike(value)) {\\n return false;\\n }\\n var tag = baseGetTag(value);\\n return tag == errorTag || tag == domExcTag ||\\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\\n }\\n\\n /**\\n * Checks if `value` is a finite primitive number.\\n *\\n * **Note:** This method is based on\\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\\n * @example\\n *\\n * _.isFinite(3);\\n * // => true\\n *\\n * _.isFinite(Number.MIN_VALUE);\\n * // => true\\n *\\n * _.isFinite(Infinity);\\n * // => false\\n *\\n * _.isFinite('3');\\n * // => false\\n */\\n function isFinite(value) {\\n return typeof value == 'number' && nativeIsFinite(value);\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Function` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\\n * @example\\n *\\n * _.isFunction(_);\\n * // => true\\n *\\n * _.isFunction(/abc/);\\n * // => false\\n */\\n function isFunction(value) {\\n if (!isObject(value)) {\\n return false;\\n }\\n // The use of `Object#toString` avoids issues with the `typeof` operator\\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\\n var tag = baseGetTag(value);\\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\\n }\\n\\n /**\\n * Checks if `value` is an integer.\\n *\\n * **Note:** This method is based on\\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\\n * @example\\n *\\n * _.isInteger(3);\\n * // => true\\n *\\n * _.isInteger(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isInteger(Infinity);\\n * // => false\\n *\\n * _.isInteger('3');\\n * // => false\\n */\\n function isInteger(value) {\\n return typeof value == 'number' && value == toInteger(value);\\n }\\n\\n /**\\n * Checks if `value` is a valid array-like length.\\n *\\n * **Note:** This method is loosely based on\\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\\n * @example\\n *\\n * _.isLength(3);\\n * // => true\\n *\\n * _.isLength(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isLength(Infinity);\\n * // => false\\n *\\n * _.isLength('3');\\n * // => false\\n */\\n function isLength(value) {\\n return typeof value == 'number' &&\\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\\n }\\n\\n /**\\n * Checks if `value` is the\\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\\n * @example\\n *\\n * _.isObject({});\\n * // => true\\n *\\n * _.isObject([1, 2, 3]);\\n * // => true\\n *\\n * _.isObject(_.noop);\\n * // => true\\n *\\n * _.isObject(null);\\n * // => false\\n */\\n function isObject(value) {\\n var type = typeof value;\\n return value != null && (type == 'object' || type == 'function');\\n }\\n\\n /**\\n * Checks if `value` is object-like. A value is object-like if it's not `null`\\n * and has a `typeof` result of \\\"object\\\".\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\\n * @example\\n *\\n * _.isObjectLike({});\\n * // => true\\n *\\n * _.isObjectLike([1, 2, 3]);\\n * // => true\\n *\\n * _.isObjectLike(_.noop);\\n * // => false\\n *\\n * _.isObjectLike(null);\\n * // => false\\n */\\n function isObjectLike(value) {\\n return value != null && typeof value == 'object';\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Map` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\\n * @example\\n *\\n * _.isMap(new Map);\\n * // => true\\n *\\n * _.isMap(new WeakMap);\\n * // => false\\n */\\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\\n\\n /**\\n * Performs a partial deep comparison between `object` and `source` to\\n * determine if `object` contains equivalent property values.\\n *\\n * **Note:** This method is equivalent to `_.matches` when `source` is\\n * partially applied.\\n *\\n * Partial comparisons will match empty array and empty object `source`\\n * values against any array or object value, respectively. See `_.isEqual`\\n * for a list of supported value comparisons.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n *\\n * _.isMatch(object, { 'b': 2 });\\n * // => true\\n *\\n * _.isMatch(object, { 'b': 1 });\\n * // => false\\n */\\n function isMatch(object, source) {\\n return object === source || baseIsMatch(object, source, getMatchData(source));\\n }\\n\\n /**\\n * This method is like `_.isMatch` except that it accepts `customizer` which\\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\\n * are handled by the method instead. The `customizer` is invoked with five\\n * arguments: (objValue, srcValue, index|key, object, source).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n * @example\\n *\\n * function isGreeting(value) {\\n * return /^h(?:i|ello)$/.test(value);\\n * }\\n *\\n * function customizer(objValue, srcValue) {\\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\\n * return true;\\n * }\\n * }\\n *\\n * var object = { 'greeting': 'hello' };\\n * var source = { 'greeting': 'hi' };\\n *\\n * _.isMatchWith(object, source, customizer);\\n * // => true\\n */\\n function isMatchWith(object, source, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseIsMatch(object, source, getMatchData(source), customizer);\\n }\\n\\n /**\\n * Checks if `value` is `NaN`.\\n *\\n * **Note:** This method is based on\\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\\n * `undefined` and other non-number values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\\n * @example\\n *\\n * _.isNaN(NaN);\\n * // => true\\n *\\n * _.isNaN(new Number(NaN));\\n * // => true\\n *\\n * isNaN(undefined);\\n * // => true\\n *\\n * _.isNaN(undefined);\\n * // => false\\n */\\n function isNaN(value) {\\n // An `NaN` primitive is the only value that is not equal to itself.\\n // Perform the `toStringTag` check first to avoid errors with some\\n // ActiveX objects in IE.\\n return isNumber(value) && value != +value;\\n }\\n\\n /**\\n * Checks if `value` is a pristine native function.\\n *\\n * **Note:** This method can't reliably detect native functions in the presence\\n * of the core-js package because core-js circumvents this kind of detection.\\n * Despite multiple requests, the core-js maintainer has made it clear: any\\n * attempt to fix the detection will be obstructed. As a result, we're left\\n * with little choice but to throw an error. Unfortunately, this also affects\\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\\n * which rely on core-js.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a native function,\\n * else `false`.\\n * @example\\n *\\n * _.isNative(Array.prototype.push);\\n * // => true\\n *\\n * _.isNative(_);\\n * // => false\\n */\\n function isNative(value) {\\n if (isMaskable(value)) {\\n throw new Error(CORE_ERROR_TEXT);\\n }\\n return baseIsNative(value);\\n }\\n\\n /**\\n * Checks if `value` is `null`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\\n * @example\\n *\\n * _.isNull(null);\\n * // => true\\n *\\n * _.isNull(void 0);\\n * // => false\\n */\\n function isNull(value) {\\n return value === null;\\n }\\n\\n /**\\n * Checks if `value` is `null` or `undefined`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\\n * @example\\n *\\n * _.isNil(null);\\n * // => true\\n *\\n * _.isNil(void 0);\\n * // => true\\n *\\n * _.isNil(NaN);\\n * // => false\\n */\\n function isNil(value) {\\n return value == null;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Number` primitive or object.\\n *\\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\\n * classified as numbers, use the `_.isFinite` method.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\\n * @example\\n *\\n * _.isNumber(3);\\n * // => true\\n *\\n * _.isNumber(Number.MIN_VALUE);\\n * // => true\\n *\\n * _.isNumber(Infinity);\\n * // => true\\n *\\n * _.isNumber('3');\\n * // => false\\n */\\n function isNumber(value) {\\n return typeof value == 'number' ||\\n (isObjectLike(value) && baseGetTag(value) == numberTag);\\n }\\n\\n /**\\n * Checks if `value` is a plain object, that is, an object created by the\\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.8.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * _.isPlainObject(new Foo);\\n * // => false\\n *\\n * _.isPlainObject([1, 2, 3]);\\n * // => false\\n *\\n * _.isPlainObject({ 'x': 0, 'y': 0 });\\n * // => true\\n *\\n * _.isPlainObject(Object.create(null));\\n * // => true\\n */\\n function isPlainObject(value) {\\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\\n return false;\\n }\\n var proto = getPrototype(value);\\n if (proto === null) {\\n return true;\\n }\\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\\n funcToString.call(Ctor) == objectCtorString;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `RegExp` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\\n * @example\\n *\\n * _.isRegExp(/abc/);\\n * // => true\\n *\\n * _.isRegExp('/abc/');\\n * // => false\\n */\\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\\n\\n /**\\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\\n * double precision number which isn't the result of a rounded unsafe integer.\\n *\\n * **Note:** This method is based on\\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\\n * @example\\n *\\n * _.isSafeInteger(3);\\n * // => true\\n *\\n * _.isSafeInteger(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isSafeInteger(Infinity);\\n * // => false\\n *\\n * _.isSafeInteger('3');\\n * // => false\\n */\\n function isSafeInteger(value) {\\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Set` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\\n * @example\\n *\\n * _.isSet(new Set);\\n * // => true\\n *\\n * _.isSet(new WeakSet);\\n * // => false\\n */\\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\\n\\n /**\\n * Checks if `value` is classified as a `String` primitive or object.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\\n * @example\\n *\\n * _.isString('abc');\\n * // => true\\n *\\n * _.isString(1);\\n * // => false\\n */\\n function isString(value) {\\n return typeof value == 'string' ||\\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Symbol` primitive or object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\\n * @example\\n *\\n * _.isSymbol(Symbol.iterator);\\n * // => true\\n *\\n * _.isSymbol('abc');\\n * // => false\\n */\\n function isSymbol(value) {\\n return typeof value == 'symbol' ||\\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\\n }\\n\\n /**\\n * Checks if `value` is classified as a typed array.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\\n * @example\\n *\\n * _.isTypedArray(new Uint8Array);\\n * // => true\\n *\\n * _.isTypedArray([]);\\n * // => false\\n */\\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\\n\\n /**\\n * Checks if `value` is `undefined`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\\n * @example\\n *\\n * _.isUndefined(void 0);\\n * // => true\\n *\\n * _.isUndefined(null);\\n * // => false\\n */\\n function isUndefined(value) {\\n return value === undefined;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `WeakMap` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\\n * @example\\n *\\n * _.isWeakMap(new WeakMap);\\n * // => true\\n *\\n * _.isWeakMap(new Map);\\n * // => false\\n */\\n function isWeakMap(value) {\\n return isObjectLike(value) && getTag(value) == weakMapTag;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `WeakSet` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\\n * @example\\n *\\n * _.isWeakSet(new WeakSet);\\n * // => true\\n *\\n * _.isWeakSet(new Set);\\n * // => false\\n */\\n function isWeakSet(value) {\\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\\n }\\n\\n /**\\n * Checks if `value` is less than `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than `other`,\\n * else `false`.\\n * @see _.gt\\n * @example\\n *\\n * _.lt(1, 3);\\n * // => true\\n *\\n * _.lt(3, 3);\\n * // => false\\n *\\n * _.lt(3, 1);\\n * // => false\\n */\\n var lt = createRelationalOperation(baseLt);\\n\\n /**\\n * Checks if `value` is less than or equal to `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than or equal to\\n * `other`, else `false`.\\n * @see _.gte\\n * @example\\n *\\n * _.lte(1, 3);\\n * // => true\\n *\\n * _.lte(3, 3);\\n * // => true\\n *\\n * _.lte(3, 1);\\n * // => false\\n */\\n var lte = createRelationalOperation(function(value, other) {\\n return value <= other;\\n });\\n\\n /**\\n * Converts `value` to an array.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {Array} Returns the converted array.\\n * @example\\n *\\n * _.toArray({ 'a': 1, 'b': 2 });\\n * // => [1, 2]\\n *\\n * _.toArray('abc');\\n * // => ['a', 'b', 'c']\\n *\\n * _.toArray(1);\\n * // => []\\n *\\n * _.toArray(null);\\n * // => []\\n */\\n function toArray(value) {\\n if (!value) {\\n return [];\\n }\\n if (isArrayLike(value)) {\\n return isString(value) ? stringToArray(value) : copyArray(value);\\n }\\n if (symIterator && value[symIterator]) {\\n return iteratorToArray(value[symIterator]());\\n }\\n var tag = getTag(value),\\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\\n\\n return func(value);\\n }\\n\\n /**\\n * Converts `value` to a finite number.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.12.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted number.\\n * @example\\n *\\n * _.toFinite(3.2);\\n * // => 3.2\\n *\\n * _.toFinite(Number.MIN_VALUE);\\n * // => 5e-324\\n *\\n * _.toFinite(Infinity);\\n * // => 1.7976931348623157e+308\\n *\\n * _.toFinite('3.2');\\n * // => 3.2\\n */\\n function toFinite(value) {\\n if (!value) {\\n return value === 0 ? value : 0;\\n }\\n value = toNumber(value);\\n if (value === INFINITY || value === -INFINITY) {\\n var sign = (value < 0 ? -1 : 1);\\n return sign * MAX_INTEGER;\\n }\\n return value === value ? value : 0;\\n }\\n\\n /**\\n * Converts `value` to an integer.\\n *\\n * **Note:** This method is loosely based on\\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toInteger(3.2);\\n * // => 3\\n *\\n * _.toInteger(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toInteger(Infinity);\\n * // => 1.7976931348623157e+308\\n *\\n * _.toInteger('3.2');\\n * // => 3\\n */\\n function toInteger(value) {\\n var result = toFinite(value),\\n remainder = result % 1;\\n\\n return result === result ? (remainder ? result - remainder : result) : 0;\\n }\\n\\n /**\\n * Converts `value` to an integer suitable for use as the length of an\\n * array-like object.\\n *\\n * **Note:** This method is based on\\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toLength(3.2);\\n * // => 3\\n *\\n * _.toLength(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toLength(Infinity);\\n * // => 4294967295\\n *\\n * _.toLength('3.2');\\n * // => 3\\n */\\n function toLength(value) {\\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\\n }\\n\\n /**\\n * Converts `value` to a number.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to process.\\n * @returns {number} Returns the number.\\n * @example\\n *\\n * _.toNumber(3.2);\\n * // => 3.2\\n *\\n * _.toNumber(Number.MIN_VALUE);\\n * // => 5e-324\\n *\\n * _.toNumber(Infinity);\\n * // => Infinity\\n *\\n * _.toNumber('3.2');\\n * // => 3.2\\n */\\n function toNumber(value) {\\n if (typeof value == 'number') {\\n return value;\\n }\\n if (isSymbol(value)) {\\n return NAN;\\n }\\n if (isObject(value)) {\\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\\n value = isObject(other) ? (other + '') : other;\\n }\\n if (typeof value != 'string') {\\n return value === 0 ? value : +value;\\n }\\n value = value.replace(reTrim, '');\\n var isBinary = reIsBinary.test(value);\\n return (isBinary || reIsOctal.test(value))\\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\\n : (reIsBadHex.test(value) ? NAN : +value);\\n }\\n\\n /**\\n * Converts `value` to a plain object flattening inherited enumerable string\\n * keyed properties of `value` to own properties of the plain object.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {Object} Returns the converted plain object.\\n * @example\\n *\\n * function Foo() {\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.assign({ 'a': 1 }, new Foo);\\n * // => { 'a': 1, 'b': 2 }\\n *\\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\\n * // => { 'a': 1, 'b': 2, 'c': 3 }\\n */\\n function toPlainObject(value) {\\n return copyObject(value, keysIn(value));\\n }\\n\\n /**\\n * Converts `value` to a safe integer. A safe integer can be compared and\\n * represented correctly.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toSafeInteger(3.2);\\n * // => 3\\n *\\n * _.toSafeInteger(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toSafeInteger(Infinity);\\n * // => 9007199254740991\\n *\\n * _.toSafeInteger('3.2');\\n * // => 3\\n */\\n function toSafeInteger(value) {\\n return value\\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\\n : (value === 0 ? value : 0);\\n }\\n\\n /**\\n * Converts `value` to a string. An empty string is returned for `null`\\n * and `undefined` values. The sign of `-0` is preserved.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {string} Returns the converted string.\\n * @example\\n *\\n * _.toString(null);\\n * // => ''\\n *\\n * _.toString(-0);\\n * // => '-0'\\n *\\n * _.toString([1, 2, 3]);\\n * // => '1,2,3'\\n */\\n function toString(value) {\\n return value == null ? '' : baseToString(value);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Assigns own enumerable string keyed properties of source objects to the\\n * destination object. Source objects are applied from left to right.\\n * Subsequent sources overwrite property assignments of previous sources.\\n *\\n * **Note:** This method mutates `object` and is loosely based on\\n * [`Object.assign`](https://mdn.io/Object/assign).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.10.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.assignIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * function Bar() {\\n * this.c = 3;\\n * }\\n *\\n * Foo.prototype.b = 2;\\n * Bar.prototype.d = 4;\\n *\\n * _.assign({ 'a': 0 }, new Foo, new Bar);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n var assign = createAssigner(function(object, source) {\\n if (isPrototype(source) || isArrayLike(source)) {\\n copyObject(source, keys(source), object);\\n return;\\n }\\n for (var key in source) {\\n if (hasOwnProperty.call(source, key)) {\\n assignValue(object, key, source[key]);\\n }\\n }\\n });\\n\\n /**\\n * This method is like `_.assign` except that it iterates over own and\\n * inherited source properties.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias extend\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.assign\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * function Bar() {\\n * this.c = 3;\\n * }\\n *\\n * Foo.prototype.b = 2;\\n * Bar.prototype.d = 4;\\n *\\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\\n */\\n var assignIn = createAssigner(function(object, source) {\\n copyObject(source, keysIn(source), object);\\n });\\n\\n /**\\n * This method is like `_.assignIn` except that it accepts `customizer`\\n * which is invoked to produce the assigned values. If `customizer` returns\\n * `undefined`, assignment is handled by the method instead. The `customizer`\\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias extendWith\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @see _.assignWith\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * return _.isUndefined(objValue) ? srcValue : objValue;\\n * }\\n *\\n * var defaults = _.partialRight(_.assignInWith, customizer);\\n *\\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\\n copyObject(source, keysIn(source), object, customizer);\\n });\\n\\n /**\\n * This method is like `_.assign` except that it accepts `customizer`\\n * which is invoked to produce the assigned values. If `customizer` returns\\n * `undefined`, assignment is handled by the method instead. The `customizer`\\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @see _.assignInWith\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * return _.isUndefined(objValue) ? srcValue : objValue;\\n * }\\n *\\n * var defaults = _.partialRight(_.assignWith, customizer);\\n *\\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\\n copyObject(source, keys(source), object, customizer);\\n });\\n\\n /**\\n * Creates an array of values corresponding to `paths` of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Array} Returns the picked values.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\\n *\\n * _.at(object, ['a[0].b.c', 'a[1]']);\\n * // => [3, 4]\\n */\\n var at = flatRest(baseAt);\\n\\n /**\\n * Creates an object that inherits from the `prototype` object. If a\\n * `properties` object is given, its own enumerable string keyed properties\\n * are assigned to the created object.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.3.0\\n * @category Object\\n * @param {Object} prototype The object to inherit from.\\n * @param {Object} [properties] The properties to assign to the object.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * function Shape() {\\n * this.x = 0;\\n * this.y = 0;\\n * }\\n *\\n * function Circle() {\\n * Shape.call(this);\\n * }\\n *\\n * Circle.prototype = _.create(Shape.prototype, {\\n * 'constructor': Circle\\n * });\\n *\\n * var circle = new Circle;\\n * circle instanceof Circle;\\n * // => true\\n *\\n * circle instanceof Shape;\\n * // => true\\n */\\n function create(prototype, properties) {\\n var result = baseCreate(prototype);\\n return properties == null ? result : baseAssign(result, properties);\\n }\\n\\n /**\\n * Assigns own and inherited enumerable string keyed properties of source\\n * objects to the destination object for all destination properties that\\n * resolve to `undefined`. Source objects are applied from left to right.\\n * Once a property is set, additional values of the same property are ignored.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.defaultsDeep\\n * @example\\n *\\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var defaults = baseRest(function(args) {\\n args.push(undefined, customDefaultsAssignIn);\\n return apply(assignInWith, undefined, args);\\n });\\n\\n /**\\n * This method is like `_.defaults` except that it recursively assigns\\n * default properties.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.10.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.defaults\\n * @example\\n *\\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\\n * // => { 'a': { 'b': 2, 'c': 3 } }\\n */\\n var defaultsDeep = baseRest(function(args) {\\n args.push(undefined, customDefaultsMerge);\\n return apply(mergeWith, undefined, args);\\n });\\n\\n /**\\n * This method is like `_.find` except that it returns the key of the first\\n * element `predicate` returns truthy for instead of the element itself.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {string|undefined} Returns the key of the matched element,\\n * else `undefined`.\\n * @example\\n *\\n * var users = {\\n * 'barney': { 'age': 36, 'active': true },\\n * 'fred': { 'age': 40, 'active': false },\\n * 'pebbles': { 'age': 1, 'active': true }\\n * };\\n *\\n * _.findKey(users, function(o) { return o.age < 40; });\\n * // => 'barney' (iteration order is not guaranteed)\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findKey(users, { 'age': 1, 'active': true });\\n * // => 'pebbles'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findKey(users, ['active', false]);\\n * // => 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findKey(users, 'active');\\n * // => 'barney'\\n */\\n function findKey(object, predicate) {\\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\\n }\\n\\n /**\\n * This method is like `_.findKey` except that it iterates over elements of\\n * a collection in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {string|undefined} Returns the key of the matched element,\\n * else `undefined`.\\n * @example\\n *\\n * var users = {\\n * 'barney': { 'age': 36, 'active': true },\\n * 'fred': { 'age': 40, 'active': false },\\n * 'pebbles': { 'age': 1, 'active': true }\\n * };\\n *\\n * _.findLastKey(users, function(o) { return o.age < 40; });\\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findLastKey(users, { 'age': 36, 'active': true });\\n * // => 'barney'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findLastKey(users, ['active', false]);\\n * // => 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findLastKey(users, 'active');\\n * // => 'pebbles'\\n */\\n function findLastKey(object, predicate) {\\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\\n }\\n\\n /**\\n * Iterates over own and inherited enumerable string keyed properties of an\\n * object and invokes `iteratee` for each property. The iteratee is invoked\\n * with three arguments: (value, key, object). Iteratee functions may exit\\n * iteration early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forInRight\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forIn(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\\n */\\n function forIn(object, iteratee) {\\n return object == null\\n ? object\\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\\n }\\n\\n /**\\n * This method is like `_.forIn` except that it iterates over properties of\\n * `object` in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forInRight(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\\n */\\n function forInRight(object, iteratee) {\\n return object == null\\n ? object\\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\\n }\\n\\n /**\\n * Iterates over own enumerable string keyed properties of an object and\\n * invokes `iteratee` for each property. The iteratee is invoked with three\\n * arguments: (value, key, object). Iteratee functions may exit iteration\\n * early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forOwnRight\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forOwn(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\\n */\\n function forOwn(object, iteratee) {\\n return object && baseForOwn(object, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.forOwn` except that it iterates over properties of\\n * `object` in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forOwn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forOwnRight(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\\n */\\n function forOwnRight(object, iteratee) {\\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * Creates an array of function property names from own enumerable properties\\n * of `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @returns {Array} Returns the function names.\\n * @see _.functionsIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = _.constant('a');\\n * this.b = _.constant('b');\\n * }\\n *\\n * Foo.prototype.c = _.constant('c');\\n *\\n * _.functions(new Foo);\\n * // => ['a', 'b']\\n */\\n function functions(object) {\\n return object == null ? [] : baseFunctions(object, keys(object));\\n }\\n\\n /**\\n * Creates an array of function property names from own and inherited\\n * enumerable properties of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @returns {Array} Returns the function names.\\n * @see _.functions\\n * @example\\n *\\n * function Foo() {\\n * this.a = _.constant('a');\\n * this.b = _.constant('b');\\n * }\\n *\\n * Foo.prototype.c = _.constant('c');\\n *\\n * _.functionsIn(new Foo);\\n * // => ['a', 'b', 'c']\\n */\\n function functionsIn(object) {\\n return object == null ? [] : baseFunctions(object, keysIn(object));\\n }\\n\\n /**\\n * Gets the value at `path` of `object`. If the resolved value is\\n * `undefined`, the `defaultValue` is returned in its place.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.7.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to get.\\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\\n * @returns {*} Returns the resolved value.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.get(object, 'a[0].b.c');\\n * // => 3\\n *\\n * _.get(object, ['a', '0', 'b', 'c']);\\n * // => 3\\n *\\n * _.get(object, 'a.b.c', 'default');\\n * // => 'default'\\n */\\n function get(object, path, defaultValue) {\\n var result = object == null ? undefined : baseGet(object, path);\\n return result === undefined ? defaultValue : result;\\n }\\n\\n /**\\n * Checks if `path` is a direct property of `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n * @example\\n *\\n * var object = { 'a': { 'b': 2 } };\\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\\n *\\n * _.has(object, 'a');\\n * // => true\\n *\\n * _.has(object, 'a.b');\\n * // => true\\n *\\n * _.has(object, ['a', 'b']);\\n * // => true\\n *\\n * _.has(other, 'a');\\n * // => false\\n */\\n function has(object, path) {\\n return object != null && hasPath(object, path, baseHas);\\n }\\n\\n /**\\n * Checks if `path` is a direct or inherited property of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n * @example\\n *\\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\\n *\\n * _.hasIn(object, 'a');\\n * // => true\\n *\\n * _.hasIn(object, 'a.b');\\n * // => true\\n *\\n * _.hasIn(object, ['a', 'b']);\\n * // => true\\n *\\n * _.hasIn(object, 'b');\\n * // => false\\n */\\n function hasIn(object, path) {\\n return object != null && hasPath(object, path, baseHasIn);\\n }\\n\\n /**\\n * Creates an object composed of the inverted keys and values of `object`.\\n * If `object` contains duplicate values, subsequent values overwrite\\n * property assignments of previous values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.7.0\\n * @category Object\\n * @param {Object} object The object to invert.\\n * @returns {Object} Returns the new inverted object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\\n *\\n * _.invert(object);\\n * // => { '1': 'c', '2': 'b' }\\n */\\n var invert = createInverter(function(result, value, key) {\\n result[value] = key;\\n }, constant(identity));\\n\\n /**\\n * This method is like `_.invert` except that the inverted object is generated\\n * from the results of running each element of `object` thru `iteratee`. The\\n * corresponding inverted value of each inverted key is an array of keys\\n * responsible for generating the inverted value. The iteratee is invoked\\n * with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.1.0\\n * @category Object\\n * @param {Object} object The object to invert.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Object} Returns the new inverted object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\\n *\\n * _.invertBy(object);\\n * // => { '1': ['a', 'c'], '2': ['b'] }\\n *\\n * _.invertBy(object, function(value) {\\n * return 'group' + value;\\n * });\\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\\n */\\n var invertBy = createInverter(function(result, value, key) {\\n if (hasOwnProperty.call(result, value)) {\\n result[value].push(key);\\n } else {\\n result[value] = [key];\\n }\\n }, getIteratee);\\n\\n /**\\n * Invokes the method at `path` of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the method to invoke.\\n * @param {...*} [args] The arguments to invoke the method with.\\n * @returns {*} Returns the result of the invoked method.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\\n *\\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\\n * // => [2, 3]\\n */\\n var invoke = baseRest(baseInvoke);\\n\\n /**\\n * Creates an array of the own enumerable property names of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects. See the\\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\\n * for more details.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.keys(new Foo);\\n * // => ['a', 'b'] (iteration order is not guaranteed)\\n *\\n * _.keys('hi');\\n * // => ['0', '1']\\n */\\n function keys(object) {\\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\\n }\\n\\n /**\\n * Creates an array of the own and inherited enumerable property names of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.keysIn(new Foo);\\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\\n */\\n function keysIn(object) {\\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\\n }\\n\\n /**\\n * The opposite of `_.mapValues`; this method creates an object with the\\n * same values as `object` and keys generated by running each own enumerable\\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\\n * with three arguments: (value, key, object).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns the new mapped object.\\n * @see _.mapValues\\n * @example\\n *\\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\\n * return key + value;\\n * });\\n * // => { 'a1': 1, 'b2': 2 }\\n */\\n function mapKeys(object, iteratee) {\\n var result = {};\\n iteratee = getIteratee(iteratee, 3);\\n\\n baseForOwn(object, function(value, key, object) {\\n baseAssignValue(result, iteratee(value, key, object), value);\\n });\\n return result;\\n }\\n\\n /**\\n * Creates an object with the same keys as `object` and values generated\\n * by running each own enumerable string keyed property of `object` thru\\n * `iteratee`. The iteratee is invoked with three arguments:\\n * (value, key, object).\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns the new mapped object.\\n * @see _.mapKeys\\n * @example\\n *\\n * var users = {\\n * 'fred': { 'user': 'fred', 'age': 40 },\\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\\n * };\\n *\\n * _.mapValues(users, function(o) { return o.age; });\\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.mapValues(users, 'age');\\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\\n */\\n function mapValues(object, iteratee) {\\n var result = {};\\n iteratee = getIteratee(iteratee, 3);\\n\\n baseForOwn(object, function(value, key, object) {\\n baseAssignValue(result, key, iteratee(value, key, object));\\n });\\n return result;\\n }\\n\\n /**\\n * This method is like `_.assign` except that it recursively merges own and\\n * inherited enumerable string keyed properties of source objects into the\\n * destination object. Source properties that resolve to `undefined` are\\n * skipped if a destination value exists. Array and plain object properties\\n * are merged recursively. Other objects and value types are overridden by\\n * assignment. Source objects are applied from left to right. Subsequent\\n * sources overwrite property assignments of previous sources.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {\\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\\n * };\\n *\\n * var other = {\\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\\n * };\\n *\\n * _.merge(object, other);\\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\\n */\\n var merge = createAssigner(function(object, source, srcIndex) {\\n baseMerge(object, source, srcIndex);\\n });\\n\\n /**\\n * This method is like `_.merge` except that it accepts `customizer` which\\n * is invoked to produce the merged values of the destination and source\\n * properties. If `customizer` returns `undefined`, merging is handled by the\\n * method instead. The `customizer` is invoked with six arguments:\\n * (objValue, srcValue, key, object, source, stack).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} customizer The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * if (_.isArray(objValue)) {\\n * return objValue.concat(srcValue);\\n * }\\n * }\\n *\\n * var object = { 'a': [1], 'b': [2] };\\n * var other = { 'a': [3], 'b': [4] };\\n *\\n * _.mergeWith(object, other, customizer);\\n * // => { 'a': [1, 3], 'b': [2, 4] }\\n */\\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\\n baseMerge(object, source, srcIndex, customizer);\\n });\\n\\n /**\\n * The opposite of `_.pick`; this method creates an object composed of the\\n * own and inherited enumerable property paths of `object` that are not omitted.\\n *\\n * **Note:** This method is considerably slower than `_.pick`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {...(string|string[])} [paths] The property paths to omit.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.omit(object, ['a', 'c']);\\n * // => { 'b': '2' }\\n */\\n var omit = flatRest(function(object, paths) {\\n var result = {};\\n if (object == null) {\\n return result;\\n }\\n var isDeep = false;\\n paths = arrayMap(paths, function(path) {\\n path = castPath(path, object);\\n isDeep || (isDeep = path.length > 1);\\n return path;\\n });\\n copyObject(object, getAllKeysIn(object), result);\\n if (isDeep) {\\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\\n }\\n var length = paths.length;\\n while (length--) {\\n baseUnset(result, paths[length]);\\n }\\n return result;\\n });\\n\\n /**\\n * The opposite of `_.pickBy`; this method creates an object composed of\\n * the own and inherited enumerable string keyed properties of `object` that\\n * `predicate` doesn't return truthy for. The predicate is invoked with two\\n * arguments: (value, key).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {Function} [predicate=_.identity] The function invoked per property.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.omitBy(object, _.isNumber);\\n * // => { 'b': '2' }\\n */\\n function omitBy(object, predicate) {\\n return pickBy(object, negate(getIteratee(predicate)));\\n }\\n\\n /**\\n * Creates an object composed of the picked `object` properties.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.pick(object, ['a', 'c']);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n var pick = flatRest(function(object, paths) {\\n return object == null ? {} : basePick(object, paths);\\n });\\n\\n /**\\n * Creates an object composed of the `object` properties `predicate` returns\\n * truthy for. The predicate is invoked with two arguments: (value, key).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {Function} [predicate=_.identity] The function invoked per property.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.pickBy(object, _.isNumber);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n function pickBy(object, predicate) {\\n if (object == null) {\\n return {};\\n }\\n var props = arrayMap(getAllKeysIn(object), function(prop) {\\n return [prop];\\n });\\n predicate = getIteratee(predicate);\\n return basePickBy(object, props, function(value, path) {\\n return predicate(value, path[0]);\\n });\\n }\\n\\n /**\\n * This method is like `_.get` except that if the resolved value is a\\n * function it's invoked with the `this` binding of its parent object and\\n * its result is returned.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to resolve.\\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\\n * @returns {*} Returns the resolved value.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\\n *\\n * _.result(object, 'a[0].b.c1');\\n * // => 3\\n *\\n * _.result(object, 'a[0].b.c2');\\n * // => 4\\n *\\n * _.result(object, 'a[0].b.c3', 'default');\\n * // => 'default'\\n *\\n * _.result(object, 'a[0].b.c3', _.constant('default'));\\n * // => 'default'\\n */\\n function result(object, path, defaultValue) {\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length;\\n\\n // Ensure the loop is entered when path is empty.\\n if (!length) {\\n length = 1;\\n object = undefined;\\n }\\n while (++index < length) {\\n var value = object == null ? undefined : object[toKey(path[index])];\\n if (value === undefined) {\\n index = length;\\n value = defaultValue;\\n }\\n object = isFunction(value) ? value.call(object) : value;\\n }\\n return object;\\n }\\n\\n /**\\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\\n * it's created. Arrays are created for missing index properties while objects\\n * are created for all other missing properties. Use `_.setWith` to customize\\n * `path` creation.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.7.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.set(object, 'a[0].b.c', 4);\\n * console.log(object.a[0].b.c);\\n * // => 4\\n *\\n * _.set(object, ['x', '0', 'y', 'z'], 5);\\n * console.log(object.x[0].y.z);\\n * // => 5\\n */\\n function set(object, path, value) {\\n return object == null ? object : baseSet(object, path, value);\\n }\\n\\n /**\\n * This method is like `_.set` except that it accepts `customizer` which is\\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\\n * path creation is handled by the method instead. The `customizer` is invoked\\n * with three arguments: (nsValue, key, nsObject).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {};\\n *\\n * _.setWith(object, '[0][1]', 'a', Object);\\n * // => { '0': { '1': 'a' } }\\n */\\n function setWith(object, path, value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return object == null ? object : baseSet(object, path, value, customizer);\\n }\\n\\n /**\\n * Creates an array of own enumerable string keyed-value pairs for `object`\\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\\n * entries are returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias entries\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the key-value pairs.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.toPairs(new Foo);\\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\\n */\\n var toPairs = createToPairs(keys);\\n\\n /**\\n * Creates an array of own and inherited enumerable string keyed-value pairs\\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\\n * or set, its entries are returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias entriesIn\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the key-value pairs.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.toPairsIn(new Foo);\\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\\n */\\n var toPairsIn = createToPairs(keysIn);\\n\\n /**\\n * An alternative to `_.reduce`; this method transforms `object` to a new\\n * `accumulator` object which is the result of running each of its own\\n * enumerable string keyed properties thru `iteratee`, with each invocation\\n * potentially mutating the `accumulator` object. If `accumulator` is not\\n * provided, a new object with the same `[[Prototype]]` will be used. The\\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The custom accumulator value.\\n * @returns {*} Returns the accumulated value.\\n * @example\\n *\\n * _.transform([2, 3, 4], function(result, n) {\\n * result.push(n *= n);\\n * return n % 2 == 0;\\n * }, []);\\n * // => [4, 9]\\n *\\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\\n * (result[value] || (result[value] = [])).push(key);\\n * }, {});\\n * // => { '1': ['a', 'c'], '2': ['b'] }\\n */\\n function transform(object, iteratee, accumulator) {\\n var isArr = isArray(object),\\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\\n\\n iteratee = getIteratee(iteratee, 4);\\n if (accumulator == null) {\\n var Ctor = object && object.constructor;\\n if (isArrLike) {\\n accumulator = isArr ? new Ctor : [];\\n }\\n else if (isObject(object)) {\\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\\n }\\n else {\\n accumulator = {};\\n }\\n }\\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\\n return iteratee(accumulator, value, index, object);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * Removes the property at `path` of `object`.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to unset.\\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\\n * _.unset(object, 'a[0].b.c');\\n * // => true\\n *\\n * console.log(object);\\n * // => { 'a': [{ 'b': {} }] };\\n *\\n * _.unset(object, ['a', '0', 'b', 'c']);\\n * // => true\\n *\\n * console.log(object);\\n * // => { 'a': [{ 'b': {} }] };\\n */\\n function unset(object, path) {\\n return object == null ? true : baseUnset(object, path);\\n }\\n\\n /**\\n * This method is like `_.set` except that accepts `updater` to produce the\\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\\n * is invoked with one argument: (value).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {Function} updater The function to produce the updated value.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\\n * console.log(object.a[0].b.c);\\n * // => 9\\n *\\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\\n * console.log(object.x[0].y.z);\\n * // => 0\\n */\\n function update(object, path, updater) {\\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\\n }\\n\\n /**\\n * This method is like `_.update` except that it accepts `customizer` which is\\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\\n * path creation is handled by the method instead. The `customizer` is invoked\\n * with three arguments: (nsValue, key, nsObject).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {Function} updater The function to produce the updated value.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {};\\n *\\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\\n * // => { '0': { '1': 'a' } }\\n */\\n function updateWith(object, path, updater, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\\n }\\n\\n /**\\n * Creates an array of the own enumerable string keyed property values of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property values.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.values(new Foo);\\n * // => [1, 2] (iteration order is not guaranteed)\\n *\\n * _.values('hi');\\n * // => ['h', 'i']\\n */\\n function values(object) {\\n return object == null ? [] : baseValues(object, keys(object));\\n }\\n\\n /**\\n * Creates an array of the own and inherited enumerable string keyed property\\n * values of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property values.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.valuesIn(new Foo);\\n * // => [1, 2, 3] (iteration order is not guaranteed)\\n */\\n function valuesIn(object) {\\n return object == null ? [] : baseValues(object, keysIn(object));\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Number\\n * @param {number} number The number to clamp.\\n * @param {number} [lower] The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the clamped number.\\n * @example\\n *\\n * _.clamp(-10, -5, 5);\\n * // => -5\\n *\\n * _.clamp(10, -5, 5);\\n * // => 5\\n */\\n function clamp(number, lower, upper) {\\n if (upper === undefined) {\\n upper = lower;\\n lower = undefined;\\n }\\n if (upper !== undefined) {\\n upper = toNumber(upper);\\n upper = upper === upper ? upper : 0;\\n }\\n if (lower !== undefined) {\\n lower = toNumber(lower);\\n lower = lower === lower ? lower : 0;\\n }\\n return baseClamp(toNumber(number), lower, upper);\\n }\\n\\n /**\\n * Checks if `n` is between `start` and up to, but not including, `end`. If\\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\\n * If `start` is greater than `end` the params are swapped to support\\n * negative ranges.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.3.0\\n * @category Number\\n * @param {number} number The number to check.\\n * @param {number} [start=0] The start of the range.\\n * @param {number} end The end of the range.\\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\\n * @see _.range, _.rangeRight\\n * @example\\n *\\n * _.inRange(3, 2, 4);\\n * // => true\\n *\\n * _.inRange(4, 8);\\n * // => true\\n *\\n * _.inRange(4, 2);\\n * // => false\\n *\\n * _.inRange(2, 2);\\n * // => false\\n *\\n * _.inRange(1.2, 2);\\n * // => true\\n *\\n * _.inRange(5.2, 4);\\n * // => false\\n *\\n * _.inRange(-3, -2, -6);\\n * // => true\\n */\\n function inRange(number, start, end) {\\n start = toFinite(start);\\n if (end === undefined) {\\n end = start;\\n start = 0;\\n } else {\\n end = toFinite(end);\\n }\\n number = toNumber(number);\\n return baseInRange(number, start, end);\\n }\\n\\n /**\\n * Produces a random number between the inclusive `lower` and `upper` bounds.\\n * If only one argument is provided a number between `0` and the given number\\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\\n * floats, a floating-point number is returned instead of an integer.\\n *\\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\\n * floating-point values which can produce unexpected results.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.7.0\\n * @category Number\\n * @param {number} [lower=0] The lower bound.\\n * @param {number} [upper=1] The upper bound.\\n * @param {boolean} [floating] Specify returning a floating-point number.\\n * @returns {number} Returns the random number.\\n * @example\\n *\\n * _.random(0, 5);\\n * // => an integer between 0 and 5\\n *\\n * _.random(5);\\n * // => also an integer between 0 and 5\\n *\\n * _.random(5, true);\\n * // => a floating-point number between 0 and 5\\n *\\n * _.random(1.2, 5.2);\\n * // => a floating-point number between 1.2 and 5.2\\n */\\n function random(lower, upper, floating) {\\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\\n upper = floating = undefined;\\n }\\n if (floating === undefined) {\\n if (typeof upper == 'boolean') {\\n floating = upper;\\n upper = undefined;\\n }\\n else if (typeof lower == 'boolean') {\\n floating = lower;\\n lower = undefined;\\n }\\n }\\n if (lower === undefined && upper === undefined) {\\n lower = 0;\\n upper = 1;\\n }\\n else {\\n lower = toFinite(lower);\\n if (upper === undefined) {\\n upper = lower;\\n lower = 0;\\n } else {\\n upper = toFinite(upper);\\n }\\n }\\n if (lower > upper) {\\n var temp = lower;\\n lower = upper;\\n upper = temp;\\n }\\n if (floating || lower % 1 || upper % 1) {\\n var rand = nativeRandom();\\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\\n }\\n return baseRandom(lower, upper);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the camel cased string.\\n * @example\\n *\\n * _.camelCase('Foo Bar');\\n * // => 'fooBar'\\n *\\n * _.camelCase('--foo-bar--');\\n * // => 'fooBar'\\n *\\n * _.camelCase('__FOO_BAR__');\\n * // => 'fooBar'\\n */\\n var camelCase = createCompounder(function(result, word, index) {\\n word = word.toLowerCase();\\n return result + (index ? capitalize(word) : word);\\n });\\n\\n /**\\n * Converts the first character of `string` to upper case and the remaining\\n * to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to capitalize.\\n * @returns {string} Returns the capitalized string.\\n * @example\\n *\\n * _.capitalize('FRED');\\n * // => 'Fred'\\n */\\n function capitalize(string) {\\n return upperFirst(toString(string).toLowerCase());\\n }\\n\\n /**\\n * Deburrs `string` by converting\\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\\n * letters to basic Latin letters and removing\\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to deburr.\\n * @returns {string} Returns the deburred string.\\n * @example\\n *\\n * _.deburr('déjà vu');\\n * // => 'deja vu'\\n */\\n function deburr(string) {\\n string = toString(string);\\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\\n }\\n\\n /**\\n * Checks if `string` ends with the given target string.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to inspect.\\n * @param {string} [target] The string to search for.\\n * @param {number} [position=string.length] The position to search up to.\\n * @returns {boolean} Returns `true` if `string` ends with `target`,\\n * else `false`.\\n * @example\\n *\\n * _.endsWith('abc', 'c');\\n * // => true\\n *\\n * _.endsWith('abc', 'b');\\n * // => false\\n *\\n * _.endsWith('abc', 'b', 2);\\n * // => true\\n */\\n function endsWith(string, target, position) {\\n string = toString(string);\\n target = baseToString(target);\\n\\n var length = string.length;\\n position = position === undefined\\n ? length\\n : baseClamp(toInteger(position), 0, length);\\n\\n var end = position;\\n position -= target.length;\\n return position >= 0 && string.slice(position, end) == target;\\n }\\n\\n /**\\n * Converts the characters \\\"&\\\", \\\"<\\\", \\\">\\\", '\\\"', and \\\"'\\\" in `string` to their\\n * corresponding HTML entities.\\n *\\n * **Note:** No other characters are escaped. To escape additional\\n * characters use a third-party library like [_he_](https://mths.be/he).\\n *\\n * Though the \\\">\\\" character is escaped for symmetry, characters like\\n * \\\">\\\" and \\\"/\\\" don't need escaping in HTML and have no special meaning\\n * unless they're part of a tag or unquoted attribute value. See\\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\\n * (under \\\"semi-related fun fact\\\") for more details.\\n *\\n * When working with HTML you should always\\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\\n * XSS vectors.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category String\\n * @param {string} [string=''] The string to escape.\\n * @returns {string} Returns the escaped string.\\n * @example\\n *\\n * _.escape('fred, barney, & pebbles');\\n * // => 'fred, barney, & pebbles'\\n */\\n function escape(string) {\\n string = toString(string);\\n return (string && reHasUnescapedHtml.test(string))\\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\\n : string;\\n }\\n\\n /**\\n * Escapes the `RegExp` special characters \\\"^\\\", \\\"$\\\", \\\"\\\\\\\", \\\".\\\", \\\"*\\\", \\\"+\\\",\\n * \\\"?\\\", \\\"(\\\", \\\")\\\", \\\"[\\\", \\\"]\\\", \\\"{\\\", \\\"}\\\", and \\\"|\\\" in `string`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to escape.\\n * @returns {string} Returns the escaped string.\\n * @example\\n *\\n * _.escapeRegExp('[lodash](https://lodash.com/)');\\n * // => '\\\\[lodash\\\\]\\\\(https://lodash\\\\.com/\\\\)'\\n */\\n function escapeRegExp(string) {\\n string = toString(string);\\n return (string && reHasRegExpChar.test(string))\\n ? string.replace(reRegExpChar, '\\\\\\\\$&')\\n : string;\\n }\\n\\n /**\\n * Converts `string` to\\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the kebab cased string.\\n * @example\\n *\\n * _.kebabCase('Foo Bar');\\n * // => 'foo-bar'\\n *\\n * _.kebabCase('fooBar');\\n * // => 'foo-bar'\\n *\\n * _.kebabCase('__FOO_BAR__');\\n * // => 'foo-bar'\\n */\\n var kebabCase = createCompounder(function(result, word, index) {\\n return result + (index ? '-' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Converts `string`, as space separated words, to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the lower cased string.\\n * @example\\n *\\n * _.lowerCase('--Foo-Bar--');\\n * // => 'foo bar'\\n *\\n * _.lowerCase('fooBar');\\n * // => 'foo bar'\\n *\\n * _.lowerCase('__FOO_BAR__');\\n * // => 'foo bar'\\n */\\n var lowerCase = createCompounder(function(result, word, index) {\\n return result + (index ? ' ' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Converts the first character of `string` to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the converted string.\\n * @example\\n *\\n * _.lowerFirst('Fred');\\n * // => 'fred'\\n *\\n * _.lowerFirst('FRED');\\n * // => 'fRED'\\n */\\n var lowerFirst = createCaseFirst('toLowerCase');\\n\\n /**\\n * Pads `string` on the left and right sides if it's shorter than `length`.\\n * Padding characters are truncated if they can't be evenly divided by `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.pad('abc', 8);\\n * // => ' abc '\\n *\\n * _.pad('abc', 8, '_-');\\n * // => '_-abc_-_'\\n *\\n * _.pad('abc', 3);\\n * // => 'abc'\\n */\\n function pad(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n if (!length || strLength >= length) {\\n return string;\\n }\\n var mid = (length - strLength) / 2;\\n return (\\n createPadding(nativeFloor(mid), chars) +\\n string +\\n createPadding(nativeCeil(mid), chars)\\n );\\n }\\n\\n /**\\n * Pads `string` on the right side if it's shorter than `length`. Padding\\n * characters are truncated if they exceed `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.padEnd('abc', 6);\\n * // => 'abc '\\n *\\n * _.padEnd('abc', 6, '_-');\\n * // => 'abc_-_'\\n *\\n * _.padEnd('abc', 3);\\n * // => 'abc'\\n */\\n function padEnd(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n return (length && strLength < length)\\n ? (string + createPadding(length - strLength, chars))\\n : string;\\n }\\n\\n /**\\n * Pads `string` on the left side if it's shorter than `length`. Padding\\n * characters are truncated if they exceed `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.padStart('abc', 6);\\n * // => ' abc'\\n *\\n * _.padStart('abc', 6, '_-');\\n * // => '_-_abc'\\n *\\n * _.padStart('abc', 3);\\n * // => 'abc'\\n */\\n function padStart(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n return (length && strLength < length)\\n ? (createPadding(length - strLength, chars) + string)\\n : string;\\n }\\n\\n /**\\n * Converts `string` to an integer of the specified radix. If `radix` is\\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\\n * hexadecimal, in which case a `radix` of `16` is used.\\n *\\n * **Note:** This method aligns with the\\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category String\\n * @param {string} string The string to convert.\\n * @param {number} [radix=10] The radix to interpret `value` by.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.parseInt('08');\\n * // => 8\\n *\\n * _.map(['6', '08', '10'], _.parseInt);\\n * // => [6, 8, 10]\\n */\\n function parseInt(string, radix, guard) {\\n if (guard || radix == null) {\\n radix = 0;\\n } else if (radix) {\\n radix = +radix;\\n }\\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\\n }\\n\\n /**\\n * Repeats the given string `n` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to repeat.\\n * @param {number} [n=1] The number of times to repeat the string.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {string} Returns the repeated string.\\n * @example\\n *\\n * _.repeat('*', 3);\\n * // => '***'\\n *\\n * _.repeat('abc', 2);\\n * // => 'abcabc'\\n *\\n * _.repeat('abc', 0);\\n * // => ''\\n */\\n function repeat(string, n, guard) {\\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\\n n = 1;\\n } else {\\n n = toInteger(n);\\n }\\n return baseRepeat(toString(string), n);\\n }\\n\\n /**\\n * Replaces matches for `pattern` in `string` with `replacement`.\\n *\\n * **Note:** This method is based on\\n * [`String#replace`](https://mdn.io/String/replace).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to modify.\\n * @param {RegExp|string} pattern The pattern to replace.\\n * @param {Function|string} replacement The match replacement.\\n * @returns {string} Returns the modified string.\\n * @example\\n *\\n * _.replace('Hi Fred', 'Fred', 'Barney');\\n * // => 'Hi Barney'\\n */\\n function replace() {\\n var args = arguments,\\n string = toString(args[0]);\\n\\n return args.length < 3 ? string : string.replace(args[1], args[2]);\\n }\\n\\n /**\\n * Converts `string` to\\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the snake cased string.\\n * @example\\n *\\n * _.snakeCase('Foo Bar');\\n * // => 'foo_bar'\\n *\\n * _.snakeCase('fooBar');\\n * // => 'foo_bar'\\n *\\n * _.snakeCase('--FOO-BAR--');\\n * // => 'foo_bar'\\n */\\n var snakeCase = createCompounder(function(result, word, index) {\\n return result + (index ? '_' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Splits `string` by `separator`.\\n *\\n * **Note:** This method is based on\\n * [`String#split`](https://mdn.io/String/split).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to split.\\n * @param {RegExp|string} separator The separator pattern to split by.\\n * @param {number} [limit] The length to truncate results to.\\n * @returns {Array} Returns the string segments.\\n * @example\\n *\\n * _.split('a-b-c', '-', 2);\\n * // => ['a', 'b']\\n */\\n function split(string, separator, limit) {\\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\\n separator = limit = undefined;\\n }\\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\\n if (!limit) {\\n return [];\\n }\\n string = toString(string);\\n if (string && (\\n typeof separator == 'string' ||\\n (separator != null && !isRegExp(separator))\\n )) {\\n separator = baseToString(separator);\\n if (!separator && hasUnicode(string)) {\\n return castSlice(stringToArray(string), 0, limit);\\n }\\n }\\n return string.split(separator, limit);\\n }\\n\\n /**\\n * Converts `string` to\\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.1.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the start cased string.\\n * @example\\n *\\n * _.startCase('--foo-bar--');\\n * // => 'Foo Bar'\\n *\\n * _.startCase('fooBar');\\n * // => 'Foo Bar'\\n *\\n * _.startCase('__FOO_BAR__');\\n * // => 'FOO BAR'\\n */\\n var startCase = createCompounder(function(result, word, index) {\\n return result + (index ? ' ' : '') + upperFirst(word);\\n });\\n\\n /**\\n * Checks if `string` starts with the given target string.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to inspect.\\n * @param {string} [target] The string to search for.\\n * @param {number} [position=0] The position to search from.\\n * @returns {boolean} Returns `true` if `string` starts with `target`,\\n * else `false`.\\n * @example\\n *\\n * _.startsWith('abc', 'a');\\n * // => true\\n *\\n * _.startsWith('abc', 'b');\\n * // => false\\n *\\n * _.startsWith('abc', 'b', 1);\\n * // => true\\n */\\n function startsWith(string, target, position) {\\n string = toString(string);\\n position = position == null\\n ? 0\\n : baseClamp(toInteger(position), 0, string.length);\\n\\n target = baseToString(target);\\n return string.slice(position, position + target.length) == target;\\n }\\n\\n /**\\n * Creates a compiled template function that can interpolate data properties\\n * in \\\"interpolate\\\" delimiters, HTML-escape interpolated data properties in\\n * \\\"escape\\\" delimiters, and execute JavaScript in \\\"evaluate\\\" delimiters. Data\\n * properties may be accessed as free variables in the template. If a setting\\n * object is given, it takes precedence over `_.templateSettings` values.\\n *\\n * **Note:** In the development build `_.template` utilizes\\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\\n * for easier debugging.\\n *\\n * For more information on precompiling templates see\\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\\n *\\n * For more information on Chrome extension sandboxes see\\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category String\\n * @param {string} [string=''] The template string.\\n * @param {Object} [options={}] The options object.\\n * @param {RegExp} [options.escape=_.templateSettings.escape]\\n * The HTML \\\"escape\\\" delimiter.\\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\\n * The \\\"evaluate\\\" delimiter.\\n * @param {Object} [options.imports=_.templateSettings.imports]\\n * An object to import into the template as free variables.\\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\\n * The \\\"interpolate\\\" delimiter.\\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\\n * The sourceURL of the compiled template.\\n * @param {string} [options.variable='obj']\\n * The data object variable name.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the compiled template function.\\n * @example\\n *\\n * // Use the \\\"interpolate\\\" delimiter to create a compiled template.\\n * var compiled = _.template('hello <%= user %>!');\\n * compiled({ 'user': 'fred' });\\n * // => 'hello fred!'\\n *\\n * // Use the HTML \\\"escape\\\" delimiter to escape data property values.\\n * var compiled = _.template('<%- value %>');\\n * compiled({ 'value': '\\\\r\\\\n\\\\r\\\\n\\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 78 */\\n/***/ function(module, exports) {\\n\\n\\t/*\\r\\n\\t\\tMIT License http://www.opensource.org/licenses/mit-license.php\\r\\n\\t\\tAuthor Tobias Koppers @sokra\\r\\n\\t*/\\r\\n\\t// css base code, injected by the css-loader\\r\\n\\tmodule.exports = function() {\\r\\n\\t\\tvar list = [];\\r\\n\\t\\r\\n\\t\\t// return the list of modules as css string\\r\\n\\t\\tlist.toString = function toString() {\\r\\n\\t\\t\\tvar result = [];\\r\\n\\t\\t\\tfor(var i = 0; i < this.length; i++) {\\r\\n\\t\\t\\t\\tvar item = this[i];\\r\\n\\t\\t\\t\\tif(item[2]) {\\r\\n\\t\\t\\t\\t\\tresult.push(\\\"@media \\\" + item[2] + \\\"{\\\" + item[1] + \\\"}\\\");\\r\\n\\t\\t\\t\\t} else {\\r\\n\\t\\t\\t\\t\\tresult.push(item[1]);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\treturn result.join(\\\"\\\");\\r\\n\\t\\t};\\r\\n\\t\\r\\n\\t\\t// import a list of modules into the list\\r\\n\\t\\tlist.i = function(modules, mediaQuery) {\\r\\n\\t\\t\\tif(typeof modules === \\\"string\\\")\\r\\n\\t\\t\\t\\tmodules = [[null, modules, \\\"\\\"]];\\r\\n\\t\\t\\tvar alreadyImportedModules = {};\\r\\n\\t\\t\\tfor(var i = 0; i < this.length; i++) {\\r\\n\\t\\t\\t\\tvar id = this[i][0];\\r\\n\\t\\t\\t\\tif(typeof id === \\\"number\\\")\\r\\n\\t\\t\\t\\t\\talreadyImportedModules[id] = true;\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tfor(i = 0; i < modules.length; i++) {\\r\\n\\t\\t\\t\\tvar item = modules[i];\\r\\n\\t\\t\\t\\t// skip already imported module\\r\\n\\t\\t\\t\\t// this implementation is not 100% perfect for weird media query combinations\\r\\n\\t\\t\\t\\t// when a module is imported multiple times with different media queries.\\r\\n\\t\\t\\t\\t// I hope this will never occur (Hey this way we have smaller bundles)\\r\\n\\t\\t\\t\\tif(typeof item[0] !== \\\"number\\\" || !alreadyImportedModules[item[0]]) {\\r\\n\\t\\t\\t\\t\\tif(mediaQuery && !item[2]) {\\r\\n\\t\\t\\t\\t\\t\\titem[2] = mediaQuery;\\r\\n\\t\\t\\t\\t\\t} else if(mediaQuery) {\\r\\n\\t\\t\\t\\t\\t\\titem[2] = \\\"(\\\" + item[2] + \\\") and (\\\" + mediaQuery + \\\")\\\";\\r\\n\\t\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t\\tlist.push(item);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t};\\r\\n\\t\\treturn list;\\r\\n\\t};\\r\\n\\n\\n/***/ },\\n/* 79 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t/*\\n\\t\\tMIT License http://www.opensource.org/licenses/mit-license.php\\n\\t\\tAuthor Tobias Koppers @sokra\\n\\t*/\\n\\tvar stylesInDom = {},\\n\\t\\tmemoize = function(fn) {\\n\\t\\t\\tvar memo;\\n\\t\\t\\treturn function () {\\n\\t\\t\\t\\tif (typeof memo === \\\"undefined\\\") memo = fn.apply(this, arguments);\\n\\t\\t\\t\\treturn memo;\\n\\t\\t\\t};\\n\\t\\t},\\n\\t\\tisOldIE = memoize(function() {\\n\\t\\t\\treturn /msie [6-9]\\\\b/.test(window.navigator.userAgent.toLowerCase());\\n\\t\\t}),\\n\\t\\tgetHeadElement = memoize(function () {\\n\\t\\t\\treturn document.head || document.getElementsByTagName(\\\"head\\\")[0];\\n\\t\\t}),\\n\\t\\tsingletonElement = null,\\n\\t\\tsingletonCounter = 0,\\n\\t\\tstyleElementsInsertedAtTop = [];\\n\\t\\n\\tmodule.exports = function(list, options) {\\n\\t\\tif(false) {\\n\\t\\t\\tif(typeof document !== \\\"object\\\") throw new Error(\\\"The style-loader cannot be used in a non-browser environment\\\");\\n\\t\\t}\\n\\t\\n\\t\\toptions = options || {};\\n\\t\\t// Force single-tag solution on IE6-9, which has a hard limit on the # of \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 85 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t header: { type: String },\\n\\t placement: { type: String, default: 'right' },\\n\\t show: { type: Boolean, required: true },\\n\\t width: { type: Number, default: 320 }\\n\\t },\\n\\t watch: {\\n\\t show: function show(val, old) {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('input', val);\\n\\t this.$emit(this.show ? 'open' : 'close');\\n\\t var body = document.body;\\n\\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\\n\\t if (val) {\\n\\t if (!this._backdrop) {\\n\\t this._backdrop = document.createElement('div');\\n\\t }\\n\\t this._backdrop.className = 'aside-backdrop';\\n\\t body.appendChild(this._backdrop);\\n\\t body.classList.add('modal-open');\\n\\t if (scrollBarWidth !== 0) {\\n\\t body.style.paddingRight = scrollBarWidth + 'px';\\n\\t }\\n\\t // request property that requires layout to force a layout\\n\\t var x = this._backdrop.clientHeight;\\n\\t this._backdrop.classList.add('in');\\n\\t (0, _NodeList2.default)(this._backdrop).on('click', function () {\\n\\t return _this.trigger_close();\\n\\t });\\n\\t } else {\\n\\t (0, _NodeList2.default)(this._backdrop).on('transitionend', function () {\\n\\t (0, _NodeList2.default)(_this._backdrop).off();\\n\\t try {\\n\\t body.classList.remove('modal-open');\\n\\t body.style.paddingRight = '0';\\n\\t body.removeChild(_this._backdrop);\\n\\t _this._backdrop = null;\\n\\t } catch (e) {}\\n\\t });\\n\\t this._backdrop.className = 'aside-backdrop';\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t trigger: function trigger() {\\n\\t var _this2 = this;\\n\\t\\n\\t return {\\n\\t close: function close() {\\n\\t return _this2.trigger_close();\\n\\t },\\n\\t open: function open() {\\n\\t return _this2.trigger_open();\\n\\t }\\n\\t };\\n\\t },\\n\\t trigger_close: function trigger_close() {\\n\\t this.$emit('close');\\n\\t },\\n\\t trigger_open: function trigger_open() {\\n\\t this.$emit('open');\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this3 = this;\\n\\t\\n\\t this.$emit('trigger', function () {\\n\\t return _this3.trigger;\\n\\t });\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 86 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": 'slide' + _vm.placement\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t staticClass: \\\"aside\\\",\\n\\t class: _vm.placement,\\n\\t style: ({\\n\\t width: _vm.width + 'px'\\n\\t })\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-dialog\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-content\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-header\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.trigger_close\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]), _vm._v(\\\" \\\"), _vm._c('h4', {\\n\\t staticClass: \\\"aside-title\\\"\\n\\t }, [_vm._t(\\\"header\\\", [_vm._v(_vm._s(_vm.header))])], 2)]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"aside-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])])]) : _vm._e()])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-3a4bde27\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 87 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(88)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(89)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\ButtonGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-125eb0c8\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-125eb0c8\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] ButtonGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 88 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t buttons: { type: Boolean, default: true },\\n\\t disabled: { type: Boolean, default: false },\\n\\t justified: { type: Boolean, default: false },\\n\\t type: { type: String, default: 'default' },\\n\\t value: { default: null },\\n\\t vertical: { type: Boolean, default: false }\\n\\t },\\n\\t computed: {\\n\\t btnGroup: function btnGroup() {\\n\\t return !this.disabled;\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t // this will update EXTERNAL v-model when our val changes\\n\\t val: function val(_val) {\\n\\t this.$emit('input', _val);\\n\\t },\\n\\t\\n\\t // this will update our INTERNAL val, when something external changes our v-model\\n\\t value: function value(val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 89 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: {\\n\\t 'btn-group': _vm.buttons, 'btn-group-justified': _vm.justified, 'btn-group-vertical': _vm.vertical\\n\\t },\\n\\t attrs: {\\n\\t \\\"data-toggle\\\": _vm.buttons && 'buttons'\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-125eb0c8\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 90 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(91)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(93)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(94)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Carousel.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-322dee41\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-322dee41\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-322dee41\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Carousel.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 91 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 93 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t// let coerce = {\\n\\t// interval: 'number'\\n\\t// }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t indicators: {\\n\\t type: Boolean,\\n\\t default: true\\n\\t },\\n\\t controls: {\\n\\t type: Boolean,\\n\\t default: true\\n\\t },\\n\\t interval: {\\n\\t type: Number,\\n\\t default: 5000\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t indicator_list: [],\\n\\t index: 0,\\n\\t isAnimating: false\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t index: function index(newVal, oldVal) {\\n\\t this.slide(newVal > oldVal ? 'left' : 'right', newVal, oldVal);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t indicatorClick: function indicatorClick(index) {\\n\\t if (this.isAnimating || this.index === index) return false;\\n\\t this.isAnimating = true;\\n\\t this.index = index;\\n\\t },\\n\\t slide: function slide(direction, next, prev) {\\n\\t var _this = this;\\n\\t\\n\\t if (!this.$el) {\\n\\t return;\\n\\t }\\n\\t var $slider = (0, _NodeList2.default)('.item', this.$el);\\n\\t if (!$slider.length) {\\n\\t return;\\n\\t }\\n\\t var selected = $slider[next] || $slider[0];\\n\\t (0, _NodeList2.default)(selected).addClass(direction === 'left' ? 'next' : 'prev');\\n\\t // request property that requires layout to force a layout\\n\\t var x = selected.clientHeight;\\n\\t (0, _NodeList2.default)([$slider[prev], selected]).addClass(direction).on('transitionend', function () {\\n\\t $slider.off('transitionend').className = 'item';\\n\\t (0, _NodeList2.default)(selected).addClass('active');\\n\\t _this.isAnimating = false;\\n\\t });\\n\\t },\\n\\t next: function next() {\\n\\t if (!this.$el || this.isAnimating) {\\n\\t return false;\\n\\t }\\n\\t this.isAnimating = true;\\n\\t this.index + 1 < (0, _NodeList2.default)('.item', this.$el).length ? this.index += 1 : this.index = 0;\\n\\t },\\n\\t prev: function prev() {\\n\\t if (!this.$el || this.isAnimating) {\\n\\t return false;\\n\\t }\\n\\t this.isAnimating = true;\\n\\t this.index === 0 ? this.index = (0, _NodeList2.default)('.item', this.$el).length - 1 : this.index -= 1;\\n\\t },\\n\\t toggleInterval: function toggleInterval(val) {\\n\\t if (val === undefined) {\\n\\t val = this._intervalID;\\n\\t }\\n\\t if (this._intervalID) {\\n\\t clearInterval(this._intervalID);\\n\\t delete this._intervalID;\\n\\t }\\n\\t if (val && this.interval > 0) {\\n\\t this._intervalID = setInterval(this.next, this.interval);\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this2 = this;\\n\\t\\n\\t this.toggleInterval(true);\\n\\t (0, _NodeList2.default)(this.$el).on('mouseenter', function () {\\n\\t return _this2.toggleInterval(false);\\n\\t }).on('mouseleave', function () {\\n\\t return _this2.toggleInterval(true);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t this.toggleInterval(false);\\n\\t (0, _NodeList2.default)(this.$el).off('mouseenter mouseleave');\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 94 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"carousel slide\\\",\\n\\t attrs: {\\n\\t \\\"data-ride\\\": \\\"carousel\\\"\\n\\t }\\n\\t }, [_vm._c('ol', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.indicators),\\n\\t expression: \\\"indicators\\\"\\n\\t }],\\n\\t staticClass: \\\"carousel-indicators\\\"\\n\\t }, _vm._l((_vm.indicator_list), function(indicator, i) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t active: i === _vm.index\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.indicatorClick(i)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span')])\\n\\t })), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"carousel-inner\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"listbox\\\"\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.controls),\\n\\t expression: \\\"controls\\\"\\n\\t }],\\n\\t staticClass: \\\"carousel-controls hidden-xs\\\"\\n\\t }, [_vm._c('a', {\\n\\t staticClass: \\\"left carousel-control\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.prev\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"glyphicon glyphicon-chevron-left\\\",\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t })]), _vm._v(\\\" \\\"), _vm._c('a', {\\n\\t staticClass: \\\"right carousel-control\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.next\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"glyphicon glyphicon-chevron-right\\\",\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t })])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-322dee41\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 95 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(96)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(98)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(99)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Checkbox.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-6922bf24\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-6922bf24\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-6922bf24\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Checkbox.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 96 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 98 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t button: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t falseValue: { default: false },\\n\\t name: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t trueValue: { default: true },\\n\\t type: { type: String, default: null },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t checked: this.value === this.trueValue\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t inGroup: function inGroup() {\\n\\t return this.$parent && this.$parent.btnGroup && !this.$parent._radioGroup;\\n\\t },\\n\\t isButton: function isButton() {\\n\\t return this.button || this.$parent && this.$parent.btnGroup && this.$parent.buttons;\\n\\t },\\n\\t isFalse: function isFalse() {\\n\\t return this.value === this.falseValue;\\n\\t },\\n\\t isTrue: function isTrue() {\\n\\t return this.value === this.trueValue;\\n\\t },\\n\\t parentValue: function parentValue() {\\n\\t return this.$parent.val;\\n\\t },\\n\\t typeColor: function typeColor() {\\n\\t return this.type || this.$parent && this.$parent.type || 'default';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t checked: function checked(val, old) {\\n\\t var value = val ? this.trueValue : this.falseValue;\\n\\t this.$emit('checked', val);\\n\\t this.$emit('input', value);\\n\\t this.updateParent();\\n\\t },\\n\\t parentValue: function parentValue(val) {\\n\\t this.updateFromParent();\\n\\t },\\n\\t value: function value(val, old) {\\n\\t var checked = val === this.trueValue;\\n\\t if (this.checked !== checked) {\\n\\t this.checked = checked;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.inGroup) {\\n\\t var parent = this.$parent;\\n\\t parent._checkboxGroup = true;\\n\\t if (!(parent.val instanceof Array)) {\\n\\t parent.val = [];\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.updateFromParent();\\n\\t },\\n\\t\\n\\t methods: {\\n\\t // called @ mounted(), or whenever $parent.val changes\\n\\t // sync our state with the $parent.val\\n\\t updateFromParent: function updateFromParent() {\\n\\t if (this.inGroup) {\\n\\t var index = this.$parent.val.indexOf(this.trueValue);\\n\\t this.checked = ~index;\\n\\t }\\n\\t },\\n\\t\\n\\t // called when our checked state changes\\n\\t updateParent: function updateParent() {\\n\\t if (this.inGroup) {\\n\\t var index = this.$parent.val.indexOf(this.trueValue);\\n\\t if (this.checked && !~index) this.$parent.val.push(this.trueValue);\\n\\t if (!this.checked && ~index) this.$parent.val.splice(index, 1);\\n\\t }\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled || this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.checked = !this.checked;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 99 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.isButton ? 'a' : 'label', {\\n\\t tag: \\\"a\\\",\\n\\t class: [_vm.isButton ? 'btn btn-' + _vm.typeColor : 'open checkbox ' + _vm.typeColor, {\\n\\t active: _vm.checked,\\n\\t disabled: _vm.disabled,\\n\\t readonly: _vm.readonly\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggle\\n\\t }\\n\\t }, [(_vm.name) ? _vm._c('input', {\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"hidden\\\",\\n\\t \\\"name\\\": _vm.name\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.checked ? _vm.trueValue : _vm.falseValue\\n\\t }\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), (!_vm.isButton) ? _vm._c('span', {\\n\\t staticClass: \\\"icon dropdown-toggle\\\",\\n\\t class: [_vm.checked ? 'btn-' + _vm.typeColor : '', {\\n\\t bg: _vm.typeColor === 'default'\\n\\t }]\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), (!_vm.isButton && _vm.checked && _vm.typeColor === 'default') ? _vm._c('span', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-6922bf24\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 100 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(101)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(103)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(104)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Datepicker.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-477b8e5d\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-477b8e5d\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Datepicker.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 101 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 103 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\t// import $ from './utils/NodeList.js'\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t value: { type: String },\\n\\t format: { default: 'MM/dd/yyyy' },\\n\\t disabledDaysOfWeek: { type: Array, default: function _default() {\\n\\t return [];\\n\\t }\\n\\t },\\n\\t width: { type: String },\\n\\t clearButton: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t placeholder: { type: String },\\n\\t iconsFont: { type: String, default: 'glyphicon' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t currDate: new Date(),\\n\\t dateRange: [],\\n\\t decadeRange: [],\\n\\t displayDayView: false,\\n\\t displayMonthView: false,\\n\\t displayYearView: false,\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t currDate: function currDate() {\\n\\t this.getDateRange();\\n\\t },\\n\\t format: function format() {\\n\\t this.val = this.stringify(this.currDate);\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t preBtnClasses: function preBtnClasses() {\\n\\t return 'datepicker-preBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-left';\\n\\t },\\n\\t nextBtnClasses: function nextBtnClasses() {\\n\\t return 'datepicker-nextBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-right';\\n\\t },\\n\\t disabledDaysArray: function disabledDaysArray() {\\n\\t return this.disabledDaysOfWeek.map(function (d) {\\n\\t return parseInt(d, 10);\\n\\t });\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t close: function close() {\\n\\t this.displayDayView = this.displayMonthView = this.displayYearView = false;\\n\\t },\\n\\t inputClick: function inputClick() {\\n\\t this.currDate = this.parse(this.val) || this.parse(new Date());\\n\\t if (this.displayMonthView || this.displayYearView) {\\n\\t this.displayDayView = false;\\n\\t } else {\\n\\t this.displayDayView = !this.displayDayView;\\n\\t }\\n\\t },\\n\\t preNextDecadeClick: function preNextDecadeClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var months = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t this.currDate = new Date(year - 10, months, date);\\n\\t } else {\\n\\t this.currDate = new Date(year + 10, months, date);\\n\\t }\\n\\t },\\n\\t preNextMonthClick: function preNextMonthClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var month = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t var preMonth = this.getYearMonth(year, month - 1);\\n\\t this.currDate = new Date(preMonth.year, preMonth.month, date);\\n\\t } else {\\n\\t var nextMonth = this.getYearMonth(year, month + 1);\\n\\t this.currDate = new Date(nextMonth.year, nextMonth.month, date);\\n\\t }\\n\\t },\\n\\t preNextYearClick: function preNextYearClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var months = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t this.currDate = new Date(year - 1, months, date);\\n\\t } else {\\n\\t this.currDate = new Date(year + 1, months, date);\\n\\t }\\n\\t },\\n\\t yearSelect: function yearSelect(year) {\\n\\t this.displayYearView = false;\\n\\t this.displayMonthView = true;\\n\\t this.currDate = new Date(year, this.currDate.getMonth(), this.currDate.getDate());\\n\\t },\\n\\t daySelect: function daySelect(day) {\\n\\t if (day.sclass === 'datepicker-item-disable') {\\n\\t return false;\\n\\t } else {\\n\\t this.currDate = day.date;\\n\\t this.val = this.stringify(this.currDate);\\n\\t this.displayDayView = false;\\n\\t }\\n\\t },\\n\\t switchMonthView: function switchMonthView() {\\n\\t this.displayDayView = false;\\n\\t this.displayMonthView = true;\\n\\t },\\n\\t switchDecadeView: function switchDecadeView() {\\n\\t this.displayMonthView = false;\\n\\t this.displayYearView = true;\\n\\t },\\n\\t monthSelect: function monthSelect(index) {\\n\\t this.displayMonthView = false;\\n\\t this.displayDayView = true;\\n\\t this.currDate = new Date(this.currDate.getFullYear(), index, this.currDate.getDate());\\n\\t },\\n\\t getYearMonth: function getYearMonth(year, month) {\\n\\t if (month > 11) {\\n\\t year++;\\n\\t month = 0;\\n\\t } else if (month < 0) {\\n\\t year--;\\n\\t month = 11;\\n\\t }\\n\\t return { year: year, month: month };\\n\\t },\\n\\t stringifyDecadeHeader: function stringifyDecadeHeader(date) {\\n\\t var yearStr = date.getFullYear().toString();\\n\\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0;\\n\\t var lastYearOfDecade = parseInt(firstYearOfDecade, 10) + 10;\\n\\t return firstYearOfDecade + '-' + lastYearOfDecade;\\n\\t },\\n\\t stringifyDayHeader: function stringifyDayHeader(date) {\\n\\t return this.text.months[date.getMonth()] + ' ' + date.getFullYear();\\n\\t },\\n\\t parseMonth: function parseMonth(date) {\\n\\t return this.text.months[date.getMonth()];\\n\\t },\\n\\t stringifyYearHeader: function stringifyYearHeader(date) {\\n\\t return date.getFullYear();\\n\\t },\\n\\t stringify: function stringify(date) {\\n\\t var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.format;\\n\\t\\n\\t if (!date) date = this.parse();\\n\\t if (!date) return '';\\n\\t var year = date.getFullYear();\\n\\t var month = date.getMonth() + 1;\\n\\t var day = date.getDate();\\n\\t var monthName = this.parseMonth(date);\\n\\t return format.replace(/yyyy/g, year).replace(/yy/g, year).replace(/MMMM/g, monthName).replace(/MMM/g, monthName.substring(0, 3)).replace(/MM/g, ('0' + month).slice(-2)).replace(/M(?!a)/g, month).replace(/dd/g, ('0' + day).slice(-2)).replace(/d/g, day);\\n\\t },\\n\\t parse: function parse(str) {\\n\\t if (str === undefined || str === null) {\\n\\t str = this.val;\\n\\t }\\n\\t var date = str.length === 10 && (this.format === 'dd-MM-yyyy' || this.format === 'dd/MM/yyyy') ? new Date(str.substring(6, 10), str.substring(3, 5) - 1, str.substring(0, 2)) : new Date(str);\\n\\t return isNaN(date.getFullYear()) ? new Date() : date;\\n\\t },\\n\\t getDayCount: function getDayCount(year, month) {\\n\\t var dict = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\\n\\t if (month === 1) {\\n\\t if (year % 400 === 0 || year % 4 === 0 && year % 100 !== 0) {\\n\\t return 29;\\n\\t }\\n\\t }\\n\\t return dict[month];\\n\\t },\\n\\t getDateRange: function getDateRange() {\\n\\t this.dateRange = [];\\n\\t this.decadeRange = [];\\n\\t var time = {\\n\\t year: this.currDate.getFullYear(),\\n\\t month: this.currDate.getMonth(),\\n\\t day: this.currDate.getDate()\\n\\t };\\n\\t var yearStr = time.year.toString();\\n\\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0 - 1;\\n\\t for (var i = 0; i < 12; i++) {\\n\\t this.decadeRange.push({\\n\\t text: firstYearOfDecade + i\\n\\t });\\n\\t }\\n\\t\\n\\t var currMonthFirstDay = new Date(time.year, time.month, 1);\\n\\t var firstDayWeek = currMonthFirstDay.getDay() + 1;\\n\\t if (firstDayWeek === 0) {\\n\\t firstDayWeek = 7;\\n\\t }\\n\\t var dayCount = this.getDayCount(time.year, time.month);\\n\\t if (firstDayWeek > 1) {\\n\\t var preMonth = this.getYearMonth(time.year, time.month - 1);\\n\\t var prevMonthDayCount = this.getDayCount(preMonth.year, preMonth.month);\\n\\t for (var _i = 1; _i < firstDayWeek; _i++) {\\n\\t var dayText = prevMonthDayCount - firstDayWeek + _i + 1;\\n\\t var date = new Date(preMonth.year, preMonth.month, dayText);\\n\\t var sclass = 'datepicker-item-gray';\\n\\t if (this.disabledDaysArray.indexOf(date.getDay()) > -1) {\\n\\t sclass = 'datepicker-item-disable';\\n\\t }\\n\\t this.dateRange.push({ text: dayText, date: date, sclass: sclass });\\n\\t }\\n\\t }\\n\\t\\n\\t for (var _i2 = 1; _i2 <= dayCount; _i2++) {\\n\\t var _date = new Date(time.year, time.month, _i2);\\n\\t var _sclass = '';\\n\\t if (this.disabledDaysArray.indexOf(_date.getDay()) > -1) {\\n\\t _sclass = 'datepicker-item-disable';\\n\\t }\\n\\t if (_i2 == time.day && _date.getFullYear() == time.year && _date.getMonth() == time.month) {\\n\\t _sclass = 'datepicker-dateRange-item-active';\\n\\t }\\n\\t this.dateRange.push({ text: _i2, date: _date, sclass: _sclass });\\n\\t }\\n\\t\\n\\t if (this.dateRange.length < 42) {\\n\\t var nextMonthNeed = 42 - this.dateRange.length;\\n\\t var nextMonth = this.getYearMonth(time.year, time.month + 1);\\n\\t\\n\\t for (var _i3 = 1; _i3 <= nextMonthNeed; _i3++) {\\n\\t var _date2 = new Date(nextMonth.year, nextMonth.month, _i3);\\n\\t var _sclass2 = 'datepicker-item-gray';\\n\\t if (this.disabledDaysArray.indexOf(_date2.getDay()) > -1) {\\n\\t _sclass2 = 'datepicker-item-disable';\\n\\t }\\n\\t this.dateRange.push({ text: _i3, date: _date2, sclass: _sclass2 });\\n\\t }\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('child-created', this);\\n\\t this.currDate = this.parse(this.val) || this.parse(new Date());\\n\\t this._blur = function (e) {\\n\\t if (!_this.$el.contains(e.target)) _this.close();\\n\\t };\\n\\t window.addEventListener('click', this._blur);\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t window.removeEventListener('click', this._blur);\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 104 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"datepicker\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t staticClass: \\\"form-control datepicker-input\\\",\\n\\t class: {\\n\\t 'with-reset-button': _vm.clearButton\\n\\t },\\n\\t style: ({\\n\\t width: _vm.width\\n\\t }),\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"placeholder\\\": _vm.placeholder\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.inputClick,\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.val) ? _vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.val = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayDayView),\\n\\t expression: \\\"displayDayView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextMonthClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextMonthClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', {\\n\\t on: {\\n\\t \\\"click\\\": _vm.switchMonthView\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.stringifyDayHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-weekRange\\\"\\n\\t }, _vm._l((_vm.text.daysOfWeek), function(w) {\\n\\t return _vm._c('span', [_vm._v(_vm._s(w))])\\n\\t })), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-dateRange\\\"\\n\\t }, _vm._l((_vm.dateRange), function(d) {\\n\\t return _vm._c('span', {\\n\\t class: d.sclass,\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.daySelect(d)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(d.text))])\\n\\t }))])])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayMonthView),\\n\\t expression: \\\"displayMonthView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextYearClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextYearClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', {\\n\\t on: {\\n\\t \\\"click\\\": _vm.switchDecadeView\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.stringifyYearHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-monthRange\\\"\\n\\t }, [_vm._l((_vm.text.months), function(m, index) {\\n\\t return [_vm._c('span', {\\n\\t class: {\\n\\t 'datepicker-dateRange-item-active':\\n\\t (_vm.text.months[_vm.parse(_vm.val).getMonth()] === m) &&\\n\\t _vm.currDate.getFullYear() === _vm.parse(_vm.val).getFullYear()\\n\\t },\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(m.substr(0, 3))\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.monthSelect(index)\\n\\t }\\n\\t }\\n\\t })]\\n\\t })], 2)])])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayYearView),\\n\\t expression: \\\"displayYearView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextDecadeClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextDecadeClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', [_vm._v(_vm._s(_vm.stringifyDecadeHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-monthRange decadeRange\\\"\\n\\t }, [_vm._l((_vm.decadeRange), function(decade) {\\n\\t return [_vm._c('span', {\\n\\t class: {\\n\\t 'datepicker-dateRange-item-active': _vm.parse(_vm.val).getFullYear() === decade.text\\n\\t },\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(decade.text)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.stopPropagation();\\n\\t _vm.yearSelect(decade.text)\\n\\t }\\n\\t }\\n\\t })]\\n\\t })], 2)])])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-477b8e5d\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 105 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(106)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(107)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Dropdown.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-39be1072\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-39be1072\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Dropdown.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 106 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tvar _ClickOutside = __webpack_require__(66);\\n\\t\\n\\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t directives: {\\n\\t ClickOutside: _ClickOutside2.default\\n\\t },\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t size: { type: String, default: null },\\n\\t text: { type: String, default: null },\\n\\t type: { type: String, default: 'default' },\\n\\t value: { type: Boolean, default: false }\\n\\t },\\n\\t data: function data() {\\n\\t var show = this.value;\\n\\t return { show: show };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t show: function show(val) {\\n\\t this.$emit('input', val);\\n\\t },\\n\\t value: function value(val) {\\n\\t this.show = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t buttonSize: function buttonSize() {\\n\\t return ~['lg', 'sm', 'xs'].indexOf(this.size) ? 'btn-' + this.size : '';\\n\\t },\\n\\t inInput: function inInput() {\\n\\t return this.$parent._input;\\n\\t },\\n\\t isLi: function isLi() {\\n\\t return this.$parent._isTabs || this.$parent._navbar || this.$parent.menu;\\n\\t },\\n\\t menu: function menu() {\\n\\t return !this.$parent || this.$parent.navbar;\\n\\t },\\n\\t slots: function slots() {\\n\\t return this._slotContents;\\n\\t },\\n\\t submenu: function submenu() {\\n\\t return this.$parent && (this.$parent.menu || this.$parent.submenu);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t blur: function blur() {\\n\\t this.show = false;\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (!this.disabled) {\\n\\t this.show = !this.show;\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t (0, _NodeList2.default)('ul', this.$el).on('click', 'li>a', function (e) {\\n\\t _this.show = false;\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t (0, _NodeList2.default)('ul', this.$el).off();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 107 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.isLi ? 'li' : 'div', {\\n\\t directives: [{\\n\\t name: \\\"click-outside\\\",\\n\\t rawName: \\\"v-click-outside\\\",\\n\\t value: (_vm.blur),\\n\\t expression: \\\"blur\\\"\\n\\t }],\\n\\t tag: \\\"div\\\",\\n\\t class: [{\\n\\t open: _vm.show,\\n\\t disabled: _vm.disabled,\\n\\t dropdown: _vm.isLi,\\n\\t 'input-group-btn': _vm.inInput,\\n\\t 'btn-group': !_vm.isLi && !_vm.inInput\\n\\t }]\\n\\t }, [_vm._t(\\\"before\\\"), _vm._v(\\\" \\\"), (_vm.isLi) ? _vm._c('a', {\\n\\t class: ['dropdown-toggle', _vm.buttonSize, {\\n\\t disabled: _vm.disabled\\n\\t }],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.show = false\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"button\\\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"caret\\\"\\n\\t })], 2) : _vm._c('button', {\\n\\t class: ['btn btn-' + _vm.type, _vm.buttonSize, 'dropdown-toggle'],\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\",\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.show = false\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"button\\\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"caret\\\"\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._t(\\\"dropdown-menu\\\", [_vm._c('ul', {\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-39be1072\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 108 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(109)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(110)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\FormGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-79eb400a\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-79eb400a\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] FormGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 109 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t// let coerce = {\\n\\t// enterSubmit: 'boolean',\\n\\t// icon: 'boolean'\\n\\t// }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t enterSubmit: {\\n\\t type: Boolean,\\n\\t default: false\\n\\t },\\n\\t icon: {\\n\\t type: Boolean,\\n\\t default: false\\n\\t },\\n\\t lang: {\\n\\t type: String,\\n\\t default: navigator.language\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t children: [],\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t validate: function validate() {\\n\\t var valid = true;\\n\\t this.children.some(function (el) {\\n\\t var v = el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\\n\\t if (!v) valid = false;\\n\\t return !valid;\\n\\t });\\n\\t this.valid = valid;\\n\\t return valid === true;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._formGroup = true;\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formGroup) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formGroup) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.validate();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\n/***/ },\\n/* 110 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-79eb400a\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 111 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(112)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(113)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\FormValidator.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-b9f57c46\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-b9f57c46\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] FormValidator.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 112 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t enterSubmit: { type: Boolean, default: false },\\n\\t icon: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t value: null\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t children: [],\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit('input', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t validate: function validate() {\\n\\t var invalid = !this.children.every(function (el) {\\n\\t return el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\\n\\t });\\n\\t this.valid = !invalid;\\n\\t return !invalid;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._formValidator = true;\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.validate();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\n/***/ },\\n/* 113 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-b9f57c46\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 114 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(115)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(117)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(118)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Input.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-652ad7b9\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-652ad7b9\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-652ad7b9\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Input.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 115 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 117 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\tvar DELAY = 300;\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t clearButton: { type: Boolean, default: false },\\n\\t cols: { type: Number, default: null },\\n\\t datalist: { type: Array, default: null },\\n\\t disabled: { type: Boolean, default: false },\\n\\t enterSubmit: { type: Boolean, default: false },\\n\\t error: { type: String, default: null },\\n\\t help: { type: String, default: null },\\n\\t hideHelp: { type: Boolean, default: true },\\n\\t icon: { type: Boolean, default: false },\\n\\t label: { type: String, default: null },\\n\\t lang: { type: String, default: navigator.language },\\n\\t mask: null,\\n\\t maskDelay: { type: Number, default: 100 },\\n\\t match: { type: String, default: null },\\n\\t max: { type: String, default: null },\\n\\t maxlength: { type: Number, default: null },\\n\\t min: { type: String, default: null },\\n\\t minlength: { type: Number, default: 0 },\\n\\t name: { type: String, default: null },\\n\\t pattern: { default: null },\\n\\t placeholder: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t required: { type: Boolean, default: false },\\n\\t rows: { type: Number, default: 3 },\\n\\t step: { type: Number, default: null },\\n\\t type: { type: String, default: 'text' },\\n\\t url: { type: String, default: null },\\n\\t urlMap: { type: Function, default: null },\\n\\t validationDelay: { type: Number, default: 250 },\\n\\t value: { default: null }\\n\\t },\\n\\t data: function data() {\\n\\t var val = this.value;\\n\\t return {\\n\\t options: this.datalist,\\n\\t val: val,\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t canValidate: function canValidate() {\\n\\t return !this.disabled && !this.readonly && (this.required || this.regex || this.nativeValidate || this.match !== null);\\n\\t },\\n\\t errorText: function errorText() {\\n\\t var value = this.value;\\n\\t var error = [this.error];\\n\\t if (!value && this.required) error.push('(' + this.text.required.toLowerCase() + ')');\\n\\t if (value && value.length < this.minlength) error.push('(' + this.text.minLength.toLowerCase() + ': ' + this.minlength + ')');\\n\\t return error.join(' ');\\n\\t },\\n\\t id_datalist: function id_datalist() {\\n\\t if (this.type !== 'textarea' && this.datalist instanceof Array) {\\n\\t if (!this._id_datalist) {\\n\\t if (!this.$root.id_datalist) {\\n\\t this.$root.id_datalist = 0;\\n\\t }\\n\\t this._id_datalist = 'input-datalist' + this.$root.id_datalist++;\\n\\t }\\n\\t return this._id_datalist;\\n\\t }\\n\\t return null;\\n\\t },\\n\\t input: function input() {\\n\\t return this.$refs.input;\\n\\t },\\n\\t nativeValidate: function nativeValidate() {\\n\\t return (this.input || {}).checkValidity && (~['url', 'email'].indexOf(this.type.toLowerCase()) || this.min || this.max);\\n\\t },\\n\\t regex: function regex() {\\n\\t return _utils.coerce.pattern(this.pattern);\\n\\t },\\n\\t showError: function showError() {\\n\\t return this.error && this.valid === false;\\n\\t },\\n\\t showHelp: function showHelp() {\\n\\t return this.help && (!this.showError || !this.hideHelp);\\n\\t },\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t title: function title() {\\n\\t return this.errorText || this.help || '';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t datalist: function datalist(val, old) {\\n\\t if (val !== old && val instanceof Array) {\\n\\t this.options = val;\\n\\t }\\n\\t },\\n\\t match: function match(val) {\\n\\t this.eval();\\n\\t },\\n\\t options: function options(val, old) {\\n\\t if (val !== old) this.$emit('options', val);\\n\\t },\\n\\t url: function url(val) {\\n\\t this._url();\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('input', _val);\\n\\t if (_val !== old) {\\n\\t if (this.mask instanceof Function) {\\n\\t _val = this.mask(_val || '');\\n\\t if (this.val !== _val) {\\n\\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\\n\\t this._timeout.mask = setTimeout(function () {\\n\\t _this.val = _val;\\n\\t }, isNaN(this.maskDelay) ? 0 : this.maskDelay);\\n\\t }\\n\\t }\\n\\t this.eval();\\n\\t }\\n\\t },\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (this._parent) this._parent.validate();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t attr: function attr(value) {\\n\\t return ~['', null, undefined].indexOf(value) || value instanceof Function ? null : value;\\n\\t },\\n\\t emit: function emit(e) {\\n\\t this.$emit(e.type, e.type == 'input' ? e.target.value : e);\\n\\t if (e.type === 'blur' && this.canValidate) {\\n\\t this.valid = this.validate();\\n\\t }\\n\\t },\\n\\t eval: function _eval() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\\n\\t if (!this.canValidate) {\\n\\t this.valid = true;\\n\\t } else {\\n\\t this._timeout.eval = setTimeout(function () {\\n\\t _this2.valid = _this2.validate();\\n\\t _this2._timeout.eval = null;\\n\\t }, this.validationDelay);\\n\\t }\\n\\t },\\n\\t focus: function focus() {\\n\\t this.input.focus();\\n\\t },\\n\\t submit: function submit() {\\n\\t if (this.$parent._formValidator) {\\n\\t return this.$parent.validate();\\n\\t }\\n\\t if (this.input.form) {\\n\\t var invalids = (0, _NodeList2.default)('.form-group.validate:not(.has-success)', this.input.form);\\n\\t if (invalids.length) {\\n\\t invalids.find('input,textarea,select')[0].focus();\\n\\t } else {\\n\\t this.input.form.submit();\\n\\t }\\n\\t }\\n\\t },\\n\\t validate: function validate() {\\n\\t if (!this.canValidate) {\\n\\t return true;\\n\\t }\\n\\t var value = (this.val || '').trim();\\n\\t if (!value) {\\n\\t return !this.required;\\n\\t }\\n\\t if (this.match !== null) {\\n\\t return this.match === value;\\n\\t }\\n\\t if (value.length < this.minlength) {\\n\\t return false;\\n\\t }\\n\\t if (this.nativeValidate && !this.input.checkValidity()) {\\n\\t return false;\\n\\t }\\n\\t if (this.regex) {\\n\\t if (!(this.regex instanceof Function ? this.regex(this.val) : this.regex.test(this.val))) {\\n\\t return false;\\n\\t }\\n\\t }\\n\\t return true;\\n\\t },\\n\\t reset: function reset() {\\n\\t this.value = '';\\n\\t this.valid = null;\\n\\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\\n\\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._input = true;\\n\\t this._timeout = {};\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t this._url = (0, _utils.delayer)(function () {\\n\\t var _this3 = this;\\n\\t\\n\\t if (!this.url || !this.$http || this._loading) {\\n\\t return;\\n\\t }\\n\\t this._loading = true;\\n\\t this.$http.get(this.url).then(function (response) {\\n\\t var data = response.data instanceof Array ? response.data : [];\\n\\t try {\\n\\t data = JSON.parse(data);\\n\\t } catch (e) {}\\n\\t if (_this3.urlMap) {\\n\\t data = data.map(_this3.urlMap);\\n\\t }\\n\\t _this3.options = data;\\n\\t _this3.loading = false;\\n\\t }, function (response) {\\n\\t _this3.loading = false;\\n\\t });\\n\\t }, DELAY);\\n\\t if (this.url) this._url();\\n\\t },\\n\\t mounted: function mounted() {\\n\\t // $(this.input).on('focus', e => { this.$emit('focus', e) }).on('blur', e => {\\n\\t // if (this.canValidate) { this.valid = this.validate() }\\n\\t // this.$emit('blur', e)\\n\\t // })\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t // $(this.input).off()\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 118 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"form-group\\\",\\n\\t class: {\\n\\t validate: _vm.canValidate, 'has-feedback': _vm.icon, 'has-error': _vm.canValidate && _vm.valid === false, 'has-success': _vm.canValidate && _vm.valid\\n\\t }\\n\\t }, [_vm._t(\\\"label\\\", [(_vm.label) ? _vm._c('label', {\\n\\t staticClass: \\\"control-label\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.label))]) : _vm._e()]), _vm._v(\\\" \\\"), (_vm.$slots.before || _vm.$slots.after) ? _vm._c('div', {\\n\\t staticClass: \\\"input-group\\\"\\n\\t }, [_vm._t(\\\"before\\\"), _vm._v(\\\" \\\"), _vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t tag: \\\"textarea\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"cols\\\": _vm.cols,\\n\\t \\\"disabled\\\": _vm.disabled,\\n\\t \\\"list\\\": _vm.id_datalist,\\n\\t \\\"max\\\": _vm.attr(_vm.max),\\n\\t \\\"maxlength\\\": _vm.maxlength,\\n\\t \\\"min\\\": _vm.attr(_vm.min),\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"rows\\\": _vm.rows,\\n\\t \\\"step\\\": _vm.step,\\n\\t \\\"title\\\": _vm.attr(_vm.title),\\n\\t \\\"type\\\": _vm.type == 'textarea' ? null : _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": _vm.emit,\\n\\t \\\"focus\\\": _vm.emit,\\n\\t \\\"input\\\": [function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }, _vm.emit],\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.value) ? _vm._c('div', {\\n\\t class: {\\n\\t icon: _vm.icon\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.value = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.icon) ? _vm._c('div', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }, [(_vm.icon && _vm.valid !== null) ? _vm._c('span', {\\n\\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t }) : _vm._e()]) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"after\\\")], 2) : [_vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t tag: \\\"textarea\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"cols\\\": _vm.cols,\\n\\t \\\"disabled\\\": _vm.disabled,\\n\\t \\\"list\\\": _vm.id_datalist,\\n\\t \\\"max\\\": _vm.attr(_vm.max),\\n\\t \\\"maxlength\\\": _vm.maxlength,\\n\\t \\\"min\\\": _vm.attr(_vm.min),\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"rows\\\": _vm.rows,\\n\\t \\\"step\\\": _vm.step,\\n\\t \\\"title\\\": _vm.attr(_vm.title),\\n\\t \\\"type\\\": _vm.type == 'textarea' ? null : _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": _vm.emit,\\n\\t \\\"focus\\\": _vm.emit,\\n\\t \\\"input\\\": [function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }, _vm.emit],\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.val) ? _vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.val = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.icon && _vm.valid !== null) ? _vm._c('span', {\\n\\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t }) : _vm._e()], _vm._v(\\\" \\\"), (_vm.id_datalist) ? _vm._c('datalist', {\\n\\t attrs: {\\n\\t \\\"id\\\": _vm.id_datalist\\n\\t }\\n\\t }, _vm._l((_vm.options), function(opc) {\\n\\t return _vm._c('option', {\\n\\t domProps: {\\n\\t \\\"value\\\": opc\\n\\t }\\n\\t })\\n\\t })) : _vm._e(), _vm._v(\\\" \\\"), (_vm.showHelp) ? _vm._c('div', {\\n\\t staticClass: \\\"help-block\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.help))]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.showError) ? _vm._c('div', {\\n\\t staticClass: \\\"help-block with-errors\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.errorText))]) : _vm._e()], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-652ad7b9\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 119 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(120)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(122)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(127)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Modal.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-fe7d5dc8\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-fe7d5dc8\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Modal.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 120 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 122 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _isInteger = __webpack_require__(123);\\n\\t\\n\\tvar _isInteger2 = _interopRequireDefault(_isInteger);\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t backdrop: { type: Boolean, default: true },\\n\\t callback: { type: Function, default: null },\\n\\t cancelText: { type: String, default: 'Close' },\\n\\t effect: { type: String, default: null },\\n\\t large: { type: Boolean, default: false },\\n\\t okText: { type: String, default: 'Save changes' },\\n\\t small: { type: Boolean, default: false },\\n\\t title: { type: String, default: '' },\\n\\t value: { type: Boolean, required: true },\\n\\t width: { default: null }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t transition: false,\\n\\t val: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t optionalWidth: function optionalWidth() {\\n\\t if (this.width === null) {\\n\\t return null;\\n\\t } else if ((0, _isInteger2.default)(this.width)) {\\n\\t return this.width + 'px';\\n\\t }\\n\\t return this.width;\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t transition: function transition(val, old) {\\n\\t if (val === old) {\\n\\t return;\\n\\t }\\n\\t var el = this.$el;\\n\\t var body = document.body;\\n\\t if (val) {\\n\\t //starting\\n\\t if (this.val) {\\n\\t el.querySelector('.modal-content').focus();\\n\\t el.style.display = 'block';\\n\\t setTimeout(function () {\\n\\t return el.classList.add('in');\\n\\t }, 0);\\n\\t body.classList.add('modal-open');\\n\\t if ((0, _utils.getScrollBarWidth)() !== 0) {\\n\\t body.style.paddingRight = (0, _utils.getScrollBarWidth)() + 'px';\\n\\t }\\n\\t } else {\\n\\t el.classList.remove('in');\\n\\t }\\n\\t } else {\\n\\t //ending\\n\\t this.$emit(this.val ? 'opened' : 'closed');\\n\\t if (!this.val) {\\n\\t el.style.display = 'none';\\n\\t body.style.paddingRight = null;\\n\\t body.classList.remove('modal-open');\\n\\t }\\n\\t }\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t if (old === null ? _val === true : _val !== old) this.transition = true;\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) this.val = val;\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t action: function action(val, p) {\\n\\t if (val === null) {\\n\\t return;\\n\\t }\\n\\t if (val && this.callback instanceof Function) this.callback();\\n\\t this.$emit(val ? 'ok' : 'cancel', p);\\n\\t this.val = val || false;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.val = this.value;\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 123 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports = { \\\"default\\\": __webpack_require__(124), __esModule: true };\\n\\n/***/ },\\n/* 124 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(125);\\n\\tmodule.exports = __webpack_require__(7).Number.isInteger;\\n\\n/***/ },\\n/* 125 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 20.1.2.3 Number.isInteger(number)\\n\\tvar $export = __webpack_require__(5);\\n\\t\\n\\t$export($export.S, 'Number', {isInteger: __webpack_require__(126)});\\n\\n/***/ },\\n/* 126 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 20.1.2.3 Number.isInteger(number)\\n\\tvar isObject = __webpack_require__(13)\\n\\t , floor = Math.floor;\\n\\tmodule.exports = function isInteger(it){\\n\\t return !isObject(it) && isFinite(it) && floor(it) === it;\\n\\t};\\n\\n/***/ },\\n/* 127 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['modal', _vm.effect],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"dialog\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.backdrop && _vm.action(false, 1)\\n\\t },\\n\\t \\\"transitionend\\\": function($event) {\\n\\t _vm.transition = false\\n\\t }\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t class: ['modal-dialog', {\\n\\t 'modal-lg': _vm.large,\\n\\t 'modal-sm': _vm.small\\n\\t }],\\n\\t style: ({\\n\\t width: _vm.optionalWidth\\n\\t }),\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"document\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.stopPropagation();\\n\\t _vm.action(null)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"modal-content\\\"\\n\\t }, [_vm._t(\\\"modal-header\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-header\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.action(false, 2)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]), _vm._v(\\\" \\\"), _vm._c('h4', {\\n\\t staticClass: \\\"modal-title\\\"\\n\\t }, [_vm._t(\\\"title\\\", [_vm._v(_vm._s(_vm.title))])], 2)])]), _vm._v(\\\" \\\"), _vm._t(\\\"modal-body\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)]), _vm._v(\\\" \\\"), _vm._t(\\\"modal-footer\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-footer\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"btn btn-default\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.action(false, 3)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.cancelText))]), _vm._v(\\\" \\\"), _vm._c('button', {\\n\\t staticClass: \\\"btn btn-primary\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.action(true, 4)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.okText))])])])], 2)])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-fe7d5dc8\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 128 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(129)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(130)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Navbar.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-38f0619e\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-38f0619e\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Navbar.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 129 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t type: { type: String, default: 'default' },\\n\\t placement: { type: String, default: '' },\\n\\t container: { type: String, default: '' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t id: 'bs-example-navbar-collapse-1',\\n\\t collapsed: true,\\n\\t styles: {}\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t slots: function slots() {\\n\\t return this._slotContents;\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggleCollapse: function toggleCollapse(e) {\\n\\t e && e.preventDefault();\\n\\t this.collapsed = !this.collapsed;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._navbar = true;\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t try {\\n\\t (function () {\\n\\t var $dropdown = (0, _NodeList2.default)('.dropdown>[data-toggle=\\\"dropdown\\\"]', _this.$el).parent();\\n\\t if ($dropdown) {\\n\\t $dropdown.on('click', '.dropdown-toggle', function (e) {\\n\\t e.preventDefault();\\n\\t $dropdown.each(function (content) {\\n\\t if (content.contains(e.target)) content.classList.toggle('open');\\n\\t });\\n\\t }).on('click', '.dropdown-menu>li>a', function (e) {\\n\\t $dropdown.each(function (content) {\\n\\t if (content.contains(e.target)) content.classList.remove('open');\\n\\t });\\n\\t }).onBlur(function (e) {\\n\\t $dropdown.each(function (content) {\\n\\t if (!content.contains(e.target)) content.classList.remove('open');\\n\\t });\\n\\t });\\n\\t }\\n\\t })();\\n\\t } catch (ex) {\\n\\t console.log('error finding dropdown');\\n\\t }\\n\\t\\n\\t (0, _NodeList2.default)(this.$el).on('click touchstart', 'li:not(.dropdown)>a', function (e) {\\n\\t setTimeout(function () {\\n\\t _this.collapsed = true;\\n\\t }, 200);\\n\\t }).onBlur(function (e) {\\n\\t if (!_this.$el.contains(e.target)) {\\n\\t _this.collapsed = true;\\n\\t }\\n\\t });\\n\\t var height = this.$el.offsetHeight;\\n\\t if (this.placement === 'top') {\\n\\t document.body.style.paddingTop = height + 'px';\\n\\t }\\n\\t if (this.placement === 'bottom') {\\n\\t document.body.style.paddingBottom = height + 'px';\\n\\t }\\n\\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\\\"collapse\\\"]', this.$el).on('click', function (e) {\\n\\t return _this.toggleCollapse(e);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t (0, _NodeList2.default)('.dropdown', this.$el).off('click').offBlur();\\n\\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\\\"collapse\\\"]', this.$el).off('click');\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 130 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('nav', {\\n\\t class: ['navbar', 'navbar-' + _vm.type, _vm.placement === 'static' ? 'navbar-static-top' : 'navbar-fixed-' + _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t class: _vm.container === 'fluid' ? 'container-fluid' : 'container'\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"navbar-header\\\"\\n\\t }, [(!_vm.$slots.collapse) ? _vm._c('button', {\\n\\t staticClass: \\\"navbar-toggle collapsed\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\",\\n\\t \\\"aria-expanded\\\": \\\"false\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggleCollapse\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"sr-only\\\"\\n\\t }, [_vm._v(\\\"Toggle navigation\\\")]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t })]) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"collapse\\\"), _vm._v(\\\" \\\"), _vm._t(\\\"brand\\\")], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t class: ['navbar-collapse', {\\n\\t collapse: _vm.collapsed\\n\\t }]\\n\\t }, [_vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2), _vm._v(\\\" \\\"), (_vm.$slots.left) ? _vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav navbar-left\\\"\\n\\t }, [_vm._t(\\\"left\\\")], 2) : _vm._e(), _vm._v(\\\" \\\"), (_vm.$slots.right) ? _vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav navbar-right\\\"\\n\\t }, [_vm._t(\\\"right\\\")], 2) : _vm._e()])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-38f0619e\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 131 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(132)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(133)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Option.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-42088116\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-42088116\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Option.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 132 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: { value: null },\\n\\t data: function data() {\\n\\t return { loading: true };\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this.$parent._select) {\\n\\t if (!this.$parent.options) {\\n\\t this.$parent.options = [];\\n\\t }\\n\\t var el = {};\\n\\t el[this.$parent.optionsLabel] = this.$el.innerHTML;\\n\\t el[this.$parent.optionsValue] = this.value;\\n\\t this.$parent.options.push(el);\\n\\t this.loading = false;\\n\\t } else {\\n\\t console.warn('options only work inside a select component');\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 133 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return (_vm.loading) ? _vm._c('li', [_vm._t(\\\"default\\\")], 2) : _vm._e()\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-42088116\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 134 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(135)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(137)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(138)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Panel.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-b1e0461a\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-b1e0461a\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Panel.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 135 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 137 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t header: { type: String },\\n\\t isOpen: { type: Boolean, default: null },\\n\\t type: { type: String, default: null }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t open: this.isOpen\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t isOpen: function isOpen(val) {\\n\\t this.open = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t inAccordion: function inAccordion() {\\n\\t return this.$parent && this.$parent._isAccordion;\\n\\t },\\n\\t panelType: function panelType() {\\n\\t return 'panel-' + (this.type || this.$parent && this.$parent.type || 'default');\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggle: function toggle() {\\n\\t this.open = !this.open;\\n\\t if (this.inAccordion) {\\n\\t this.$parent.openChild(this);\\n\\t }\\n\\t },\\n\\t enter: function enter(el) {\\n\\t el.style.height = 'auto';\\n\\t var endWidth = getComputedStyle(el).height;\\n\\t el.style.height = '0px';\\n\\t el.offsetHeight; // force repaint\\n\\t el.style.height = endWidth;\\n\\t },\\n\\t afterEnter: function afterEnter(el) {\\n\\t el.style.height = 'auto';\\n\\t },\\n\\t beforeLeave: function beforeLeave(el) {\\n\\t el.style.height = getComputedStyle(el).height;\\n\\t el.offsetHeight; // force repaint\\n\\t el.style.height = '0px';\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.isOpen === null) {\\n\\t this.open = !this.inAccordion;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 138 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['panel', _vm.panelType]\\n\\t }, [_vm._c('div', {\\n\\t class: ['panel-heading', {\\n\\t 'accordion-toggle': _vm.inAccordion\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.inAccordion && _vm.toggle()\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"header\\\", [_vm._c('h4', {\\n\\t staticClass: \\\"panel-title\\\"\\n\\t }, [_vm._v(_vm._s(_vm.header))])])], 2), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"collapse\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"enter\\\": _vm.enter,\\n\\t \\\"after-enter\\\": _vm.afterEnter,\\n\\t \\\"before-leave\\\": _vm.beforeLeave\\n\\t }\\n\\t }, [(_vm.open) ? _vm._c('div', {\\n\\t staticClass: \\\"panel-collapse\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"panel-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)]) : _vm._e()])], 1)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-b1e0461a\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 139 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(140)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(142)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(144)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Popover.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-2465bf54\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-2465bf54\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Popover.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 140 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 142 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _popoverMixins = __webpack_require__(143);\\n\\t\\n\\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t mixins: [_popoverMixins2.default],\\n\\t props: {\\n\\t trigger: { type: String, default: 'click' }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 143 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t content: { type: String },\\n\\t effect: { type: String, default: 'fade' },\\n\\t header: { type: Boolean, default: true },\\n\\t placement: { type: String, default: 'top' },\\n\\t title: { type: String },\\n\\t trigger: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t top: 0,\\n\\t left: 0,\\n\\t show: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t events: function events() {\\n\\t return { contextmenu: ['contextmenu'], hover: ['mouseleave', 'mouseenter'], focus: ['blur', 'focus'] }[this.trigger] || ['click'];\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t beforeEnter: function beforeEnter() {\\n\\t var _this = this;\\n\\t\\n\\t this.position();\\n\\t setTimeout(function () {\\n\\t return _this.position();\\n\\t }, 30);\\n\\t },\\n\\t position: function position() {\\n\\t var _this2 = this;\\n\\t\\n\\t this.$nextTick(function () {\\n\\t var popover = _this2.$refs.popover;\\n\\t var trigger = _this2.$refs.trigger.children[0];\\n\\t switch (_this2.placement) {\\n\\t case 'top':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\\n\\t _this2.top = trigger.offsetTop - popover.offsetHeight;\\n\\t break;\\n\\t case 'left':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\\n\\t break;\\n\\t case 'right':\\n\\t _this2.left = trigger.offsetLeft + trigger.offsetWidth;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\\n\\t break;\\n\\t case 'bottom':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight;\\n\\t break;\\n\\t default:\\n\\t console.warn('Wrong placement prop');\\n\\t }\\n\\t popover.style.top = _this2.top + 'px';\\n\\t popover.style.left = _this2.left + 'px';\\n\\t });\\n\\t },\\n\\t toggle: function toggle(e) {\\n\\t if (e && this.trigger === 'contextmenu') e.preventDefault();\\n\\t this.show = !this.show;\\n\\t if (this.show) this.beforeEnter();\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this3 = this;\\n\\t\\n\\t var trigger = this.$refs.trigger.children[0];\\n\\t if (!trigger) return console.error('Could not find trigger v-el in your component that uses popoverMixin.');\\n\\t\\n\\t if (this.trigger === 'focus' && !~trigger.tabIndex) {\\n\\t trigger = (0, _NodeList2.default)('a,input,select,textarea,button', trigger);\\n\\t if (!trigger.length) {\\n\\t return;\\n\\t }\\n\\t }\\n\\t this.events.forEach(function (event) {\\n\\t (0, _NodeList2.default)(trigger).on(event, _this3.toggle);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._trigger) (0, _NodeList2.default)(this._trigger).off();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 144 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', {\\n\\t ref: \\\"trigger\\\"\\n\\t }, [_vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.effect\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t ref: \\\"popover\\\",\\n\\t class: ['popover', _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"arrow\\\"\\n\\t }), _vm._v(\\\" \\\"), (_vm.title) ? _vm._c('h3', {\\n\\t staticClass: \\\"popover-title\\\"\\n\\t }, [_vm._t(\\\"title\\\", [_vm._v(_vm._s(_vm.title))])], 2) : _vm._e(), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"popover-content\\\"\\n\\t }, [_vm._t(\\\"content\\\", [_vm._c('span', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.content)\\n\\t }\\n\\t })])], 2)]) : _vm._e()])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-2465bf54\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 145 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(146)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(147)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Progressbar.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-68aa3375\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-68aa3375\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Progressbar.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 146 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t animated: { type: Boolean, default: false },\\n\\t label: { default: false },\\n\\t now: { required: true },\\n\\t striped: { type: Boolean, default: false },\\n\\t type: { type: String }\\n\\t },\\n\\t computed: {\\n\\t labelBool: function labelBool() {\\n\\t return _utils.coerce.boolean(this.label);\\n\\t },\\n\\t nowNum: function nowNum() {\\n\\t return _utils.coerce.number(this.now);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 147 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['progress-bar', 'progress-bar-' + _vm.type, {\\n\\t active: _vm.animated,\\n\\t 'progress-bar-striped': _vm.striped\\n\\t }],\\n\\t style: ({\\n\\t width: _vm.nowNum + '%'\\n\\t }),\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(_vm.labelBool ? _vm.nowNum + '%' : null)\\n\\t }\\n\\t })\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-68aa3375\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 148 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(149)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(151)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(152)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Radio.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-74cfd92c\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-74cfd92c\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Radio.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 149 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 151 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t button: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t name: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t selectedValue: { default: true },\\n\\t type: { type: String, default: null },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t check: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t return this.check === this.selectedValue;\\n\\t },\\n\\t inGroup: function inGroup() {\\n\\t return this.$parent && this.$parent.btnGroup && !this.$parent._checkboxGroup;\\n\\t },\\n\\t parentValue: function parentValue() {\\n\\t return this.$parent.val;\\n\\t },\\n\\t buttonStyle: function buttonStyle() {\\n\\t return this.button || this.$parent && this.$parent.btnGroup && this.$parent.buttons;\\n\\t },\\n\\t typeColor: function typeColor() {\\n\\t return this.type || this.$parent && this.$parent.type || 'default';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t check: function check(val) {\\n\\t if (this.selectedValue === val) {\\n\\t this.$emit('input', val);\\n\\t this.$emit('checked', true);\\n\\t this.updateParent();\\n\\t }\\n\\t },\\n\\t parentValue: function parentValue(val) {\\n\\t this.updateFromParent();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.selectedValue == val) {\\n\\t this.check = val;\\n\\t } else {\\n\\t this.check = false;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.inGroup) {\\n\\t var parent = this.$parent;\\n\\t parent._radioGroup = true;\\n\\t this.updateFromParent();\\n\\t }\\n\\t },\\n\\t\\n\\t methods: {\\n\\t updateFromParent: function updateFromParent() {\\n\\t if (this.inGroup) {\\n\\t if (this.selectedValue == this.$parent.val) {\\n\\t this.check = this.selectedValue;\\n\\t } else {\\n\\t this.check = false;\\n\\t }\\n\\t }\\n\\t },\\n\\t updateParent: function updateParent() {\\n\\t if (this.inGroup) {\\n\\t if (this.selectedValue === this.check) {\\n\\t this.$parent.val = this.selectedValue;\\n\\t }\\n\\t }\\n\\t },\\n\\t focus: function focus() {\\n\\t this.$refs.input.focus();\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled) {\\n\\t return;\\n\\t }\\n\\t this.focus();\\n\\t if (this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.check = this.selectedValue;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 152 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.buttonStyle ? 'label' : 'div', {\\n\\t tag: \\\"div\\\",\\n\\t class: [(_vm.buttonStyle ? 'btn btn-' + _vm.typeColor : 'radio ' + _vm.typeColor), {\\n\\t active: _vm.active,\\n\\t disabled: _vm.disabled,\\n\\t readonly: _vm.readonly\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [(_vm.buttonStyle) ? [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (!_vm.readonly),\\n\\t expression: \\\"!readonly\\\"\\n\\t }, {\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.check),\\n\\t expression: \\\"check\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"radio\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.selectedValue,\\n\\t \\\"checked\\\": _vm._q(_vm.check, _vm.selectedValue)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.check = _vm.selectedValue\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")] : _vm._c('label', {\\n\\t staticClass: \\\"open\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.check),\\n\\t expression: \\\"check\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"radio\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.selectedValue,\\n\\t \\\"checked\\\": _vm._q(_vm.check, _vm.selectedValue)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.check = _vm.selectedValue\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon dropdown-toggle\\\",\\n\\t class: [_vm.active ? 'btn-' + _vm.typeColor : '', {\\n\\t bg: _vm.typeColor === 'default'\\n\\t }]\\n\\t }), _vm._v(\\\" \\\"), (_vm.active && _vm.typeColor === 'default') ? _vm._c('span', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")], 2)], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-74cfd92c\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 153 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(154)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(156)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(157)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Select.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-e514dbc6\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-e514dbc6\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-e514dbc6\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Select.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 154 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 156 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _ClickOutside = __webpack_require__(66);\\n\\t\\n\\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\tvar timeout = {};\\n\\texports.default = {\\n\\t directives: {\\n\\t ClickOutside: _ClickOutside2.default\\n\\t },\\n\\t props: {\\n\\t clearButton: { type: Boolean, default: false },\\n\\t closeOnSelect: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t limit: { type: Number, default: 1024 },\\n\\t minSearch: { type: Number, default: 0 },\\n\\t multiple: { type: Boolean, default: false },\\n\\t name: { type: String, default: null },\\n\\t options: { type: Array, default: function _default() {\\n\\t return [];\\n\\t }\\n\\t },\\n\\t optionsLabel: { type: String, default: 'label' },\\n\\t optionsValue: { type: String, default: 'value' },\\n\\t parent: { default: true },\\n\\t placeholder: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: null },\\n\\t required: { type: Boolean, default: null },\\n\\t search: { type: Boolean, default: false },\\n\\t searchText: { type: String, default: null },\\n\\t countText: { type: String, default: null },\\n\\t showCount: { type: Boolean, default: false },\\n\\t url: { type: String, default: null },\\n\\t value: null\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t list: [],\\n\\t loading: null,\\n\\t searchValue: null,\\n\\t show: false,\\n\\t notify: false,\\n\\t val: null,\\n\\t valid: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t canSearch: function canSearch() {\\n\\t return this.minSearch ? this.list.length >= this.minSearch : this.search;\\n\\t },\\n\\t classes: function classes() {\\n\\t return [{ open: this.show, disabled: this.disabled }, this.class, this.isLi ? 'dropdown' : this.inInput ? 'input-group-btn' : 'btn-group'];\\n\\t },\\n\\t filteredOptions: function filteredOptions() {\\n\\t var _this = this;\\n\\t\\n\\t var search = (this.searchValue || '').toLowerCase();\\n\\t return !search ? this.list : this.list.filter(function (el) {\\n\\t return ~el[_this.optionsLabel].toLowerCase().search(search);\\n\\t });\\n\\t },\\n\\t hasParent: function hasParent() {\\n\\t return this.parent instanceof Array ? this.parent.length : this.parent;\\n\\t },\\n\\t inInput: function inInput() {\\n\\t return this.$parent._input;\\n\\t },\\n\\t isLi: function isLi() {\\n\\t return this.$parent._navbar || this.$parent.menu || this.$parent._tabset;\\n\\t },\\n\\t limitText: function limitText() {\\n\\t return this.text.limit.replace('{{limit}}', this.limit);\\n\\t },\\n\\t selected: function selected() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this.list.length === 0) {\\n\\t return '';\\n\\t }\\n\\t var sel = this.values.map(function (val) {\\n\\t return (_this2.list.find(function (o) {\\n\\t return o[_this2.optionsValue] === val;\\n\\t }) || {})[_this2.optionsLabel];\\n\\t }).filter(function (val) {\\n\\t return val !== undefined;\\n\\t });\\n\\t this.$emit('selected', sel);\\n\\t return sel.join(', ');\\n\\t },\\n\\t selectedText: function selectedText() {\\n\\t return this.countText || this.text.selected.replace('{{count}}', this.values.length);\\n\\t },\\n\\t showPlaceholder: function showPlaceholder() {\\n\\t return this.values.length === 0 || !this.hasParent ? this.placeholder || this.text.notSelected : null;\\n\\t },\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t values: function values() {\\n\\t return this.val instanceof Array ? this.val : ~[null, undefined].indexOf(this.val) ? [] : [this.val];\\n\\t },\\n\\t valOptions: function valOptions() {\\n\\t var _this3 = this;\\n\\t\\n\\t return this.list.map(function (el) {\\n\\t return el[_this3.optionsValue];\\n\\t });\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t options: function options(_options) {\\n\\t if (_options instanceof Array) this.setOptions(_options);\\n\\t },\\n\\t show: function show(val) {\\n\\t if (val) {\\n\\t this.$refs.search ? this.$refs.search.focus() : this.$refs.btn.focus();\\n\\t // onBlur(this.$refs.select, e => { this.show = false })\\n\\t } else {\\n\\t // offBlur(this.$refs.select)\\n\\t }\\n\\t },\\n\\t url: function url() {\\n\\t this.urlChanged();\\n\\t },\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this.val = val;\\n\\t }\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t var _this4 = this;\\n\\t\\n\\t if (_val === undefined) {\\n\\t this.val = _val = null;\\n\\t }\\n\\t if (_val !== old) {\\n\\t this.$emit('change', _val);\\n\\t this.$emit('input', _val);\\n\\t }\\n\\t if (_val instanceof Array && _val.length > this.limit) {\\n\\t this.val = _val.slice(0, this.limit);\\n\\t this.notify = true;\\n\\t if (timeout.limit) clearTimeout(timeout.limit);\\n\\t timeout.limit = setTimeout(function () {\\n\\t timeout.limit = false;\\n\\t _this4.notify = false;\\n\\t }, 1500);\\n\\t }\\n\\t this.valid = this.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t close: function close() {\\n\\t this.show = false;\\n\\t },\\n\\t checkData: function checkData() {\\n\\t if (this.multiple) {\\n\\t if (this.limit < 1) {\\n\\t this.limit = 1;\\n\\t }\\n\\t if (!(this.val instanceof Array)) {\\n\\t this.val = this.val === null || this.val === undefined ? [] : [this.val];\\n\\t }\\n\\t var values = this.valOptions;\\n\\t this.val = this.val.filter(function (el) {\\n\\t return ~values.indexOf(el);\\n\\t });\\n\\t if (this.values.length > this.limit) {\\n\\t this.val = this.val.slice(0, this.limit);\\n\\t }\\n\\t } else {\\n\\t if (!~this.valOptions.indexOf(this.val)) {\\n\\t this.val = null;\\n\\t }\\n\\t }\\n\\t },\\n\\t clear: function clear() {\\n\\t if (this.disabled || this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.val = this.val instanceof Array ? [] : null;\\n\\t this.toggle();\\n\\t },\\n\\t clearSearch: function clearSearch() {\\n\\t this.searchValue = '';\\n\\t this.$refs.search.focus();\\n\\t },\\n\\t isSelected: function isSelected(v) {\\n\\t return this.values.indexOf(v) > -1;\\n\\t },\\n\\t select: function select(v) {\\n\\t if (this.val instanceof Array) {\\n\\t var newVal = this.val.slice(0);\\n\\t if (~newVal.indexOf(v)) {\\n\\t newVal.splice(newVal.indexOf(v), 1);\\n\\t } else {\\n\\t newVal.push(v);\\n\\t }\\n\\t this.val = newVal;\\n\\t if (this.closeOnSelect) {\\n\\t this.toggle();\\n\\t }\\n\\t } else {\\n\\t this.val = v;\\n\\t this.toggle();\\n\\t }\\n\\t },\\n\\t setOptions: function setOptions(options) {\\n\\t var _this5 = this;\\n\\t\\n\\t this.list = options.map(function (el) {\\n\\t if (el instanceof Object) {\\n\\t return el;\\n\\t }\\n\\t var obj = {};\\n\\t obj[_this5.optionsLabel] = el;\\n\\t obj[_this5.optionsValue] = el;\\n\\t return obj;\\n\\t });\\n\\t this.$emit('options', this.list);\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled && !this.show) return;\\n\\t this.show = !this.show;\\n\\t if (!this.show) this.$refs.btn.focus();\\n\\t },\\n\\t urlChanged: function urlChanged() {\\n\\t var _this6 = this;\\n\\t\\n\\t if (!this.url || !this.$http) {\\n\\t return;\\n\\t }\\n\\t this.loading = true;\\n\\t this.$http.get(this.url).then(function (response) {\\n\\t var data = response.data instanceof Array ? response.data : [];\\n\\t try {\\n\\t data = JSON.parse(data);\\n\\t } catch (e) {}\\n\\t _this6.setOptions(data);\\n\\t _this6.loading = false;\\n\\t _this6.checkData();\\n\\t }, function (response) {\\n\\t _this6.loading = false;\\n\\t });\\n\\t },\\n\\t validate: function validate() {\\n\\t return !this.required ? true : this.val instanceof Array ? this.val.length > 0 : this.val !== null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this.setOptions(this.options);\\n\\t this.val = this.value;\\n\\t this._select = true;\\n\\t if (this.val === undefined || !this.parent) {\\n\\t this.val = null;\\n\\t }\\n\\t if (!this.multiple && this.val instanceof Array) {\\n\\t this.val = this.val[0];\\n\\t }\\n\\t this.checkData();\\n\\t if (this.url) this.urlChanged();\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this._parent) this._parent.children.push(this);\\n\\t this.setOptions(this.options);\\n\\t this.val = this.value;\\n\\t this.checkData();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 157 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"click-outside\\\",\\n\\t rawName: \\\"v-click-outside\\\",\\n\\t value: (_vm.close),\\n\\t expression: \\\"close\\\"\\n\\t }],\\n\\t ref: \\\"select\\\",\\n\\t class: _vm.classes\\n\\t }, [_vm._c('div', {\\n\\t ref: \\\"btn\\\",\\n\\t staticClass: \\\"form-control dropdown-toggle\\\",\\n\\t attrs: {\\n\\t \\\"tabindex\\\": \\\"1\\\",\\n\\t \\\"disabled\\\": _vm.disabled || !_vm.hasParent,\\n\\t \\\"readonly\\\": _vm.readonly\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": function($event) {\\n\\t _vm.canSearch ? null : _vm.close()\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.toggle()\\n\\t },\\n\\t \\\"keydown\\\": [function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.close($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"space\\\", 32)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }]\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"btn-content\\\",\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.loading ? _vm.text.loading : _vm.showPlaceholder || (_vm.multiple && _vm.showCount ? _vm.selectedText : _vm.selected))\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.values.length) ? _vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.clear()\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")]) : _vm._e()]), _vm._v(\\\" \\\"), _vm._c('select', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"sel\\\",\\n\\t staticClass: \\\"secret\\\",\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"multiple\\\": _vm.multiple,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"change\\\": function($event) {\\n\\t _vm.val = Array.prototype.filter.call($event.target.options, function(o) {\\n\\t return o.selected\\n\\t }).map(function(o) {\\n\\t var val = \\\"_value\\\" in o ? o._value : o.value;\\n\\t return val\\n\\t })[0]\\n\\t }\\n\\t }\\n\\t }, [(_vm.required) ? _vm._c('option', {\\n\\t attrs: {\\n\\t \\\"value\\\": \\\"\\\"\\n\\t }\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._l((_vm.list), function(option) {\\n\\t return _vm._c('option', {\\n\\t domProps: {\\n\\t \\\"value\\\": option[_vm.optionsValue]\\n\\t }\\n\\t }, [_vm._v(_vm._s(option[_vm.optionsLabel]))])\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._c('ul', {\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, [(_vm.list.length) ? [(_vm.canSearch) ? _vm._c('li', {\\n\\t staticClass: \\\"bs-searchbox\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.searchValue),\\n\\t expression: \\\"searchValue\\\"\\n\\t }],\\n\\t ref: \\\"search\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"placeholder\\\": _vm.searchText || _vm.text.search,\\n\\t \\\"autocomplete\\\": \\\"off\\\"\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.searchValue)\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.close($event)\\n\\t },\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.searchValue = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.searchValue),\\n\\t expression: \\\"searchValue\\\"\\n\\t }],\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.clearSearch\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.required && !_vm.clearButton) ? _vm._c('li', [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.clear() && _vm.close()\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.placeholder || _vm.text.notSelected))])]) : _vm._e(), _vm._v(\\\" \\\"), _vm._l((_vm.filteredOptions), function(option) {\\n\\t return _vm._c('li', {\\n\\t attrs: {\\n\\t \\\"id\\\": option[_vm.optionsValue]\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(option[_vm.optionsValue])\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(option[_vm.optionsLabel])\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.isSelected(option[_vm.optionsValue])),\\n\\t expression: \\\"isSelected(option[optionsValue])\\\"\\n\\t }],\\n\\t staticClass: \\\"glyphicon glyphicon-ok check-mark\\\"\\n\\t })])])\\n\\t })] : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), (_vm.notify && !_vm.closeOnSelect) ? _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"fadein\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"notify in\\\"\\n\\t }, [_vm._v(_vm._s(_vm.limitText))])]) : _vm._e()], 2), _vm._v(\\\" \\\"), (_vm.notify && _vm.closeOnSelect) ? _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"fadein\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"notify out\\\"\\n\\t }, [_vm._c('div', [_vm._v(_vm._s(_vm.limitText))])])]) : _vm._e()], 1)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-e514dbc6\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 158 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(159)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(160)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Slider.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-32185b82\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-32185b82\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Slider.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 159 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t computed: {\\n\\t index: function index() {\\n\\t return this.$parent.$children.indexOf(this);\\n\\t },\\n\\t show: function show() {\\n\\t return this.$parent.index === this.index;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this.$parent.indicator_list) {\\n\\t this.$parent.indicator_list.push(this.index);\\n\\t }\\n\\t\\n\\t if (this.index === 0) {\\n\\t this.$el.classList.add('active');\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 160 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"item\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-32185b82\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 161 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(162)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(164)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(165)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Spinner.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-8b298e70\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-8b298e70\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Spinner.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 162 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 164 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar MIN_WAIT = 500; // in ms\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t fixed: { type: Boolean, default: false },\\n\\t global: { type: Boolean, default: false },\\n\\t size: { type: String, default: 'md' },\\n\\t text: { type: String, default: '' },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t active: this.value,\\n\\t locked: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t spinnerSize: function spinnerSize() {\\n\\t return 'spinner-' + (this.size ? this.size : 'sm');\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t active: function active(val, old) {\\n\\t if (val !== old) this.$emit('input', val);\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this[val ? 'show' : 'hide']();\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t hide: function hide() {\\n\\t var delay = 0;\\n\\t this.active = false;\\n\\t },\\n\\t show: function show(options) {\\n\\t if (options) {\\n\\t if (options.text) {\\n\\t this.text = options.text;\\n\\t }\\n\\t if (options.size) {\\n\\t this.size = options.size;\\n\\t }\\n\\t if (options.fixed) {\\n\\t this.fixed = options.fixed;\\n\\t }\\n\\t }\\n\\t // block scrolling when spinner is on\\n\\t this._body.style.overflowY = 'hidden';\\n\\t // activate spinner\\n\\t this._started = new Date();\\n\\t this.active = true;\\n\\t this.locked = true;\\n\\t this._unlock();\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._body = document.body;\\n\\t this._bodyOverflow = document.body.style.overflowY;\\n\\t this._unlock = (0, _utils.delayer)(function () {\\n\\t this.locked = false;\\n\\t this._body.style.overflowY = this._bodyOverflow;\\n\\t }, MIN_WAIT);\\n\\t if (this.global) {\\n\\t if (!this.$root._globalSpinner) {\\n\\t this.$root._globalSpinner = true;\\n\\t var self = this;\\n\\t this._global = {\\n\\t hide: function hide() {\\n\\t self.hide();\\n\\t },\\n\\t show: function show() {\\n\\t self.show();\\n\\t }\\n\\t };\\n\\t this.$root.$on('spinner::show', this._global.show);\\n\\t this.$root.$on('spinner::hide', this._global.hide);\\n\\t }\\n\\t }\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._global) {\\n\\t this.$root.$off('spinner::show', this._global.show);\\n\\t this.$root.$off('spinner::hide', this._global.hide);\\n\\t delete this.$root._globalSpinner;\\n\\t }\\n\\t clearTimeout(this._spinnerAnimation);\\n\\t this._body.style.overflowY = this._bodyOverflow;\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 165 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.active || _vm.locked),\\n\\t expression: \\\"active||locked\\\"\\n\\t }],\\n\\t class: ['spinner spinner-gritcode', _vm.spinnerSize, {\\n\\t 'spinner-fixed': _vm.fixed\\n\\t }]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"spinner-wrapper\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"spinner-circle\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"spinner-text\\\"\\n\\t }, [_vm._v(_vm._s(_vm.text))])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-8b298e70\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 166 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(167)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(168)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tab.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-0985e878\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-0985e878\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tab.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 167 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t header: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t fadein: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t var _this = this;\\n\\t\\n\\t var active = !this._tabs || this._tabs.show === this;\\n\\t this.fadein = false;\\n\\t if (active) {\\n\\t setTimeout(function () {\\n\\t _this.fadein = true;\\n\\t }, 0);\\n\\t }\\n\\t return active;\\n\\t },\\n\\t index: function index() {\\n\\t return this._tabs.tabs.indexOf(this);\\n\\t },\\n\\t transition: function transition() {\\n\\t return this._tabs ? this._tabs.effect : null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTab = true;\\n\\t var tabs = this;\\n\\t while (!this._tabs && tabs.$parent) {\\n\\t if (tabs._isTabGroup) {\\n\\t tabs.tabs.push(this);\\n\\t this._tabGroup = tabs;\\n\\t }\\n\\t if (tabs._isTabs) {\\n\\t tabs.tabs.push(this);\\n\\t this._tabs = tabs;\\n\\t if (!this._tabGroup) tabs.headers.push(this);\\n\\t }\\n\\t tabs = tabs.$parent;\\n\\t }\\n\\t if (!this._tabs) throw Error('tab depend on tabs.');\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this._tabGroup) {\\n\\t this._tabGroup.tabs = this._tabGroup.tabs.filter(function (el) {\\n\\t return el !== _this2;\\n\\t });\\n\\t }\\n\\t if (this._tabs) {\\n\\t this._tabs.tabs = this._tabs.tabs.filter(function (el) {\\n\\t return el !== _this2;\\n\\t });\\n\\t }\\n\\t if (this._tabs) {\\n\\t if (this._tabs.active === this.index) {\\n\\t this._tabs.index = 0;\\n\\t }\\n\\t if (this._ingroup) {\\n\\t var id = this.$parent.tabs.indexOf(this);\\n\\t if (~id) this.$parent.tabs.splice(id, 1);\\n\\t }\\n\\t }\\n\\t if (this._tabs) {\\n\\t var _id = this._tabs.tabs.indexOf(this);\\n\\t if (~_id) this._tabs.tabs.splice(_id, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 168 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t ref: \\\"panel\\\",\\n\\t class: ['tab-pane', {\\n\\t 'active fade': _vm.active,\\n\\t 'in': _vm.fadein\\n\\t }],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"tabpanel\\\"\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-0985e878\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 169 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(170)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(172)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(173)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\TabGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-55faf3cb\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-55faf3cb\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] TabGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 170 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 172 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t header: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t show: false,\\n\\t tabs: []\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t return ~this.tabs.indexOf(this._tabs.show);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t blur: function blur() {\\n\\t this.show = false;\\n\\t },\\n\\t toggle: function toggle() {\\n\\t this.show = !this.show;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTabGroup = true;\\n\\t if (this.$parent) {\\n\\t if (this.$parent._isTabGroup) throw Error('Can\\\\'t nest tab-groups.');\\n\\t if (!this.$parent._isTabs) throw Error('tab-group depend on tabs.');\\n\\t }\\n\\t this._tabs = this.$parent;\\n\\t this._tabs.headers.push(this);\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 173 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-55faf3cb\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 174 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(175)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(177)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(178)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tabs.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-70100ddf\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-70100ddf\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tabs.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 175 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 177 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _Dropdown = __webpack_require__(105);\\n\\t\\n\\tvar _Dropdown2 = _interopRequireDefault(_Dropdown);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t components: {\\n\\t dropdown: _Dropdown2.default\\n\\t },\\n\\t props: {\\n\\t // effect: {type: String, default: 'fadein'},\\n\\t justified: false,\\n\\t navStyle: { type: String, default: null },\\n\\t value: { type: Number, default: 0 }\\n\\t },\\n\\t data: function data() {\\n\\t var index = this.value || 0;\\n\\t return {\\n\\t index: index,\\n\\t headers: [],\\n\\t tabs: []\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t index: function index(val) {\\n\\t this.$emit('active', val);\\n\\t this.$emit('input', val);\\n\\t },\\n\\t value: function value(val) {\\n\\t this.index = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t navStyleClass: function navStyleClass() {\\n\\t return ['nav', ~['pills', 'stacked'].indexOf(this.navStyle) ? 'nav-' + this.navStyle : 'nav-tabs', {\\n\\t 'nav-justified': _utils.coerce.boolean(this.justified),\\n\\t 'nav-pills': this.navStyle === 'stacked'\\n\\t }];\\n\\t },\\n\\t show: function show() {\\n\\t return this.tabs[this.index] || this.tabs[0];\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t select: function select(tab) {\\n\\t if (!tab.disabled) {\\n\\t this.index = this.tabs.indexOf(tab);\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTabs = true;\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 178 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t attrs: {\\n\\t \\\"tabs\\\": \\\"\\\"\\n\\t }\\n\\t }, [_vm._c('ul', {\\n\\t class: _vm.navStyleClass,\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"tablist\\\"\\n\\t }\\n\\t }, [_vm._l((_vm.headers), function(header) {\\n\\t return [(header._isTab) ? _vm._c('li', {\\n\\t class: {\\n\\t active: header.active, disabled: header.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(header)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"header\\\", [_vm._c('a', {\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"#\\\"\\n\\t },\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(header.header)\\n\\t }\\n\\t })])], 2) : _vm._e(), _vm._v(\\\" \\\"), (header._isTabGroup) ? _vm._c('dropdown', {\\n\\t class: {\\n\\t active: header.active\\n\\t },\\n\\t attrs: {\\n\\t \\\"text\\\": header.header,\\n\\t \\\"disabled\\\": header.disabled\\n\\t }\\n\\t }, _vm._l((header.tabs), function(tab) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t disabled: tab.disabled\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"#\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(tab)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(tab.header))])])\\n\\t })) : _vm._e()]\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"tab-content\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-70100ddf\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 179 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(180)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(181)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\ToggleButton.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-f034a5f2\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-f034a5f2\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] ToggleButton.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 180 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { default: null },\\n\\t falseType: { default: null },\\n\\t name: null,\\n\\t readonly: { default: null },\\n\\t trueType: { default: 'primary' },\\n\\t value: false\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t active: _utils.coerce.boolean(this.value),\\n\\t types: {\\n\\t danger: 'btn-danger',\\n\\t info: 'btn-info',\\n\\t primary: 'btn-primary',\\n\\t success: 'btn-success',\\n\\t warning: 'btn-warning'\\n\\t }\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t active: function active(val, old) {\\n\\t if (val !== old) {\\n\\t this.$emit('changed', val);\\n\\t this.$emit(val ? 'enabled' : 'disabled');\\n\\t this.$emit('input', val);\\n\\t }\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this.active = _utils.coerce.boolean(this.value);\\n\\t }\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t boolDisabled: function boolDisabled() {\\n\\t return _utils.coerce.boolean(this.disabled);\\n\\t },\\n\\t boolReadonly: function boolReadonly() {\\n\\t return _utils.coerce.boolean(this.readonly);\\n\\t },\\n\\t type: function type() {\\n\\t return this.types[this.value ? this.trueType : this.falseType] || 'btn-default';\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggle: function toggle() {\\n\\t if (this.boolDisabled || this.boolReadonly) {\\n\\t return;\\n\\t }\\n\\t this.active = !this.active;\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 181 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('a', {\\n\\t class: ['btn', _vm.type, {\\n\\t readonly: _vm.boolReadonly\\n\\t }],\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"javascript:void(0)\\\",\\n\\t \\\"disabled\\\": _vm.boolDisabled\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggle\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t class: ['glyphicon', 'glyphicon-' + (_vm.value ? 'ok' : 'remove')]\\n\\t }), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), (_vm.name) ? _vm._c('input', {\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"hidden\\\",\\n\\t \\\"name\\\": _vm.name\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.active ? 1 : 0\\n\\t }\\n\\t }) : _vm._e()], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-f034a5f2\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 182 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(183)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(185)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(186)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tooltip.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-48fb51b2\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-48fb51b2\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tooltip.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 183 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 185 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _popoverMixins = __webpack_require__(143);\\n\\t\\n\\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t mixins: [_popoverMixins2.default],\\n\\t props: {\\n\\t effect: { type: String, default: 'scale' },\\n\\t trigger: { type: String, default: 'hover' }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 186 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', {\\n\\t ref: \\\"trigger\\\"\\n\\t }, [_vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.effect\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t ref: \\\"popover\\\",\\n\\t class: ['tooltip', _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"tooltip-arrow\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"tooltip-inner\\\"\\n\\t }, [_vm._t(\\\"content\\\", [_vm._c('div', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.content)\\n\\t }\\n\\t })])], 2)]) : _vm._e()])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-48fb51b2\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 187 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(188)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(190)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(206)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Typeahead.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-5b5f5e94\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-5b5f5e94\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Typeahead.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 188 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 190 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _typeof2 = __webpack_require__(191);\\n\\t\\n\\tvar _typeof3 = _interopRequireDefault(_typeof2);\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\tvar DELAY = 300; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t async: { type: String },\\n\\t data: { type: Array },\\n\\t delay: { type: Number, default: DELAY },\\n\\t asyncKey: { type: String, default: null },\\n\\t limit: { type: Number, default: 8 },\\n\\t matchCase: { type: Boolean, default: false },\\n\\t matchStart: { type: Boolean, default: false },\\n\\t onHit: {\\n\\t type: Function,\\n\\t default: function _default(item) {\\n\\t return item;\\n\\t }\\n\\t },\\n\\t placeholder: { type: String },\\n\\t template: { type: String },\\n\\t type: { type: String, default: 'text' },\\n\\t value: { type: String, default: '' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t asign: '',\\n\\t showDropdown: false,\\n\\t noResults: true,\\n\\t current: 0,\\n\\t items: [],\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t templateComp: function templateComp() {\\n\\t return {\\n\\t template: typeof this.template === 'string' ? '' + this.template + '' : '',\\n\\t props: { item: { default: null } }\\n\\t };\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t if (_val !== old && _val !== this.asign) this.__update();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t setItems: function setItems(data) {\\n\\t var _this = this;\\n\\t\\n\\t if (this.async) {\\n\\t this.items = this.asyncKey ? data[this.asyncKey] : data;\\n\\t this.items = this.items.slice(0, this.limit);\\n\\t } else {\\n\\t this.items = (data || []).filter(function (value) {\\n\\t if ((typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) === 'object') {\\n\\t return true;\\n\\t }\\n\\t value = _this.matchCase ? value : value.toLowerCase();\\n\\t var query = _this.matchCase ? _this.val : _this.val.toLowerCase();\\n\\t return _this.matchStart ? value.indexOf(query) === 0 : value.indexOf(query) !== -1;\\n\\t }).slice(0, this.limit);\\n\\t }\\n\\t this.showDropdown = this.items.length > 0;\\n\\t },\\n\\t setValue: function setValue(value) {\\n\\t this.asign = value;\\n\\t this.val = value;\\n\\t this.items = [];\\n\\t this.loading = false;\\n\\t this.showDropdown = false;\\n\\t },\\n\\t reset: function reset() {\\n\\t this.setValue(null);\\n\\t },\\n\\t setActive: function setActive(index) {\\n\\t this.current = index;\\n\\t },\\n\\t isActive: function isActive(index) {\\n\\t return this.current === index;\\n\\t },\\n\\t hit: function hit(e) {\\n\\t e.preventDefault();\\n\\t this.setValue(this.onHit(this.items[this.current], this));\\n\\t },\\n\\t up: function up() {\\n\\t if (this.current > 0) {\\n\\t this.current--;\\n\\t } else {\\n\\t this.current = this.items.length - 1;\\n\\t }\\n\\t },\\n\\t down: function down() {\\n\\t if (this.current < this.items.length - 1) {\\n\\t this.current++;\\n\\t } else {\\n\\t this.current = 0;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this.__update = (0, _utils.delayer)(function () {\\n\\t var _this2 = this;\\n\\t\\n\\t if (!this.val) {\\n\\t this.reset();\\n\\t return;\\n\\t }\\n\\t this.asign = '';\\n\\t if (this.async) {\\n\\t (0, _utils.getJSON)(this.async + this.val).then(function (data) {\\n\\t _this2.setItems(data);\\n\\t });\\n\\t } else if (this.data) {\\n\\t this.setItems(this.data);\\n\\t }\\n\\t }, 'delay', DELAY);\\n\\t this.__update();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 191 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t\\\"use strict\\\";\\n\\t\\n\\texports.__esModule = true;\\n\\t\\n\\tvar _iterator = __webpack_require__(20);\\n\\t\\n\\tvar _iterator2 = _interopRequireDefault(_iterator);\\n\\t\\n\\tvar _symbol = __webpack_require__(192);\\n\\t\\n\\tvar _symbol2 = _interopRequireDefault(_symbol);\\n\\t\\n\\tvar _typeof = typeof _symbol2.default === \\\"function\\\" && typeof _iterator2.default === \\\"symbol\\\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \\\"function\\\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \\\"symbol\\\" : typeof obj; };\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = typeof _symbol2.default === \\\"function\\\" && _typeof(_iterator2.default) === \\\"symbol\\\" ? function (obj) {\\n\\t return typeof obj === \\\"undefined\\\" ? \\\"undefined\\\" : _typeof(obj);\\n\\t} : function (obj) {\\n\\t return obj && typeof _symbol2.default === \\\"function\\\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \\\"symbol\\\" : typeof obj === \\\"undefined\\\" ? \\\"undefined\\\" : _typeof(obj);\\n\\t};\\n\\n/***/ },\\n/* 192 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports = { \\\"default\\\": __webpack_require__(193), __esModule: true };\\n\\n/***/ },\\n/* 193 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(194);\\n\\t__webpack_require__(203);\\n\\t__webpack_require__(204);\\n\\t__webpack_require__(205);\\n\\tmodule.exports = __webpack_require__(7).Symbol;\\n\\n/***/ },\\n/* 194 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t// ECMAScript 6 symbols shim\\n\\tvar global = __webpack_require__(6)\\n\\t , has = __webpack_require__(29)\\n\\t , DESCRIPTORS = __webpack_require__(15)\\n\\t , $export = __webpack_require__(5)\\n\\t , redefine = __webpack_require__(28)\\n\\t , META = __webpack_require__(195).KEY\\n\\t , $fails = __webpack_require__(16)\\n\\t , shared = __webpack_require__(43)\\n\\t , setToStringTag = __webpack_require__(47)\\n\\t , uid = __webpack_require__(44)\\n\\t , wks = __webpack_require__(48)\\n\\t , wksExt = __webpack_require__(55)\\n\\t , wksDefine = __webpack_require__(196)\\n\\t , keyOf = __webpack_require__(197)\\n\\t , enumKeys = __webpack_require__(198)\\n\\t , isArray = __webpack_require__(201)\\n\\t , anObject = __webpack_require__(12)\\n\\t , toIObject = __webpack_require__(36)\\n\\t , toPrimitive = __webpack_require__(18)\\n\\t , createDesc = __webpack_require__(19)\\n\\t , _create = __webpack_require__(32)\\n\\t , gOPNExt = __webpack_require__(60)\\n\\t , $GOPD = __webpack_require__(202)\\n\\t , $DP = __webpack_require__(11)\\n\\t , $keys = __webpack_require__(34)\\n\\t , gOPD = $GOPD.f\\n\\t , dP = $DP.f\\n\\t , gOPN = gOPNExt.f\\n\\t , $Symbol = global.Symbol\\n\\t , $JSON = global.JSON\\n\\t , _stringify = $JSON && $JSON.stringify\\n\\t , PROTOTYPE = 'prototype'\\n\\t , HIDDEN = wks('_hidden')\\n\\t , TO_PRIMITIVE = wks('toPrimitive')\\n\\t , isEnum = {}.propertyIsEnumerable\\n\\t , SymbolRegistry = shared('symbol-registry')\\n\\t , AllSymbols = shared('symbols')\\n\\t , OPSymbols = shared('op-symbols')\\n\\t , ObjectProto = Object[PROTOTYPE]\\n\\t , USE_NATIVE = typeof $Symbol == 'function'\\n\\t , QObject = global.QObject;\\n\\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\\n\\tvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\\n\\t\\n\\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\\n\\tvar setSymbolDesc = DESCRIPTORS && $fails(function(){\\n\\t return _create(dP({}, 'a', {\\n\\t get: function(){ return dP(this, 'a', {value: 7}).a; }\\n\\t })).a != 7;\\n\\t}) ? function(it, key, D){\\n\\t var protoDesc = gOPD(ObjectProto, key);\\n\\t if(protoDesc)delete ObjectProto[key];\\n\\t dP(it, key, D);\\n\\t if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\\n\\t} : dP;\\n\\t\\n\\tvar wrap = function(tag){\\n\\t var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\\n\\t sym._k = tag;\\n\\t return sym;\\n\\t};\\n\\t\\n\\tvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\\n\\t return typeof it == 'symbol';\\n\\t} : function(it){\\n\\t return it instanceof $Symbol;\\n\\t};\\n\\t\\n\\tvar $defineProperty = function defineProperty(it, key, D){\\n\\t if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\\n\\t anObject(it);\\n\\t key = toPrimitive(key, true);\\n\\t anObject(D);\\n\\t if(has(AllSymbols, key)){\\n\\t if(!D.enumerable){\\n\\t if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\\n\\t it[HIDDEN][key] = true;\\n\\t } else {\\n\\t if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\\n\\t D = _create(D, {enumerable: createDesc(0, false)});\\n\\t } return setSymbolDesc(it, key, D);\\n\\t } return dP(it, key, D);\\n\\t};\\n\\tvar $defineProperties = function defineProperties(it, P){\\n\\t anObject(it);\\n\\t var keys = enumKeys(P = toIObject(P))\\n\\t , i = 0\\n\\t , l = keys.length\\n\\t , key;\\n\\t while(l > i)$defineProperty(it, key = keys[i++], P[key]);\\n\\t return it;\\n\\t};\\n\\tvar $create = function create(it, P){\\n\\t return P === undefined ? _create(it) : $defineProperties(_create(it), P);\\n\\t};\\n\\tvar $propertyIsEnumerable = function propertyIsEnumerable(key){\\n\\t var E = isEnum.call(this, key = toPrimitive(key, true));\\n\\t if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\\n\\t return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\\n\\t};\\n\\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\\n\\t it = toIObject(it);\\n\\t key = toPrimitive(key, true);\\n\\t if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\\n\\t var D = gOPD(it, key);\\n\\t if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\\n\\t return D;\\n\\t};\\n\\tvar $getOwnPropertyNames = function getOwnPropertyNames(it){\\n\\t var names = gOPN(toIObject(it))\\n\\t , result = []\\n\\t , i = 0\\n\\t , key;\\n\\t while(names.length > i){\\n\\t if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\\n\\t } return result;\\n\\t};\\n\\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\\n\\t var IS_OP = it === ObjectProto\\n\\t , names = gOPN(IS_OP ? OPSymbols : toIObject(it))\\n\\t , result = []\\n\\t , i = 0\\n\\t , key;\\n\\t while(names.length > i){\\n\\t if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\\n\\t } return result;\\n\\t};\\n\\t\\n\\t// 19.4.1.1 Symbol([description])\\n\\tif(!USE_NATIVE){\\n\\t $Symbol = function Symbol(){\\n\\t if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\\n\\t var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\\n\\t var $set = function(value){\\n\\t if(this === ObjectProto)$set.call(OPSymbols, value);\\n\\t if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\\n\\t setSymbolDesc(this, tag, createDesc(1, value));\\n\\t };\\n\\t if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\\n\\t return wrap(tag);\\n\\t };\\n\\t redefine($Symbol[PROTOTYPE], 'toString', function toString(){\\n\\t return this._k;\\n\\t });\\n\\t\\n\\t $GOPD.f = $getOwnPropertyDescriptor;\\n\\t $DP.f = $defineProperty;\\n\\t __webpack_require__(61).f = gOPNExt.f = $getOwnPropertyNames;\\n\\t __webpack_require__(200).f = $propertyIsEnumerable;\\n\\t __webpack_require__(199).f = $getOwnPropertySymbols;\\n\\t\\n\\t if(DESCRIPTORS && !__webpack_require__(27)){\\n\\t redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\\n\\t }\\n\\t\\n\\t wksExt.f = function(name){\\n\\t return wrap(wks(name));\\n\\t }\\n\\t}\\n\\t\\n\\t$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\\n\\t\\n\\tfor(var symbols = (\\n\\t // 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\\t 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\\n\\t).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\\n\\t\\n\\tfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\\n\\t\\n\\t$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\\n\\t // 19.4.2.1 Symbol.for(key)\\n\\t 'for': function(key){\\n\\t return has(SymbolRegistry, key += '')\\n\\t ? SymbolRegistry[key]\\n\\t : SymbolRegistry[key] = $Symbol(key);\\n\\t },\\n\\t // 19.4.2.5 Symbol.keyFor(sym)\\n\\t keyFor: function keyFor(key){\\n\\t if(isSymbol(key))return keyOf(SymbolRegistry, key);\\n\\t throw TypeError(key + ' is not a symbol!');\\n\\t },\\n\\t useSetter: function(){ setter = true; },\\n\\t useSimple: function(){ setter = false; }\\n\\t});\\n\\t\\n\\t$export($export.S + $export.F * !USE_NATIVE, 'Object', {\\n\\t // 19.1.2.2 Object.create(O [, Properties])\\n\\t create: $create,\\n\\t // 19.1.2.4 Object.defineProperty(O, P, Attributes)\\n\\t defineProperty: $defineProperty,\\n\\t // 19.1.2.3 Object.defineProperties(O, Properties)\\n\\t defineProperties: $defineProperties,\\n\\t // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\\n\\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\\n\\t // 19.1.2.7 Object.getOwnPropertyNames(O)\\n\\t getOwnPropertyNames: $getOwnPropertyNames,\\n\\t // 19.1.2.8 Object.getOwnPropertySymbols(O)\\n\\t getOwnPropertySymbols: $getOwnPropertySymbols\\n\\t});\\n\\t\\n\\t// 24.3.2 JSON.stringify(value [, replacer [, space]])\\n\\t$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\\n\\t var S = $Symbol();\\n\\t // MS Edge converts symbol values to JSON as {}\\n\\t // WebKit converts symbol values to JSON as null\\n\\t // V8 throws on boxed symbols\\n\\t return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\\n\\t})), 'JSON', {\\n\\t stringify: function stringify(it){\\n\\t if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\\n\\t var args = [it]\\n\\t , i = 1\\n\\t , replacer, $replacer;\\n\\t while(arguments.length > i)args.push(arguments[i++]);\\n\\t replacer = args[1];\\n\\t if(typeof replacer == 'function')$replacer = replacer;\\n\\t if($replacer || !isArray(replacer))replacer = function(key, value){\\n\\t if($replacer)value = $replacer.call(this, key, value);\\n\\t if(!isSymbol(value))return value;\\n\\t };\\n\\t args[1] = replacer;\\n\\t return _stringify.apply($JSON, args);\\n\\t }\\n\\t});\\n\\t\\n\\t// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\\n\\t$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\\n\\t// 19.4.3.5 Symbol.prototype[@@toStringTag]\\n\\tsetToStringTag($Symbol, 'Symbol');\\n\\t// 20.2.1.9 Math[@@toStringTag]\\n\\tsetToStringTag(Math, 'Math', true);\\n\\t// 24.3.3 JSON[@@toStringTag]\\n\\tsetToStringTag(global.JSON, 'JSON', true);\\n\\n/***/ },\\n/* 195 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar META = __webpack_require__(44)('meta')\\n\\t , isObject = __webpack_require__(13)\\n\\t , has = __webpack_require__(29)\\n\\t , setDesc = __webpack_require__(11).f\\n\\t , id = 0;\\n\\tvar isExtensible = Object.isExtensible || function(){\\n\\t return true;\\n\\t};\\n\\tvar FREEZE = !__webpack_require__(16)(function(){\\n\\t return isExtensible(Object.preventExtensions({}));\\n\\t});\\n\\tvar setMeta = function(it){\\n\\t setDesc(it, META, {value: {\\n\\t i: 'O' + ++id, // object ID\\n\\t w: {} // weak collections IDs\\n\\t }});\\n\\t};\\n\\tvar fastKey = function(it, create){\\n\\t // return primitive with prefix\\n\\t if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\\n\\t if(!has(it, META)){\\n\\t // can't set metadata to uncaught frozen object\\n\\t if(!isExtensible(it))return 'F';\\n\\t // not necessary to add metadata\\n\\t if(!create)return 'E';\\n\\t // add missing metadata\\n\\t setMeta(it);\\n\\t // return object ID\\n\\t } return it[META].i;\\n\\t};\\n\\tvar getWeak = function(it, create){\\n\\t if(!has(it, META)){\\n\\t // can't set metadata to uncaught frozen object\\n\\t if(!isExtensible(it))return true;\\n\\t // not necessary to add metadata\\n\\t if(!create)return false;\\n\\t // add missing metadata\\n\\t setMeta(it);\\n\\t // return hash weak collections IDs\\n\\t } return it[META].w;\\n\\t};\\n\\t// add metadata on freeze-family methods calling\\n\\tvar onFreeze = function(it){\\n\\t if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);\\n\\t return it;\\n\\t};\\n\\tvar meta = module.exports = {\\n\\t KEY: META,\\n\\t NEED: false,\\n\\t fastKey: fastKey,\\n\\t getWeak: getWeak,\\n\\t onFreeze: onFreeze\\n\\t};\\n\\n/***/ },\\n/* 196 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar global = __webpack_require__(6)\\n\\t , core = __webpack_require__(7)\\n\\t , LIBRARY = __webpack_require__(27)\\n\\t , wksExt = __webpack_require__(55)\\n\\t , defineProperty = __webpack_require__(11).f;\\n\\tmodule.exports = function(name){\\n\\t var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\\n\\t if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\\n\\t};\\n\\n/***/ },\\n/* 197 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar getKeys = __webpack_require__(34)\\n\\t , toIObject = __webpack_require__(36);\\n\\tmodule.exports = function(object, el){\\n\\t var O = toIObject(object)\\n\\t , keys = getKeys(O)\\n\\t , length = keys.length\\n\\t , index = 0\\n\\t , key;\\n\\t while(length > index)if(O[key = keys[index++]] === el)return key;\\n\\t};\\n\\n/***/ },\\n/* 198 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// all enumerable object keys, includes symbols\\n\\tvar getKeys = __webpack_require__(34)\\n\\t , gOPS = __webpack_require__(199)\\n\\t , pIE = __webpack_require__(200);\\n\\tmodule.exports = function(it){\\n\\t var result = getKeys(it)\\n\\t , getSymbols = gOPS.f;\\n\\t if(getSymbols){\\n\\t var symbols = getSymbols(it)\\n\\t , isEnum = pIE.f\\n\\t , i = 0\\n\\t , key;\\n\\t while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\\n\\t } return result;\\n\\t};\\n\\n/***/ },\\n/* 199 */\\n/***/ function(module, exports) {\\n\\n\\texports.f = Object.getOwnPropertySymbols;\\n\\n/***/ },\\n/* 200 */\\n/***/ function(module, exports) {\\n\\n\\texports.f = {}.propertyIsEnumerable;\\n\\n/***/ },\\n/* 201 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 7.2.2 IsArray(argument)\\n\\tvar cof = __webpack_require__(38);\\n\\tmodule.exports = Array.isArray || function isArray(arg){\\n\\t return cof(arg) == 'Array';\\n\\t};\\n\\n/***/ },\\n/* 202 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar pIE = __webpack_require__(200)\\n\\t , createDesc = __webpack_require__(19)\\n\\t , toIObject = __webpack_require__(36)\\n\\t , toPrimitive = __webpack_require__(18)\\n\\t , has = __webpack_require__(29)\\n\\t , IE8_DOM_DEFINE = __webpack_require__(14)\\n\\t , gOPD = Object.getOwnPropertyDescriptor;\\n\\t\\n\\texports.f = __webpack_require__(15) ? gOPD : function getOwnPropertyDescriptor(O, P){\\n\\t O = toIObject(O);\\n\\t P = toPrimitive(P, true);\\n\\t if(IE8_DOM_DEFINE)try {\\n\\t return gOPD(O, P);\\n\\t } catch(e){ /* empty */ }\\n\\t if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\\n\\t};\\n\\n/***/ },\\n/* 203 */\\n/***/ function(module, exports) {\\n\\n\\n\\n/***/ },\\n/* 204 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(196)('asyncIterator');\\n\\n/***/ },\\n/* 205 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(196)('observable');\\n\\n/***/ },\\n/* 206 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: {\\n\\t open: _vm.showDropdown\\n\\t },\\n\\t staticStyle: {\\n\\t \\\"position\\\": \\\"relative\\\"\\n\\t }\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"type\\\": _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": function($event) {\\n\\t _vm.showDropdown = false\\n\\t },\\n\\t \\\"keydown\\\": [function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"down\\\", 40)) { return; }\\n\\t $event.preventDefault();\\n\\t _vm.down($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.hit($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.reset($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"up\\\", 38)) { return; }\\n\\t $event.preventDefault();\\n\\t _vm.up($event)\\n\\t }],\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('ul', {\\n\\t ref: \\\"dropdown\\\",\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, _vm._l((_vm.items), function(item, i) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t active: _vm.isActive(i)\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.hit($event)\\n\\t },\\n\\t \\\"mousemove\\\": function($event) {\\n\\t _vm.setActive(i)\\n\\t }\\n\\t }\\n\\t }, [_vm._c(_vm.templateComp, {\\n\\t tag: \\\"component\\\",\\n\\t attrs: {\\n\\t \\\"item\\\": item\\n\\t }\\n\\t })], 1)])\\n\\t }))])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-5b5f5e94\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ }\\n/******/ ])\\n});\\n;\\n//# sourceMappingURL=vue-strap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3Z1ZS1zdHJhcC9kaXN0L3Z1ZS1zdHJhcC5qcz9lMTQ3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogdnVlLXN0cmFwIDIuMC4yXG4gKiBodHRwOi8vd2ZmcmFuY28uZ2l0aHViLmlvL3Z1ZS1zdHJhcC9cbiAqIENvbXBpbGVkIHVzaW5nIFZ1ZSAyLjEuMTBcbiAqL1xuKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiVnVlU3RyYXBcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiVnVlU3RyYXBcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdHZhciBfU2Nyb2xsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OCk7XG5cdFxuXHR2YXIgX1Njcm9sbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TY3JvbGwpO1xuXHRcblx0dmFyIF9BY2NvcmRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5KTtcblx0XG5cdHZhciBfQWNjb3JkaW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FjY29yZGlvbik7XG5cdFxuXHR2YXIgX0FmZml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Mik7XG5cdFxuXHR2YXIgX0FmZml4MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FmZml4KTtcblx0XG5cdHZhciBfQWxlcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1KTtcblx0XG5cdHZhciBfQWxlcnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQWxlcnQpO1xuXHRcblx0dmFyIF9Bc2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oODIpO1xuXHRcblx0dmFyIF9Bc2lkZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Bc2lkZSk7XG5cdFxuXHR2YXIgX0J1dHRvbkdyb3VwID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4Nyk7XG5cdFxuXHR2YXIgX0J1dHRvbkdyb3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0J1dHRvbkdyb3VwKTtcblx0XG5cdHZhciBfQ2Fyb3VzZWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwKTtcblx0XG5cdHZhciBfQ2Fyb3VzZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2Fyb3VzZWwpO1xuXHRcblx0dmFyIF9DaGVja2JveCA9IF9fd2VicGFja19yZXF1aXJlX18oOTUpO1xuXHRcblx0dmFyIF9DaGVja2JveDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DaGVja2JveCk7XG5cdFxuXHR2YXIgX0RhdGVwaWNrZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMCk7XG5cdFxuXHR2YXIgX0RhdGVwaWNrZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRGF0ZXBpY2tlcik7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDUpO1xuXHRcblx0dmFyIF9Ecm9wZG93bjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ecm9wZG93bik7XG5cdFxuXHR2YXIgX0Zvcm1Hcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTA4KTtcblx0XG5cdHZhciBfRm9ybUdyb3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1Hcm91cCk7XG5cdFxuXHR2YXIgX0Zvcm1WYWxpZGF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMSk7XG5cdFxuXHR2YXIgX0Zvcm1WYWxpZGF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRm9ybVZhbGlkYXRvcik7XG5cdFxuXHR2YXIgX0lucHV0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTQpO1xuXHRcblx0dmFyIF9JbnB1dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9JbnB1dCk7XG5cdFxuXHR2YXIgX01vZGFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTkpO1xuXHRcblx0dmFyIF9Nb2RhbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbCk7XG5cdFxuXHR2YXIgX05hdmJhciA9IF9fd2VicGFja19yZXF1aXJlX18oMTI4KTtcblx0XG5cdHZhciBfTmF2YmFyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdmJhcik7XG5cdFxuXHR2YXIgX09wdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTMxKTtcblx0XG5cdHZhciBfT3B0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX09wdGlvbik7XG5cdFxuXHR2YXIgX1BhbmVsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzQpO1xuXHRcblx0dmFyIF9QYW5lbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QYW5lbCk7XG5cdFxuXHR2YXIgX1BvcG92ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzOSk7XG5cdFxuXHR2YXIgX1BvcG92ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUG9wb3Zlcik7XG5cdFxuXHR2YXIgX1Byb2dyZXNzYmFyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDUpO1xuXHRcblx0dmFyIF9Qcm9ncmVzc2JhcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qcm9ncmVzc2Jhcik7XG5cdFxuXHR2YXIgX1JhZGlvID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDgpO1xuXHRcblx0dmFyIF9SYWRpbzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9SYWRpbyk7XG5cdFxuXHR2YXIgX1NlbGVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUzKTtcblx0XG5cdHZhciBfU2VsZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NlbGVjdCk7XG5cdFxuXHR2YXIgX1NsaWRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTU4KTtcblx0XG5cdHZhciBfU2xpZGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NsaWRlcik7XG5cdFxuXHR2YXIgX1NwaW5uZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2MSk7XG5cdFxuXHR2YXIgX1NwaW5uZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU3Bpbm5lcik7XG5cdFxuXHR2YXIgX1RhYiA9IF9fd2VicGFja19yZXF1aXJlX18oMTY2KTtcblx0XG5cdHZhciBfVGFiMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYik7XG5cdFxuXHR2YXIgX1RhYkdyb3VwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjkpO1xuXHRcblx0dmFyIF9UYWJHcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJHcm91cCk7XG5cdFxuXHR2YXIgX1RhYnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NCk7XG5cdFxuXHR2YXIgX1RhYnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFicyk7XG5cdFxuXHR2YXIgX1RvZ2dsZUJ1dHRvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTc5KTtcblx0XG5cdHZhciBfVG9nZ2xlQnV0dG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RvZ2dsZUJ1dHRvbik7XG5cdFxuXHR2YXIgX1Rvb2x0aXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4Mik7XG5cdFxuXHR2YXIgX1Rvb2x0aXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVG9vbHRpcCk7XG5cdFxuXHR2YXIgX1R5cGVhaGVhZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTg3KTtcblx0XG5cdHZhciBfVHlwZWFoZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1R5cGVhaGVhZCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly8gQ29tcG9uZW50c1xuXHRcblx0Ly8gRGlyZWN0aXZlc1xuXHQvLyBVdGlsc1xuXHR2YXIgVnVlU3RyYXAgPSB7XG5cdCAgZGlyZWN0aXZlczoge1xuXHQgICAgQ2xpY2tPdXRzaWRlOiBfQ2xpY2tPdXRzaWRlMi5kZWZhdWx0LFxuXHQgICAgU2Nyb2xsOiBfU2Nyb2xsMi5kZWZhdWx0XG5cdCAgfSxcblx0ICB1dGlsczoge1xuXHQgICAgJDogX05vZGVMaXN0Mi5kZWZhdWx0LFxuXHQgICAgY29lcmNlOiBfdXRpbHMuY29lcmNlXG5cdCAgfSxcblx0ICAvL2NvbXBvbmVudHNcblx0ICBhY2NvcmRpb246IF9BY2NvcmRpb24yLmRlZmF1bHQsXG5cdCAgYWZmaXg6IF9BZmZpeDIuZGVmYXVsdCxcblx0ICBhbGVydDogX0FsZXJ0Mi5kZWZhdWx0LFxuXHQgIGFzaWRlOiBfQXNpZGUyLmRlZmF1bHQsXG5cdCAgYnV0dG9uR3JvdXA6IF9CdXR0b25Hcm91cDIuZGVmYXVsdCxcblx0ICBjYXJvdXNlbDogX0Nhcm91c2VsMi5kZWZhdWx0LFxuXHQgIGNoZWNrYm94OiBfQ2hlY2tib3gyLmRlZmF1bHQsXG5cdCAgZGF0ZXBpY2tlcjogX0RhdGVwaWNrZXIyLmRlZmF1bHQsXG5cdCAgZHJvcGRvd246IF9Ecm9wZG93bjIuZGVmYXVsdCxcblx0ICBmb3JtR3JvdXA6IF9Gb3JtR3JvdXAyLmRlZmF1bHQsXG5cdCAgZm9ybVZhbGlkYXRvcjogX0Zvcm1WYWxpZGF0b3IyLmRlZmF1bHQsXG5cdCAgaW5wdXQ6IF9JbnB1dDIuZGVmYXVsdCxcblx0ICBtb2RhbDogX01vZGFsMi5kZWZhdWx0LFxuXHQgIG5hdmJhcjogX05hdmJhcjIuZGVmYXVsdCxcblx0ICBvcHRpb246IF9PcHRpb24yLmRlZmF1bHQsXG5cdCAgcGFuZWw6IF9QYW5lbDIuZGVmYXVsdCxcblx0ICBwb3BvdmVyOiBfUG9wb3ZlcjIuZGVmYXVsdCxcblx0ICBwcm9ncmVzc2JhcjogX1Byb2dyZXNzYmFyMi5kZWZhdWx0LFxuXHQgIHJhZGlvOiBfUmFkaW8yLmRlZmF1bHQsXG5cdCAgc2VsZWN0OiBfU2VsZWN0Mi5kZWZhdWx0LFxuXHQgIHNsaWRlcjogX1NsaWRlcjIuZGVmYXVsdCxcblx0ICBzcGlubmVyOiBfU3Bpbm5lcjIuZGVmYXVsdCxcblx0ICB0YWI6IF9UYWIyLmRlZmF1bHQsXG5cdCAgdGFiR3JvdXA6IF9UYWJHcm91cDIuZGVmYXVsdCxcblx0ICB0YWJzOiBfVGFiczIuZGVmYXVsdCxcblx0ICB0b2dnbGVCdXR0b246IF9Ub2dnbGVCdXR0b24yLmRlZmF1bHQsXG5cdCAgdG9vbHRpcDogX1Rvb2x0aXAyLmRlZmF1bHQsXG5cdCAgdHlwZWFoZWFkOiBfVHlwZWFoZWFkMi5kZWZhdWx0XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IFZ1ZVN0cmFwO1xuXG4vKioqLyB9LFxuLyogMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXHRcblx0dmFyIF9pdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xuXHRcblx0dmFyIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvcik7XG5cdFxuXHR2YXIgX2dldE93blByb3BlcnR5TmFtZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2KTtcblx0XG5cdHZhciBfZ2V0T3duUHJvcGVydHlOYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRPd25Qcm9wZXJ0eU5hbWVzKTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Mik7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzMiA9IF9fd2VicGFja19yZXF1aXJlX18oNjMpO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdF9fd2VicGFja19yZXF1aXJlX18oNjQpO1xuXHRcblx0dmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cdHZhciBub2RlRXJyb3IgPSBuZXcgRXJyb3IoJ1Bhc3NlZCBhcmd1bWVudHMgbXVzdCBiZSBvZiBOb2RlJyk7XG5cdHZhciBibHVyRXZlbnQ7XG5cdHZhciBibHVyTGlzdCA9IFtdO1xuXHR2YXIgRXZlbnRzID0gW107XG5cdFxuXHRmdW5jdGlvbiBpc05vZGUodmFsKSB7XG5cdCAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHdpbmRvdy5Ob2RlO1xuXHR9XG5cdGZ1bmN0aW9uIGlzTm9kZUxpc3QodmFsKSB7XG5cdCAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHdpbmRvdy5Ob2RlTGlzdCB8fCB2YWwgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENvbGxlY3Rpb24gfHwgdmFsIGluc3RhbmNlb2YgQXJyYXk7XG5cdH1cblx0XG5cdHZhciBOb2RlTGlzdCA9IGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBOb2RlTGlzdChhcmdzKSB7XG5cdCAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBOb2RlTGlzdCk7XG5cdFxuXHQgICAgdmFyIG5vZGVzID0gYXJncztcblx0ICAgIGlmIChhcmdzWzBdID09PSB3aW5kb3cpIHtcblx0ICAgICAgbm9kZXMgPSBbd2luZG93XTtcblx0ICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgIG5vZGVzID0gKGFyZ3NbMV0gfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoYXJnc1swXSk7XG5cdCAgICAgIGlmIChhcmdzWzFdKSB7XG5cdCAgICAgICAgdGhpcy5vd25lciA9IGFyZ3NbMV07XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAoMCBpbiBhcmdzICYmICFpc05vZGUoYXJnc1swXSkgJiYgYXJnc1swXSAmJiAnbGVuZ3RoJyBpbiBhcmdzWzBdKSB7XG5cdCAgICAgIG5vZGVzID0gYXJnc1swXTtcblx0ICAgICAgaWYgKGFyZ3NbMV0pIHtcblx0ICAgICAgICB0aGlzLm93bmVyID0gYXJnc1sxXTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaWYgKG5vZGVzKSB7XG5cdCAgICAgIGZvciAodmFyIGkgaW4gbm9kZXMpIHtcblx0ICAgICAgICB0aGlzW2ldID0gbm9kZXNbaV07XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5sZW5ndGggPSBub2Rlcy5sZW5ndGg7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmxlbmd0aCA9IDA7XG5cdCAgICB9XG5cdCAgICB3aW5kb3cucHJ1ZWJhID0gdGhpcztcblx0ICB9XG5cdFxuXHQgICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKE5vZGVMaXN0LCBbe1xuXHQgICAga2V5OiAnY29uY2F0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjb25jYXQoKSB7XG5cdCAgICAgIHZhciBub2RlcyA9IEFycmF5UHJvdG8uc2xpY2UuY2FsbCh0aGlzKTtcblx0ICAgICAgZnVuY3Rpb24gZmxhdHRlbihhcnIpIHtcblx0ICAgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcnIsIGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGlzTm9kZShlbCkpIHtcblx0ICAgICAgICAgICAgaWYgKCF+bm9kZXMuaW5kZXhPZihlbCkpIG5vZGVzLnB1c2goZWwpO1xuXHQgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGVsKSkge1xuXHQgICAgICAgICAgICBmbGF0dGVuKGVsKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcblx0ICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcmdzLCBmdW5jdGlvbiAoYXJnKSB7XG5cdCAgICAgICAgaWYgKGlzTm9kZShhcmcpKSB7XG5cdCAgICAgICAgICBpZiAoIX5ub2Rlcy5pbmRleE9mKGFyZykpIG5vZGVzLnB1c2goYXJnKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZUxpc3QoYXJnKSkge1xuXHQgICAgICAgICAgZmxhdHRlbihhcmcpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aHJvdyBFcnJvcignQ29uY2F0IGFyZ3VtZW50cyBtdXN0IGJlIG9mIGEgTm9kZSwgTm9kZUxpc3QsIEhUTUxDb2xsZWN0aW9uLCBvciBBcnJheSBvZiAoTm9kZSwgTm9kZUxpc3QsIEhUTUxDb2xsZWN0aW9uLCBBcnJheSknKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZGVsZXRlJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKCkge1xuXHQgICAgICB2YXIgbm90UmVtb3ZlZCA9IGZsYXR0ZW4odGhpcykuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbC5yZW1vdmUpIHtcblx0ICAgICAgICAgIGVsLnJlbW92ZSgpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoZWwucGFyZW50Tm9kZSkge1xuXHQgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmIChub3RSZW1vdmVkLmxlbmd0aCkgY29uc29sZS53YXJuKCdOb2RlTGlzdDogU29tZSBub2RlcyBjb3VsZCBub3QgYmUgZGVsZXRlZC4nKTtcblx0ICAgICAgcmV0dXJuIG5vdFJlbW92ZWQ7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZWFjaCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZWFjaCgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcblx0ICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZmlsdGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmaWx0ZXIoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhBcnJheVByb3RvLmZpbHRlci5hcHBseSh0aGlzLCBhcmdzKSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZmluZCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZmluZChlbGVtZW50KSB7XG5cdCAgICAgIHZhciBub2RlcyA9IFtdO1xuXHQgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICBub2Rlcy5wdXNoKG5vZGUucXVlcnlTZWxlY3RvckFsbChlbGVtZW50KSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICBpZiAoaXNOb2RlKGVsZW1lbnQpKSBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICBpZiAobm9kZSAhPT0gZWxlbWVudCAmJiBub2RlLmNvbnRhaW5zKGVsZW1lbnQpKSBub2Rlcy5wdXNoKGVsZW1lbnQpO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKGlzTm9kZUxpc3QoZWxlbWVudCkpIHtcblx0ICAgICAgICB2YXIgZWxzID0gZmxhdHRlbihlbGVtZW50KTtcblx0ICAgICAgICBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICAgIGVscy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgICBpZiAobm9kZSAhPT0gZWwgJiYgbm9kZS5jb250YWlucyhlbCkpIG5vZGVzLnB1c2goZWwpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZsYXR0ZW4obm9kZXMsIHRoaXMub3duZXIpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZvckVhY2gnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2luY2x1ZGVzJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBpbmNsdWRlcyhlbGVtZW50LCBpbmRleCkge1xuXHQgICAgICByZXR1cm4gfnRoaXMuaW5kZXhPZihlbGVtZW50LCBpbmRleCk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnbWFwJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW41ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW41KSwgX2tleTUgPSAwOyBfa2V5NSA8IF9sZW41OyBfa2V5NSsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5NV0gPSBhcmd1bWVudHNbX2tleTVdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgbWFwcGVkID0gQXJyYXlQcm90by5tYXAuYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiBtYXBwZWQuc29tZShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gaXNOb2RlKGVsKSB8fCBpc05vZGVMaXN0KGVsKTtcblx0ICAgICAgfSkgPyBmbGF0dGVuKG1hcHBlZCwgdGhpcykgOiBtYXBwZWQ7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncGFyZW50Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKHRoaXMubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbC5wYXJlbnROb2RlO1xuXHQgICAgICB9KSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncG9wJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwb3AoYW1vdW50KSB7XG5cdCAgICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGFtb3VudCA9IDE7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIG5vZGVzID0gW107XG5cdCAgICAgIHZhciBwb3AgPSBBcnJheVByb3RvLnBvcC5iaW5kKHRoaXMpO1xuXHQgICAgICB3aGlsZSAoYW1vdW50LS0pIHtcblx0ICAgICAgICBub2Rlcy5wdXNoKHBvcCgpKTtcblx0ICAgICAgfXJldHVybiBOb2RlTGlzdEpTKG5vZGVzLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdwdXNoJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjYpLCBfa2V5NiA9IDA7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk2XSA9IGFyZ3VtZW50c1tfa2V5Nl07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyZ3MsIGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmcpKSB0aHJvdyBub2RlRXJyb3I7XG5cdCAgICAgICAgaWYgKCF+X3RoaXMuaW5kZXhPZihhcmcpKSBBcnJheVByb3RvLnB1c2guY2FsbChfdGhpcywgYXJnKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3NoaWZ0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzaGlmdChhbW91bnQpIHtcblx0ICAgICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XG5cdCAgICAgICAgYW1vdW50ID0gMTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgbm9kZXMgPSBbXTtcblx0ICAgICAgd2hpbGUgKGFtb3VudC0tKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChBcnJheVByb3RvLnNoaWZ0LmNhbGwodGhpcykpO1xuXHQgICAgICB9cmV0dXJuIG5vZGVzLmxlbmd0aCA9PSAxID8gbm9kZXNbMF0gOiBOb2RlTGlzdEpTKG5vZGVzLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzbGljZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2xpY2UoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW43ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW43KSwgX2tleTcgPSAwOyBfa2V5NyA8IF9sZW43OyBfa2V5NysrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5N10gPSBhcmd1bWVudHNbX2tleTddO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhBcnJheVByb3RvLnNsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzcGxpY2UnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNwbGljZSgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjggPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjgpLCBfa2V5OCA9IDA7IF9rZXk4IDwgX2xlbjg7IF9rZXk4KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk4XSA9IGFyZ3VtZW50c1tfa2V5OF07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIGkgPSAyLCBsID0gYXJncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmdzW2ldKSkgdGhyb3cgbm9kZUVycm9yO1xuXHQgICAgICB9XG5cdCAgICAgIEFycmF5UHJvdG8uc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICd1bnNoaWZ0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIHZhciB1bnNoaWZ0ID0gQXJyYXlQcm90by51bnNoaWZ0LmJpbmQodGhpcyk7XG5cdFxuXHQgICAgICBmb3IgKHZhciBfbGVuOSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuOSksIF9rZXk5ID0gMDsgX2tleTkgPCBfbGVuOTsgX2tleTkrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTldID0gYXJndW1lbnRzW19rZXk5XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJncywgZnVuY3Rpb24gKGFyZykge1xuXHQgICAgICAgIGlmICghaXNOb2RlKGFyZykpIHRocm93IG5vZGVFcnJvcjtcblx0ICAgICAgICBpZiAoIX5fdGhpczIuaW5kZXhPZihhcmcpKSB1bnNoaWZ0KGFyZyk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdhZGRDbGFzcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQ2xhc3MoY2xhc3Nlcykge1xuXHQgICAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCB0cnVlKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdyZW1vdmVDbGFzcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoY2xhc3Nlcykge1xuXHQgICAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCBmYWxzZSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAndG9nZ2xlQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuXHRcblx0ICAgICAgdmFyIG1ldGhvZCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyAndG9nZ2xlJyA6IHZhbHVlID8gJ2FkZCcgOiAncmVtb3ZlJztcblx0ICAgICAgaWYgKHR5cGVvZiBjbGFzc2VzID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgcmV0dXJuIGNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuXHQgICAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdFttZXRob2RdKGMpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdnZXQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGdldChwcm9wKSB7XG5cdCAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgZWwgPSBlbFtwcm9wXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXJyLnB1c2goZWwpO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIGZsYXR0ZW4oYXJyLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzZXQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNldChwcm9wLCB2YWx1ZSkge1xuXHQgICAgICBpZiAocHJvcC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGVsKSB7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wKSB7XG5cdCAgICAgICAgICAgICAgaWYgKGtleSBpbiBlbCkge1xuXHQgICAgICAgICAgICAgICAgZWxba2V5XSA9IHByb3Bba2V5XTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgICBpZiAocHJvcCBpbiBlbCkge1xuXHQgICAgICAgICAgICBlbFtwcm9wXSA9IHZhbHVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2NhbGwnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbGwoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4xMCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMTApLCBfa2V5MTAgPSAwOyBfa2V5MTAgPCBfbGVuMTA7IF9rZXkxMCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5MTBdID0gYXJndW1lbnRzW19rZXkxMF07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvLnNoaWZ0LmNhbGwoYXJncyk7XG5cdCAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgdmFyIHJldHVyblRoaXMgPSB0cnVlO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgaWYgKGVsICYmIGVsW21ldGhvZF0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgZWwgPSBlbFttZXRob2RdLmFwcGx5KGVsLCBhcmdzKTtcblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICAgIGlmIChyZXR1cm5UaGlzICYmIGVsICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuVGhpcyA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBhcnIucHVzaCh1bmRlZmluZWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiByZXR1cm5UaGlzID8gdGhpcyA6IGZsYXR0ZW4oYXJyLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdpdGVtJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBpdGVtKGluZGV4KSB7XG5cdCAgICAgIHJldHVybiBOb2RlTGlzdEpTKFt0aGlzW2luZGV4XV0sIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uJyxcblx0XG5cdFxuXHQgICAgLy8gZXZlbnQgaGFuZGxlcnNcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuXHQgICAgICBpZiAodHlwZW9mIGV2ZW50cyA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBldmVudHMgPSBldmVudHMudHJpbSgpLnJlcGxhY2UoL1xccysvLCAnICcpLnNwbGl0KCcgJyk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cdCAgICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgY2FsbGJhY2sgPSBzZWxlY3Rvcjtcblx0ICAgICAgICBzZWxlY3RvciA9IG51bGw7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuIHRoaXM7XG5cdCAgICAgIHZhciBmbiA9IGNhbGxiYWNrO1xuXHQgICAgICBjYWxsYmFjayA9IHNlbGVjdG9yID8gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICB2YXIgZWxzID0gTm9kZUxpc3RKUyhzZWxlY3RvciwgdGhpcyk7XG5cdCAgICAgICAgaWYgKCFlbHMubGVuZ3RoKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVscy5zb21lKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgdmFyIHRhcmdldCA9IGVsLmNvbnRhaW5zKGUudGFyZ2V0KTtcblx0ICAgICAgICAgIGlmICh0YXJnZXQpIGZuLmNhbGwoZWwsIGUsIGVsKTtcblx0ICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gOiBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgIGZuLmFwcGx5KHRoaXMsIFtlLCB0aGlzXSk7XG5cdCAgICAgIH07XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgIGlmIChlbCA9PT0gd2luZG93IHx8IGlzTm9kZShlbCkpIHtcblx0ICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgY2FsbGJhY2ssIGZhbHNlKTtcblx0ICAgICAgICAgICAgRXZlbnRzLnB1c2goe1xuXHQgICAgICAgICAgICAgIGVsOiBlbCxcblx0ICAgICAgICAgICAgICBldmVudDogZXZlbnQsXG5cdCAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb2ZmJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYoZXZlbnRzLCBjYWxsYmFjaykge1xuXHQgICAgICBpZiAoZXZlbnRzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICBjYWxsYmFjayA9IGV2ZW50cztcblx0ICAgICAgICBldmVudHMgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGV2ZW50cyA9IGV2ZW50cyBpbnN0YW5jZW9mIEFycmF5ID8gZXZlbnRzIDogdHlwZW9mIGV2ZW50cyA9PT0gJ3N0cmluZycgPyBldmVudHMudHJpbSgpLnJlcGxhY2UoL1xccysvLCAnICcpLnNwbGl0KCcgJykgOiBudWxsO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgRXZlbnRzID0gRXZlbnRzLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgaWYgKGUgJiYgZS5lbCA9PT0gZWwgJiYgKCFjYWxsYmFjayB8fCBjYWxsYmFjayA9PT0gZS5jYWxsYmFjaykgJiYgKCFldmVudHMgfHwgfmV2ZW50cy5pbmRleE9mKGUuZXZlbnQpKSkge1xuXHQgICAgICAgICAgICBlLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS5ldmVudCwgZS5jYWxsYmFjayk7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25CbHVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkJsdXIoY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cdCAgICAgIGlmICghY2FsbGJhY2spIHJldHVybiB0aGlzO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgYmx1ckxpc3QucHVzaCh7IGVsOiBlbCwgY2FsbGJhY2s6IGNhbGxiYWNrIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKCFibHVyRXZlbnQpIHtcblx0ICAgICAgICBibHVyRXZlbnQgPSBmdW5jdGlvbiBibHVyRXZlbnQoZSkge1xuXHQgICAgICAgICAgYmx1ckxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gaXRlbS5lbC5jb250YWlucyhlLnRhcmdldCkgfHwgaXRlbS5lbCA9PT0gZS50YXJnZXQ7XG5cdCAgICAgICAgICAgIGlmICghdGFyZ2V0KSBpdGVtLmNhbGxiYWNrLmNhbGwoaXRlbS5lbCwgZSwgaXRlbS5lbCk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYmx1ckV2ZW50LCBmYWxzZSk7XG5cdCAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJsdXJFdmVudCwgZmFsc2UpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29mZkJsdXInLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9mZkJsdXIoY2FsbGJhY2spIHtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGJsdXJMaXN0ID0gYmx1ckxpc3QuZmlsdGVyKGZ1bmN0aW9uIChibHVyKSB7XG5cdCAgICAgICAgICBpZiAoYmx1ciAmJiBibHVyLmVsID09PSBlbCAmJiAoIWNhbGxiYWNrIHx8IGJsdXIuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICByZXR1cm4gZWw7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdhc0FycmF5Jyxcblx0ICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgICByZXR1cm4gQXJyYXlQcm90by5zbGljZS5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHQgIH1dKTtcblx0ICByZXR1cm4gTm9kZUxpc3Q7XG5cdH0oKTtcblx0XG5cdHZhciBOTCA9IE5vZGVMaXN0LnByb3RvdHlwZTtcblx0XG5cdGZ1bmN0aW9uIGZsYXR0ZW4oYXJyLCBvd25lcikge1xuXHQgIHZhciBsaXN0ID0gW107XG5cdCAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJyLCBmdW5jdGlvbiAoZWwpIHtcblx0ICAgIGlmIChpc05vZGUoZWwpKSB7XG5cdCAgICAgIGlmICghfmxpc3QuaW5kZXhPZihlbCkpIGxpc3QucHVzaChlbCk7XG5cdCAgICB9IGVsc2UgaWYgKGlzTm9kZUxpc3QoZWwpKSB7XG5cdCAgICAgIGZvciAodmFyIGlkIGluIGVsKSB7XG5cdCAgICAgICAgaWYgKCF+bGlzdC5pbmRleE9mKGVsW2lkXSkpIGxpc3QucHVzaChlbFtpZF0pO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2UgaWYgKGVsICE9PSBudWxsKSB7XG5cdCAgICAgIGFyci5nZXQgPSBOTC5nZXQ7XG5cdCAgICAgIGFyci5zZXQgPSBOTC5zZXQ7XG5cdCAgICAgIGFyci5jYWxsID0gTkwuY2FsbDtcblx0ICAgICAgYXJyLm93bmVyID0gb3duZXI7XG5cdCAgICAgIHJldHVybiBhcnI7XG5cdCAgICB9XG5cdCAgfSk7XG5cdCAgcmV0dXJuIE5vZGVMaXN0SlMobGlzdCwgb3duZXIpO1xuXHR9XG5cdFxuXHR2YXIgZXhjZXB0aW9ucyA9IFsnam9pbicsICdjb3B5V2l0aGluJywgJ2ZpbGwnLCAnZmluZCcsICdmb3JFYWNoJ107XG5cdCgwLCBfZ2V0T3duUHJvcGVydHlOYW1lczIuZGVmYXVsdCkoQXJyYXlQcm90bykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdCAgaWYgKCF+ZXhjZXB0aW9ucy5pbmRleE9mKGtleSkgJiYgTkxba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICBOTFtrZXldID0gQXJyYXlQcm90b1trZXldO1xuXHQgIH1cblx0fSk7XG5cdGlmICh3aW5kb3cuU3ltYm9sICYmIF9pdGVyYXRvcjIuZGVmYXVsdCkge1xuXHQgIE5MW19pdGVyYXRvcjIuZGVmYXVsdF0gPSBOTC52YWx1ZXMgPSBBcnJheVByb3RvW19pdGVyYXRvcjIuZGVmYXVsdF07XG5cdH1cblx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRmdW5jdGlvbiBzZXR0ZXJHZXR0ZXIocHJvcCkge1xuXHQgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICBpZiAoTkxbcHJvcF0pIHJldHVybjtcblx0ICBpZiAoZGl2W3Byb3BdIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgIE5MW3Byb3BdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMTEgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjExKSwgX2tleTExID0gMDsgX2tleTExIDwgX2xlbjExOyBfa2V5MTErKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTExXSA9IGFyZ3VtZW50c1tfa2V5MTFdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHZhciByZXR1cm5UaGlzID0gdHJ1ZTtcblx0ICAgICAgZm9yICh2YXIgaSBpbiBOTCkge1xuXHQgICAgICAgIHZhciBlbCA9IE5MW2ldO1xuXHQgICAgICAgIGlmIChlbCAmJiBlbFtwcm9wXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICAgICAgICBlbCA9IGVsW3Byb3BdLmFwcGx5KGVsLCBhcmdzKTtcblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICAgIGlmIChyZXR1cm5UaGlzICYmIGVsICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuVGhpcyA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBhcnIucHVzaCh1bmRlZmluZWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gcmV0dXJuVGhpcyA/IF90aGlzMyA6IGZsYXR0ZW4oYXJyLCBfdGhpczMpO1xuXHQgICAgfTtcblx0ICB9IGVsc2Uge1xuXHQgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoTkwsIHByb3AsIHtcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICAgICAgdmFyIGFyciA9IFtdO1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICBlbCA9IGVsW3Byb3BdO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgYXJyLnB1c2goZWwpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGVsICYmIHByb3AgaW4gZWwpIHtcblx0ICAgICAgICAgICAgZWxbcHJvcF0gPSB2YWx1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgfVxuXHR9XG5cdGZvciAodmFyIHByb3AgaW4gZGl2KSB7XG5cdCAgc2V0dGVyR2V0dGVyKHByb3ApO1xuXHR9ZnVuY3Rpb24gTm9kZUxpc3RKUygpIHtcblx0ICBmb3IgKHZhciBfbGVuMTIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjEyKSwgX2tleTEyID0gMDsgX2tleTEyIDwgX2xlbjEyOyBfa2V5MTIrKykge1xuXHQgICAgYXJnc1tfa2V5MTJdID0gYXJndW1lbnRzW19rZXkxMl07XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gbmV3IE5vZGVMaXN0KGFyZ3MpO1xuXHR9XG5cdHdpbmRvdy5OTCA9IE5vZGVMaXN0SlM7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSBOb2RlTGlzdEpTO1xuXG4vKioqLyB9LFxuLyogMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgJE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNykuT2JqZWN0O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2Mpe1xuXHQgIHJldHVybiAkT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHQvLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuXHQkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSwgJ09iamVjdCcsIHtkZWZpbmVQcm9wZXJ0eTogX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZn0pO1xuXG4vKioqLyB9LFxuLyogNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGdsb2JhbCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIGNvcmUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIGN0eCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oOClcblx0ICAsIGhpZGUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblx0XG5cdHZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcblx0ICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuXHQgICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG5cdCAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcblx0ICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuXHQgICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG5cdCAgICAsIElTX1dSQVAgICA9IHR5cGUgJiAkZXhwb3J0Lldcblx0ICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcblx0ICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdXG5cdCAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV1cblx0ICAgICwga2V5LCBvd24sIG91dDtcblx0ICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcblx0ICBmb3Ioa2V5IGluIHNvdXJjZSl7XG5cdCAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcblx0ICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG5cdCAgICBpZihvd24gJiYga2V5IGluIGV4cG9ydHMpY29udGludWU7XG5cdCAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuXHQgICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcblx0ICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuXHQgICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cblx0ICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG5cdCAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuXHQgICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcblx0ICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24oQyl7XG5cdCAgICAgIHZhciBGID0gZnVuY3Rpb24oYSwgYiwgYyl7XG5cdCAgICAgICAgaWYodGhpcyBpbnN0YW5jZW9mIEMpe1xuXHQgICAgICAgICAgc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe1xuXHQgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQztcblx0ICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEMoYSk7XG5cdCAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuXHQgICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG5cdCAgICAgICAgfSByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICB9O1xuXHQgICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG5cdCAgICAgIHJldHVybiBGO1xuXHQgICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG5cdCAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG5cdCAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSVcblx0ICAgIGlmKElTX1BST1RPKXtcblx0ICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuXHQgICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuXHQgICAgICBpZih0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKWhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cdC8vIHR5cGUgYml0bWFwXG5cdCRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG5cdCRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG5cdCRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG5cdCRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cblx0JGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG5cdCRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuXHQkZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcblx0JGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgIFxuXHRtb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG5cbi8qKiovIH0sXG4vKiA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxuXHR2YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcblx0ICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdGlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbi8qKiovIH0sXG4vKiA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHR2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuXHRpZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuLyoqKi8gfSxcbi8qIDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xuXHR2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcblx0ICBhRnVuY3Rpb24oZm4pO1xuXHQgIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG5cdCAgc3dpdGNoKGxlbmd0aCl7XG5cdCAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcblx0ICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG5cdCAgICB9O1xuXHQgICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG5cdCAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuXHQgICAgfTtcblx0ICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuXHQgICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcblx0ICAgIH07XG5cdCAgfVxuXHQgIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcblx0ICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuXHQgIH07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZFAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCBjcmVhdGVEZXNjID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSkgPyBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuXHQgIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG5cdH0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuXHQgIG9iamVjdFtrZXldID0gdmFsdWU7XG5cdCAgcmV0dXJuIG9iamVjdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDExICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgYW5PYmplY3QgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuXHQgICwgSUU4X0RPTV9ERUZJTkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KVxuXHQgICwgdG9QcmltaXRpdmUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KVxuXHQgICwgZFAgICAgICAgICAgICAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdFxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuXHQgIGFuT2JqZWN0KE8pO1xuXHQgIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcblx0ICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcblx0ICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuXHQgICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuXHQgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblx0ICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcblx0ICBpZigndmFsdWUnIGluIEF0dHJpYnV0ZXMpT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG5cdCAgcmV0dXJuIE87XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gIV9fd2VicGFja19yZXF1aXJlX18oMTUpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KShmdW5jdGlvbigpe1xuXHQgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX3JlcXVpcmVfXygxNykoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDE1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5cdG1vZHVsZS5leHBvcnRzID0gIV9fd2VicGFja19yZXF1aXJlX18oMTYpKGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcblx0fSk7XG5cbi8qKiovIH0sXG4vKiAxNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcblx0ICB0cnkge1xuXHQgICAgcmV0dXJuICEhZXhlYygpO1xuXHQgIH0gY2F0Y2goZSl7XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMylcblx0ICAsIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5kb2N1bWVudFxuXHQgIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuXHQgICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHQvLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuXHQvLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBTKXtcblx0ICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcblx0ICB2YXIgZm4sIHZhbDtcblx0ICBpZihTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG5cdCAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG5cdCAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG5cdCAgcmV0dXJuIHtcblx0ICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcblx0ICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcblx0ICAgIHdyaXRhYmxlICAgIDogIShiaXRtYXAgJiA0KSxcblx0ICAgIHZhbHVlICAgICAgIDogdmFsdWVcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX193ZWJwYWNrX3JlcXVpcmVfXygyMSksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1MSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSkuZignaXRlcmF0b3InKTtcblxuLyoqKi8gfSxcbi8qIDIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciAkYXQgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMykodHJ1ZSk7XG5cdFxuXHQvLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5cdF9fd2VicGFja19yZXF1aXJlX18oMjYpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcblx0ICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG5cdCAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcblx0Ly8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxuXHR9LCBmdW5jdGlvbigpe1xuXHQgIHZhciBPICAgICA9IHRoaXMuX3Rcblx0ICAgICwgaW5kZXggPSB0aGlzLl9pXG5cdCAgICAsIHBvaW50O1xuXHQgIGlmKGluZGV4ID49IE8ubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG5cdCAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuXHQgIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuXHQgIHJldHVybiB7dmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZX07XG5cdH0pO1xuXG4vKioqLyB9LFxuLyogMjMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgZGVmaW5lZCAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cdC8vIHRydWUgIC0+IFN0cmluZyNhdFxuXHQvLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuXHQgIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuXHQgICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcblx0ICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcblx0ICAgICAgLCBsID0gcy5sZW5ndGhcblx0ICAgICAgLCBhLCBiO1xuXHQgICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcblx0ICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG5cdCAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuXHQgICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuXHQgICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIDcuMS40IFRvSW50ZWdlclxuXHR2YXIgY2VpbCAgPSBNYXRoLmNlaWxcblx0ICAsIGZsb29yID0gTWF0aC5mbG9vcjtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYoaXQgPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgTElCUkFSWSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KVxuXHQgICwgJGV4cG9ydCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCByZWRlZmluZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpXG5cdCAgLCBoaWRlICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBJdGVyYXRvcnMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzApXG5cdCAgLCAkaXRlckNyZWF0ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpXG5cdCAgLCBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpXG5cdCAgLCBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oNDkpXG5cdCAgLCBJVEVSQVRPUiAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpKCdpdGVyYXRvcicpXG5cdCAgLCBCVUdHWSAgICAgICAgICA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKSAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG5cdCAgLCBGRl9JVEVSQVRPUiAgICA9ICdAQGl0ZXJhdG9yJ1xuXHQgICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcblx0ICAsIFZBTFVFUyAgICAgICAgID0gJ3ZhbHVlcyc7XG5cdFxuXHR2YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpe1xuXHQgICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblx0ICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG5cdCAgICBpZighQlVHR1kgJiYga2luZCBpbiBwcm90bylyZXR1cm4gcHJvdG9ba2luZF07XG5cdCAgICBzd2l0Y2goa2luZCl7XG5cdCAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICB9O1xuXHQgIHZhciBUQUcgICAgICAgID0gTkFNRSArICcgSXRlcmF0b3InXG5cdCAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuXHQgICAgLCBWQUxVRVNfQlVHID0gZmFsc2Vcblx0ICAgICwgcHJvdG8gICAgICA9IEJhc2UucHJvdG90eXBlXG5cdCAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cblx0ICAgICwgJGRlZmF1bHQgICA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpXG5cdCAgICAsICRlbnRyaWVzICAgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkXG5cdCAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG5cdCAgICAsIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG5cdCAgLy8gRml4IG5hdGl2ZVxuXHQgIGlmKCRhbnlOYXRpdmUpe1xuXHQgICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UpKTtcblx0ICAgIGlmKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKXtcblx0ICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuXHQgICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcblx0ICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG5cdCAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcblx0ICBpZihERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpe1xuXHQgICAgVkFMVUVTX0JVRyA9IHRydWU7XG5cdCAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuXHQgIH1cblx0ICAvLyBEZWZpbmUgaXRlcmF0b3Jcblx0ICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG5cdCAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuXHQgIH1cblx0ICAvLyBQbHVnIGZvciBsaWJyYXJ5XG5cdCAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG5cdCAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcblx0ICBpZihERUZBVUxUKXtcblx0ICAgIG1ldGhvZHMgPSB7XG5cdCAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuXHQgICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG5cdCAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG5cdCAgICB9O1xuXHQgICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG5cdCAgICAgIGlmKCEoa2V5IGluIHByb3RvKSlyZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuXHQgICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcblx0ICB9XG5cdCAgcmV0dXJuIG1ldGhvZHM7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB0cnVlO1xuXG4vKioqLyB9LFxuLyogMjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5cbi8qKiovIH0sXG4vKiAyOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG5cdCAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLyoqKi8gfSxcbi8qIDMxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciBjcmVhdGUgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpXG5cdCAgLCBkZXNjcmlwdG9yICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpXG5cdCAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXHRcblx0Ly8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMCkoSXRlcmF0b3JQcm90b3R5cGUsIF9fd2VicGFja19yZXF1aXJlX18oNDgpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KXtcblx0ICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG5cdCAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG5cdHZhciBhbk9iamVjdCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCBkUHMgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzMpXG5cdCAgLCBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpXG5cdCAgLCBJRV9QUk9UTyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpKCdJRV9QUk9UTycpXG5cdCAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cblx0ICAsIFBST1RPVFlQRSAgID0gJ3Byb3RvdHlwZSc7XG5cdFxuXHQvLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG5cdHZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24oKXtcblx0ICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuXHQgIHZhciBpZnJhbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KSgnaWZyYW1lJylcblx0ICAgICwgaSAgICAgID0gZW51bUJ1Z0tleXMubGVuZ3RoXG5cdCAgICAsIGx0ICAgICA9ICc8J1xuXHQgICAgLCBndCAgICAgPSAnPidcblx0ICAgICwgaWZyYW1lRG9jdW1lbnQ7XG5cdCAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXyg0NikuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblx0ICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG5cdCAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcblx0ICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG5cdCAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcblx0ICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG5cdCAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuXHQgIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG5cdCAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG5cdCAgd2hpbGUoaS0tKWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuXHQgIHJldHVybiBjcmVhdGVEaWN0KCk7XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuXHQgIHZhciByZXN1bHQ7XG5cdCAgaWYoTyAhPT0gbnVsbCl7XG5cdCAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG5cdCAgICByZXN1bHQgPSBuZXcgRW1wdHk7XG5cdCAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcblx0ICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcblx0ICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuXHQgIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG5cdCAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAzMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRQICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSlcblx0ICAsIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIGdldEtleXMgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpe1xuXHQgIGFuT2JqZWN0KE8pO1xuXHQgIHZhciBrZXlzICAgPSBnZXRLZXlzKFByb3BlcnRpZXMpXG5cdCAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG5cdCAgICAsIGkgPSAwXG5cdCAgICAsIFA7XG5cdCAgd2hpbGUobGVuZ3RoID4gaSlkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuXHQgIHJldHVybiBPO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxuXHR2YXIgJGtleXMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KVxuXHQgICwgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKXtcblx0ICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBoYXMgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgdG9JT2JqZWN0ICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIGFycmF5SW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMzkpKGZhbHNlKVxuXHQgICwgSUVfUFJPVE8gICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MikoJ0lFX1BST1RPJyk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgbmFtZXMpe1xuXHQgIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuXHQgICAgLCBpICAgICAgPSAwXG5cdCAgICAsIHJlc3VsdCA9IFtdXG5cdCAgICAsIGtleTtcblx0ICBmb3Ioa2V5IGluIE8paWYoa2V5ICE9IElFX1BST1RPKWhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG5cdCAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuXHQgIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKXtcblx0ICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfVxuXHQgIHJldHVybiByZXN1bHQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG5cdHZhciBJT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNylcblx0ICAsIGRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5cdHZhciBjb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcblx0Ly8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcblx0dmFyIHRvSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b0xlbmd0aCAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQwKVxuXHQgICwgdG9JbmRleCAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuXHQgIHJldHVybiBmdW5jdGlvbigkdGhpcywgZWwsIGZyb21JbmRleCl7XG5cdCAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuXHQgICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuXHQgICAgICAsIGluZGV4ICA9IHRvSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpXG5cdCAgICAgICwgdmFsdWU7XG5cdCAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG5cdCAgICBpZihJU19JTkNMVURFUyAmJiBlbCAhPSBlbCl3aGlsZShsZW5ndGggPiBpbmRleCl7XG5cdCAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcblx0ICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG5cdCAgICAvLyBBcnJheSN0b0luZGV4IGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG5cdCAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcblx0ICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuXHQgICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuXHQgIH07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjE1IFRvTGVuZ3RoXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgbWluICAgICAgID0gTWF0aC5taW47XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpXG5cdCAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuXHQgICwgbWluICAgICAgID0gTWF0aC5taW47XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG5cdCAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuXHQgIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKSgna2V5cycpXG5cdCAgLCB1aWQgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuXHQgIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG5cdCAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHR2YXIgaWQgPSAwXG5cdCAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcblx0bW9kdWxlLmV4cG9ydHMgPSAoXG5cdCAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcblx0KS5zcGxpdCgnLCcpO1xuXG4vKioqLyB9LFxuLyogNDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbi8qKiovIH0sXG4vKiA0NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRlZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpLmZcblx0ICAsIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBUQUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgndG9TdHJpbmdUYWcnKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIHRhZywgc3RhdCl7XG5cdCAgaWYoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSlkZWYoaXQsIFRBRywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZ30pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBzdG9yZSAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MykoJ3drcycpXG5cdCAgLCB1aWQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NClcblx0ICAsIFN5bWJvbCAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLlN5bWJvbFxuXHQgICwgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblx0XG5cdHZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XG5cdCAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG5cdCAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xuXHR9O1xuXHRcblx0JGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcblxuLyoqKi8gfSxcbi8qIDQ5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxuXHR2YXIgaGFzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgdG9PYmplY3QgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKVxuXHQgICwgSUVfUFJPVE8gICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKSgnSUVfUFJPVE8nKVxuXHQgICwgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oTyl7XG5cdCAgTyA9IHRvT2JqZWN0KE8pO1xuXHQgIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuXHQgIGlmKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3Ipe1xuXHQgICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuXHQgIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxuXHR2YXIgZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDUxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDUyKTtcblx0dmFyIGdsb2JhbCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBoaWRlICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMClcblx0ICAsIEl0ZXJhdG9ycyAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgVE9fU1RSSU5HX1RBRyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpKCd0b1N0cmluZ1RhZycpO1xuXHRcblx0Zm9yKHZhciBjb2xsZWN0aW9ucyA9IFsnTm9kZUxpc3QnLCAnRE9NVG9rZW5MaXN0JywgJ01lZGlhTGlzdCcsICdTdHlsZVNoZWV0TGlzdCcsICdDU1NSdWxlTGlzdCddLCBpID0gMDsgaSA8IDU7IGkrKyl7XG5cdCAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuXHQgICAgLCBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdXG5cdCAgICAsIHByb3RvICAgICAgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuXHQgIGlmKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSloaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcblx0ICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDUyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mylcblx0ICAsIHN0ZXAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0KVxuXHQgICwgSXRlcmF0b3JzICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzApXG5cdCAgLCB0b0lPYmplY3QgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7XG5cdFxuXHQvLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG5cdC8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG5cdC8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcblx0Ly8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNikoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcblx0ICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG5cdCAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcblx0ICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuXHQvLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcblx0fSwgZnVuY3Rpb24oKXtcblx0ICB2YXIgTyAgICAgPSB0aGlzLl90XG5cdCAgICAsIGtpbmQgID0gdGhpcy5fa1xuXHQgICAgLCBpbmRleCA9IHRoaXMuX2krKztcblx0ICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG5cdCAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuXHQgICAgcmV0dXJuIHN0ZXAoMSk7XG5cdCAgfVxuXHQgIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuXHQgIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuXHQgIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcblx0fSwgJ3ZhbHVlcycpO1xuXHRcblx0Ly8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuXHRJdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXHRcblx0YWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuXHRhZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcblx0YWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG4vKioqLyB9LFxuLyogNTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfTtcblxuLyoqKi8gfSxcbi8qIDU0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcblx0ICByZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDU1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KTtcblxuLyoqKi8gfSxcbi8qIDU2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oNTcpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiA1NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1OCk7XG5cdHZhciAkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5PYmplY3Q7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1OSkoJ2dldE93blByb3BlcnR5TmFtZXMnLCBmdW5jdGlvbigpe1xuXHQgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwKS5mO1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDU5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCBjb3JlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuXHQgICwgZmFpbHMgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG5cdCAgdmFyIGZuICA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXVxuXHQgICAgLCBleHAgPSB7fTtcblx0ICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuXHQgICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24oKXsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG5cdHZhciB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KVxuXHQgICwgZ09QTiAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MSkuZlxuXHQgICwgdG9TdHJpbmcgID0ge30udG9TdHJpbmc7XG5cdFxuXHR2YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuXHQgID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXHRcblx0dmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHRyeSB7XG5cdCAgICByZXR1cm4gZ09QTihpdCk7XG5cdCAgfSBjYXRjaChlKXtcblx0ICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuXHQgIH1cblx0fTtcblx0XG5cdG1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcblx0ICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiA2MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuXHR2YXIgJGtleXMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzUpXG5cdCAgLCBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSkuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cdFxuXHRleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pe1xuXHQgIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDYyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG5cdCAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcblx0ICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNjMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHRcblx0dmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZpbmVQcm9wZXJ0eSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuXHQgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuXHQgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG5cdCAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcblx0ICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcblx0ICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG5cdCAgICB9XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuXHQgICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcblx0ICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuXHQgICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuXHQgIH07XG5cdH0oKTtcblxuLyoqKi8gfSxcbi8qIDY0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHQvKipcclxuXHQgKiBBcnJheS5maW5kXHJcblx0ICovXG5cdGlmICghQXJyYXkucHJvdG90eXBlLmZpbmQpIHtcblx0ICBBcnJheS5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHtcblx0ICAgICd1c2Ugc3RyaWN0Jztcblx0XG5cdCAgICBpZiAodGhpcyA9PSBudWxsKSB7XG5cdCAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5maW5kIGNhbGxlZCBvbiBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHQgICAgfVxuXHQgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHQgICAgfVxuXHQgICAgdmFyIGxpc3QgPSBPYmplY3QodGhpcyk7XG5cdCAgICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGggPj4+IDA7XG5cdCAgICB2YXIgdGhpc0FyZyA9IGFyZ3VtZW50c1sxXTtcblx0ICAgIHZhciB2YWx1ZTtcblx0XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIHZhbHVlID0gbGlzdFtpXTtcblx0ICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpLCBsaXN0KSkge1xuXHQgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHVuZGVmaW5lZDtcblx0ICB9O1xuXHR9XG5cdFxuXHQvKlxyXG5cdCAqIGNsYXNzTGlzdC5qczogQ3Jvc3MtYnJvd3NlciBmdWxsIGVsZW1lbnQuY2xhc3NMaXN0IGltcGxlbWVudGF0aW9uLlxyXG5cdCAqIDEuMS4yMDE1MDMxMlxyXG5cdCAqXHJcblx0ICogQnkgRWxpIEdyZXksIGh0dHA6Ly9lbGlncmV5LmNvbVxyXG5cdCAqIExpY2Vuc2U6IERlZGljYXRlZCB0byB0aGUgcHVibGljIGRvbWFpbi5cclxuXHQgKiAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZFxyXG5cdCAqL1xuXHQvKmdsb2JhbCBzZWxmLCBkb2N1bWVudCwgRE9NRXhjZXB0aW9uICovXG5cdC8qISBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvY2xhc3NMaXN0LmpzICovXG5cdGlmIChcImRvY3VtZW50XCIgaW4gc2VsZikge1xuXHQgIC8vIEZ1bGwgcG9seWZpbGwgZm9yIGJyb3dzZXJzIHdpdGggbm8gY2xhc3NMaXN0IHN1cHBvcnRcblx0ICAvLyBJbmNsdWRpbmcgSUUgPCBFZGdlIG1pc3NpbmcgU1ZHRWxlbWVudC5jbGFzc0xpc3Rcblx0ICBpZiAoIShcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJfXCIpKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgJiYgIShcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKSkpIHtcblx0XG5cdCAgICAoZnVuY3Rpb24gKHZpZXcpIHtcblx0XG5cdCAgICAgIFwidXNlIHN0cmljdFwiO1xuXHRcblx0ICAgICAgaWYgKCEoJ0VsZW1lbnQnIGluIHZpZXcpKSByZXR1cm47XG5cdFxuXHQgICAgICB2YXIgY2xhc3NMaXN0UHJvcCA9IFwiY2xhc3NMaXN0XCIsXG5cdCAgICAgICAgICBwcm90b1Byb3AgPSBcInByb3RvdHlwZVwiLFxuXHQgICAgICAgICAgZWxlbUN0clByb3RvID0gdmlldy5FbGVtZW50W3Byb3RvUHJvcF0sXG5cdCAgICAgICAgICBvYmpDdHIgPSBPYmplY3QsXG5cdCAgICAgICAgICBzdHJUcmltID0gU3RyaW5nW3Byb3RvUHJvcF0udHJpbSB8fCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgXCJcIik7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBhcnJJbmRleE9mID0gQXJyYXlbcHJvdG9Qcm9wXS5pbmRleE9mIHx8IGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICAgICAgdmFyIGkgPSAwLFxuXHQgICAgICAgICAgICBsZW4gPSB0aGlzLmxlbmd0aDtcblx0ICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICBpZiAoaSBpbiB0aGlzICYmIHRoaXNbaV0gPT09IGl0ZW0pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgfVxuXHQgICAgICAvLyBWZW5kb3JzOiBwbGVhc2UgYWxsb3cgY29udGVudCBjb2RlIHRvIGluc3RhbnRpYXRlIERPTUV4Y2VwdGlvbnNcblx0ICAgICAgLFxuXHQgICAgICAgICAgRE9NRXggPSBmdW5jdGlvbiBET01FeCh0eXBlLCBtZXNzYWdlKSB7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gdHlwZTtcblx0ICAgICAgICB0aGlzLmNvZGUgPSBET01FeGNlcHRpb25bdHlwZV07XG5cdCAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0ICAgICAgfSxcblx0ICAgICAgICAgIGNoZWNrVG9rZW5BbmRHZXRJbmRleCA9IGZ1bmN0aW9uIGNoZWNrVG9rZW5BbmRHZXRJbmRleChjbGFzc0xpc3QsIHRva2VuKSB7XG5cdCAgICAgICAgaWYgKHRva2VuID09PSBcIlwiKSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXCJTWU5UQVhfRVJSXCIsIFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkXCIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoL1xccy8udGVzdCh0b2tlbikpIHtcblx0ICAgICAgICAgIHRocm93IG5ldyBET01FeChcIklOVkFMSURfQ0hBUkFDVEVSX0VSUlwiLCBcIlN0cmluZyBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3RlclwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGFyckluZGV4T2YuY2FsbChjbGFzc0xpc3QsIHRva2VuKTtcblx0ICAgICAgfSxcblx0ICAgICAgICAgIENsYXNzTGlzdCA9IGZ1bmN0aW9uIENsYXNzTGlzdChlbGVtKSB7XG5cdCAgICAgICAgdmFyIHRyaW1tZWRDbGFzc2VzID0gc3RyVHJpbS5jYWxsKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiksXG5cdCAgICAgICAgICAgIGNsYXNzZXMgPSB0cmltbWVkQ2xhc3NlcyA/IHRyaW1tZWRDbGFzc2VzLnNwbGl0KC9cXHMrLykgOiBbXSxcblx0ICAgICAgICAgICAgaSA9IDAsXG5cdCAgICAgICAgICAgIGxlbiA9IGNsYXNzZXMubGVuZ3RoO1xuXHQgICAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgIHRoaXMucHVzaChjbGFzc2VzW2ldKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLnRvU3RyaW5nKCkpO1xuXHQgICAgICAgIH07XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBjbGFzc0xpc3RQcm90byA9IENsYXNzTGlzdFtwcm90b1Byb3BdID0gW10sXG5cdCAgICAgICAgICBjbGFzc0xpc3RHZXR0ZXIgPSBmdW5jdGlvbiBjbGFzc0xpc3RHZXR0ZXIoKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0xpc3QodGhpcyk7XG5cdCAgICAgIH07XG5cdCAgICAgIC8vIE1vc3QgRE9NRXhjZXB0aW9uIGltcGxlbWVudGF0aW9ucyBkb24ndCBhbGxvdyBjYWxsaW5nIERPTUV4Y2VwdGlvbidzIHRvU3RyaW5nKClcblx0ICAgICAgLy8gb24gbm9uLURPTUV4Y2VwdGlvbnMuIEVycm9yJ3MgdG9TdHJpbmcoKSBpcyBzdWZmaWNpZW50IGhlcmUuXG5cdCAgICAgIERPTUV4W3Byb3RvUHJvcF0gPSBFcnJvcltwcm90b1Byb3BdO1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5pdGVtID0gZnVuY3Rpb24gKGkpIHtcblx0ICAgICAgICByZXR1cm4gdGhpc1tpXSB8fCBudWxsO1xuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5jb250YWlucyA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIHRva2VuICs9IFwiXCI7XG5cdCAgICAgICAgcmV0dXJuIGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbikgIT09IC0xO1xuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5hZGQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHRva2VucyA9IGFyZ3VtZW50cyxcblx0ICAgICAgICAgICAgaSA9IDAsXG5cdCAgICAgICAgICAgIGwgPSB0b2tlbnMubGVuZ3RoLFxuXHQgICAgICAgICAgICB0b2tlbixcblx0ICAgICAgICAgICAgdXBkYXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIGRvIHtcblx0ICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcblx0ICAgICAgICAgIGlmIChjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pID09PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IHdoaWxlICgrK2kgPCBsKTtcblx0XG5cdCAgICAgICAgaWYgKHVwZGF0ZWQpIHtcblx0ICAgICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbnMgPSBhcmd1bWVudHMsXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsID0gdG9rZW5zLmxlbmd0aCxcblx0ICAgICAgICAgICAgdG9rZW4sXG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcblx0ICAgICAgICAgICAgaW5kZXg7XG5cdCAgICAgICAgZG8ge1xuXHQgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV0gKyBcIlwiO1xuXHQgICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgd2hpbGUgKGluZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLnNwbGljZShpbmRleCwgMSk7XG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSB3aGlsZSAoKytpIDwgbCk7XG5cdFxuXHQgICAgICAgIGlmICh1cGRhdGVkKSB7XG5cdCAgICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIGNsYXNzTGlzdFByb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uICh0b2tlbiwgZm9yY2UpIHtcblx0ICAgICAgICB0b2tlbiArPSBcIlwiO1xuXHRcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jb250YWlucyh0b2tlbiksXG5cdCAgICAgICAgICAgIG1ldGhvZCA9IHJlc3VsdCA/IGZvcmNlICE9PSB0cnVlICYmIFwicmVtb3ZlXCIgOiBmb3JjZSAhPT0gZmFsc2UgJiYgXCJhZGRcIjtcblx0XG5cdCAgICAgICAgaWYgKG1ldGhvZCkge1xuXHQgICAgICAgICAgdGhpc1ttZXRob2RdKHRva2VuKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIGlmIChmb3JjZSA9PT0gdHJ1ZSB8fCBmb3JjZSA9PT0gZmFsc2UpIHtcblx0ICAgICAgICAgIHJldHVybiBmb3JjZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5qb2luKFwiIFwiKTtcblx0ICAgICAgfTtcblx0XG5cdCAgICAgIGlmIChvYmpDdHIuZGVmaW5lUHJvcGVydHkpIHtcblx0ICAgICAgICB2YXIgY2xhc3NMaXN0UHJvcERlc2MgPSB7XG5cdCAgICAgICAgICBnZXQ6IGNsYXNzTGlzdEdldHRlcixcblx0ICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBvYmpDdHIuZGVmaW5lUHJvcGVydHkoZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyk7XG5cdCAgICAgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgICAgIC8vIElFIDggZG9lc24ndCBzdXBwb3J0IGVudW1lcmFibGU6dHJ1ZVxuXHQgICAgICAgICAgaWYgKGV4Lm51bWJlciA9PT0gLTB4N0ZGNUVDNTQpIHtcblx0ICAgICAgICAgICAgY2xhc3NMaXN0UHJvcERlc2MuZW51bWVyYWJsZSA9IGZhbHNlO1xuXHQgICAgICAgICAgICBvYmpDdHIuZGVmaW5lUHJvcGVydHkoZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2UgaWYgKG9iakN0cltwcm90b1Byb3BdLl9fZGVmaW5lR2V0dGVyX18pIHtcblx0ICAgICAgICBlbGVtQ3RyUHJvdG8uX19kZWZpbmVHZXR0ZXJfXyhjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RHZXR0ZXIpO1xuXHQgICAgICB9XG5cdCAgICB9KShzZWxmKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgLy8gVGhlcmUgaXMgZnVsbCBvciBwYXJ0aWFsIG5hdGl2ZSBjbGFzc0xpc3Qgc3VwcG9ydCwgc28ganVzdCBjaGVjayBpZiB3ZSBuZWVkXG5cdCAgICAvLyB0byBub3JtYWxpemUgdGhlIGFkZC9yZW1vdmUgYW5kIHRvZ2dsZSBBUElzLlxuXHRcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgIFwidXNlIHN0cmljdFwiO1xuXHRcblx0ICAgICAgdmFyIHRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIl9cIik7XG5cdFxuXHQgICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYzFcIiwgXCJjMlwiKTtcblx0XG5cdCAgICAgIC8vIFBvbHlmaWxsIGZvciBJRSAxMC8xMSBhbmQgRmlyZWZveCA8MjYsIHdoZXJlIGNsYXNzTGlzdC5hZGQgYW5kXG5cdCAgICAgIC8vIGNsYXNzTGlzdC5yZW1vdmUgZXhpc3QgYnV0IHN1cHBvcnQgb25seSBvbmUgYXJndW1lbnQgYXQgYSB0aW1lLlxuXHQgICAgICBpZiAoIXRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImMyXCIpKSB7XG5cdCAgICAgICAgdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZChtZXRob2QpIHtcblx0ICAgICAgICAgIHZhciBvcmlnaW5hbCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGVbbWV0aG9kXTtcblx0XG5cdCAgICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgdmFyIGksXG5cdCAgICAgICAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcblx0ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgdG9rZW4gPSBhcmd1bWVudHNbaV07XG5cdCAgICAgICAgICAgICAgb3JpZ2luYWwuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBjcmVhdGVNZXRob2QoJ2FkZCcpO1xuXHQgICAgICAgIGNyZWF0ZU1ldGhvZCgncmVtb3ZlJyk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHRlc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoXCJjM1wiLCBmYWxzZSk7XG5cdFxuXHQgICAgICAvLyBQb2x5ZmlsbCBmb3IgSUUgMTAgYW5kIEZpcmVmb3ggPDI0LCB3aGVyZSBjbGFzc0xpc3QudG9nZ2xlIGRvZXMgbm90XG5cdCAgICAgIC8vIHN1cHBvcnQgdGhlIHNlY29uZCBhcmd1bWVudC5cblx0ICAgICAgaWYgKHRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImMzXCIpKSB7XG5cdCAgICAgICAgdmFyIF90b2dnbGUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZTtcblx0XG5cdCAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4sIGZvcmNlKSB7XG5cdCAgICAgICAgICBpZiAoMSBpbiBhcmd1bWVudHMgJiYgIXRoaXMuY29udGFpbnModG9rZW4pID09PSAhZm9yY2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZvcmNlO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIF90b2dnbGUuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdGVzdEVsZW1lbnQgPSBudWxsO1xuXHQgICAgfSkoKTtcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0ZXhwb3J0cy5nZXRKU09OID0gZ2V0SlNPTjtcblx0ZXhwb3J0cy5nZXRTY3JvbGxCYXJXaWR0aCA9IGdldFNjcm9sbEJhcldpZHRoO1xuXHRleHBvcnRzLnRyYW5zbGF0aW9ucyA9IHRyYW5zbGF0aW9ucztcblx0ZXhwb3J0cy5kZWxheWVyID0gZGVsYXllcjtcblx0ZXhwb3J0cy5WdWVGaXhlciA9IFZ1ZUZpeGVyO1xuXHQvLyBjb2VyY2UgY29udmVydCBzb20gdHlwZXMgb2YgZGF0YSBpbnRvIGFub3RoZXIgdHlwZVxuXHR2YXIgY29lcmNlID0gZXhwb3J0cy5jb2VyY2UgPSB7XG5cdCAgLy8gQ29udmVydCBhIHN0cmluZyB0byBib29sZWFtLiBPdGhlcndpc2UsIHJldHVybiB0aGUgdmFsdWUgd2l0aG91dCBtb2RpZmljYXRpb24sIHNvIGlmIGlzIG5vdCBib29sZWFuLCBWdWUgdGhyb3cgYSB3YXJuaW5nLlxuXHQgIGJvb2xlYW46IGZ1bmN0aW9uIGJvb2xlYW4odmFsKSB7XG5cdCAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwgPT09ICcnIHx8IHZhbCA9PT0gJ3RydWUnID8gdHJ1ZSA6IHZhbCA9PT0gJ2ZhbHNlJyB8fCB2YWwgPT09ICdudWxsJyB8fCB2YWwgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiB2YWwgOiB2YWw7XG5cdCAgfSxcblx0ICAvLyBBdHRlbXB0IHRvIGNvbnZlcnQgYSBzdHJpbmcgdmFsdWUgdG8gYSBOdW1iZXIuIE90aGVyd2lzZSwgcmV0dXJuIDAuXG5cdCAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsKSB7XG5cdCAgICB2YXIgYWx0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuXHQgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInID8gdmFsIDogdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsIHx8IGlzTmFOKE51bWJlcih2YWwpKSA/IGFsdCA6IE51bWJlcih2YWwpO1xuXHQgIH0sXG5cdCAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IHRvIHN0cmluZyBhbnkgdmFsdWUsIGV4Y2VwdCBmb3IgbnVsbCBvciB1bmRlZmluZWQuXG5cdCAgc3RyaW5nOiBmdW5jdGlvbiBzdHJpbmcodmFsKSB7XG5cdCAgICByZXR1cm4gdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsID8gJycgOiB2YWwgKyAnJztcblx0ICB9LFxuXHQgIC8vIFBhdHRlcm4gYWNjZXB0IFJlZ0V4cCwgZnVuY3Rpb24sIG9yIHN0cmluZyAoY29udmVydGVkIHRvIFJlZ0V4cCkuIE90aGVyd2lzZSByZXR1cm4gbnVsbC5cblx0ICBwYXR0ZXJuOiBmdW5jdGlvbiBwYXR0ZXJuKHZhbCkge1xuXHQgICAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IHZhbCBpbnN0YW5jZW9mIFJlZ0V4cCA/IHZhbCA6IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gbmV3IFJlZ0V4cCh2YWwpIDogbnVsbDtcblx0ICB9XG5cdH07XG5cdFxuXHRmdW5jdGlvbiBnZXRKU09OKHVybCkge1xuXHQgIHZhciByZXF1ZXN0ID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHQgIHZhciBkYXRhID0ge307XG5cdCAgLy8gcCAoLXNpbXVsYXRlZC0gcHJvbWlzZSlcblx0ICB2YXIgcCA9IHtcblx0ICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4oZm4xLCBmbjIpIHtcblx0ICAgICAgcmV0dXJuIHAuZG9uZShmbjEpLmZhaWwoZm4yKTtcblx0ICAgIH0sXG5cdCAgICBjYXRjaDogZnVuY3Rpb24gX2NhdGNoKGZuKSB7XG5cdCAgICAgIHJldHVybiBwLmZhaWwoZm4pO1xuXHQgICAgfSxcblx0ICAgIGFsd2F5czogZnVuY3Rpb24gYWx3YXlzKGZuKSB7XG5cdCAgICAgIHJldHVybiBwLmRvbmUoZm4pLmZhaWwoZm4pO1xuXHQgICAgfVxuXHQgIH07XG5cdCAgWydkb25lJywgJ2ZhaWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICBkYXRhW25hbWVdID0gW107XG5cdCAgICBwW25hbWVdID0gZnVuY3Rpb24gKGZuKSB7XG5cdCAgICAgIGlmIChmbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSBkYXRhW25hbWVdLnB1c2goZm4pO1xuXHQgICAgICByZXR1cm4gcDtcblx0ICAgIH07XG5cdCAgfSk7XG5cdCAgcC5kb25lKEpTT04ucGFyc2UpO1xuXHQgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSA9PT0gNCkge1xuXHQgICAgICB2YXIgcmVzcG9uc2U7XG5cdCAgICAgIHZhciBpO1xuXHQgICAgICB2YXIgdmFsdWU7XG5cdFxuXHQgICAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBlID0geyBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzIH07XG5cdCAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0ICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIHJlc3BvbnNlID0gcmVxdWVzdC5yZXNwb25zZVRleHQ7XG5cdFxuXHQgICAgICAgICAgICBmb3IgKGkgaW4gZGF0YS5kb25lKSB7XG5cdCAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhLmRvbmVbaV0ocmVzcG9uc2UpO1xuXHRcblx0ICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB2YWx1ZTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICBkYXRhLmZhaWwuZm9yRWFjaChmdW5jdGlvbiAoZmFpbCkge1xuXHQgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBkYXRhLmZhaWwuZm9yRWFjaChmdW5jdGlvbiAoZmFpbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbChlKTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSkoKTtcblx0ICAgIH1cblx0ICB9O1xuXHQgIHJlcXVlc3Qub3BlbignR0VUJywgdXJsKTtcblx0ICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG5cdCAgcmVxdWVzdC5zZW5kKCk7XG5cdCAgcmV0dXJuIHA7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGdldFNjcm9sbEJhcldpZHRoKCkge1xuXHQgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IDw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpIHtcblx0ICAgIHJldHVybiAwO1xuXHQgIH1cblx0ICB2YXIgaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cdCAgaW5uZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG5cdCAgaW5uZXIuc3R5bGUuaGVpZ2h0ID0gJzIwMHB4Jztcblx0XG5cdCAgdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdCAgb3V0ZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHQgIG91dGVyLnN0eWxlLnRvcCA9ICcwcHgnO1xuXHQgIG91dGVyLnN0eWxlLmxlZnQgPSAnMHB4Jztcblx0ICBvdXRlci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cdCAgb3V0ZXIuc3R5bGUud2lkdGggPSAnMjAwcHgnO1xuXHQgIG91dGVyLnN0eWxlLmhlaWdodCA9ICcxNTBweCc7XG5cdCAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblx0ICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7XG5cdFxuXHQgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpO1xuXHQgIHZhciB3MSA9IGlubmVyLm9mZnNldFdpZHRoO1xuXHQgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG5cdCAgdmFyIHcyID0gaW5uZXIub2Zmc2V0V2lkdGg7XG5cdCAgaWYgKHcxID09PSB3MikgdzIgPSBvdXRlci5jbGllbnRXaWR0aDtcblx0XG5cdCAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChvdXRlcik7XG5cdFxuXHQgIHJldHVybiB3MSAtIHcyO1xuXHR9XG5cdFxuXHQvLyByZXR1cm4gYWxsIHRoZSB0cmFuc2xhdGlvbnMgb3IgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgKGVuZ2xpc2gpXG5cdGZ1bmN0aW9uIHRyYW5zbGF0aW9ucygpIHtcblx0ICB2YXIgbGFuZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2VuJztcblx0XG5cdCAgdmFyIHRleHQgPSB7XG5cdCAgICBkYXlzT2ZXZWVrOiBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10sXG5cdCAgICBsaW1pdDogJ0xpbWl0IHJlYWNoZWQgKHt7bGltaXR9fSBpdGVtcyBtYXgpLicsXG5cdCAgICBsb2FkaW5nOiAnTG9hZGluZy4uLicsXG5cdCAgICBtaW5MZW5ndGg6ICdNaW4uIExlbmd0aCcsXG5cdCAgICBtb250aHM6IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddLFxuXHQgICAgbm90U2VsZWN0ZWQ6ICdOb3RoaW5nIFNlbGVjdGVkJyxcblx0ICAgIHJlcXVpcmVkOiAnUmVxdWlyZWQnLFxuXHQgICAgc2VhcmNoOiAnU2VhcmNoJyxcblx0ICAgIHNlbGVjdGVkOiAne3tjb3VudH19IHNlbGVjdGVkJ1xuXHQgIH07XG5cdCAgcmV0dXJuIHdpbmRvdy5WdWVTdHJhcExhbmcgPyB3aW5kb3cuVnVlU3RyYXBMYW5nKGxhbmcpIDogdGV4dDtcblx0fVxuXHRcblx0Ly8gZGVsYXllcjogc2V0IGEgZnVuY3Rpb24gdGhhdCBleGVjdXRlIGFmdGVyIGEgZGVsYXlcblx0Ly8gQHBhcmFtcyAoZnVuY3Rpb24sIGRlbGF5X3Byb3Agb3IgdmFsdWUsIGRlZmF1bHRfdmFsdWUpXG5cdGZ1bmN0aW9uIGRlbGF5ZXIoZm4sIHZhclRpbWVyKSB7XG5cdCAgdmFyIGlmTmFOID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxMDA7XG5cdFxuXHQgIGZ1bmN0aW9uIHRvSW50KGVsKSB7XG5cdCAgICByZXR1cm4gKC9eWzAtOV0rJC8udGVzdChlbCkgPyBOdW1iZXIoZWwpIHx8IDEgOiBudWxsXG5cdCAgICApO1xuXHQgIH1cblx0ICB2YXIgdGltZXJJZDtcblx0ICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuXHQgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuXHQgICAgfVxuXHRcblx0ICAgIGlmICh0aW1lcklkKSBjbGVhclRpbWVvdXQodGltZXJJZCk7XG5cdCAgICB0aW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGZuLmFwcGx5KF90aGlzLCBhcmdzKTtcblx0ICAgIH0sIHRvSW50KHZhclRpbWVyKSB8fCB0b0ludCh0aGlzW3ZhclRpbWVyXSkgfHwgaWZOYU4pO1xuXHQgIH07XG5cdH1cblx0XG5cdC8vIEZpeCBhIHZ1ZSBpbnN0YW5jZSBMaWZlY3ljbGUgdG8gdnVlIDEvMiAoanVzdCB0aGUgYmFzaWMgZWxlbWVudHMsIGlzIG5vdCBhIHJlYWwgcGFyc2VyLCBzbyB0aGlzIHdvcmsgb25seSBpZiB5b3VyIGNvZGUgaXMgY29tcGF0aWJsZSB3aXRoIGJvdGgpXG5cdC8vIChXYWl0aW5nIGZvciB0ZXN0aW5nKVxuXHRmdW5jdGlvbiBWdWVGaXhlcih2dWUpIHtcblx0ICB2YXIgdnVlMiA9ICF3aW5kb3cuVnVlIHx8ICF3aW5kb3cuVnVlLnBhcnRpYWw7XG5cdCAgdmFyIG1peGluID0ge1xuXHQgICAgY29tcHV0ZWQ6IHtcblx0ICAgICAgdnVlMjogZnVuY3Rpb24gdnVlMigpIHtcblx0ICAgICAgICByZXR1cm4gIXRoaXMuJGRpc3BhdGNoO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfTtcblx0ICBpZiAoIXZ1ZTIpIHtcblx0ICAgIC8vdHJhbnNsYXRlIHZ1ZTIgYXR0cmlidXRlcyB0byB2dWUxXG5cdCAgICBpZiAodnVlLmJlZm9yZUNyZWF0ZSkge1xuXHQgICAgICBtaXhpbi5jcmVhdGUgPSB2dWUuYmVmb3JlQ3JlYXRlO1xuXHQgICAgICBkZWxldGUgdnVlLmJlZm9yZUNyZWF0ZTtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUuYmVmb3JlTW91bnQpIHtcblx0ICAgICAgdnVlLmJlZm9yZUNvbXBpbGUgPSB2dWUuYmVmb3JlTW91bnQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUuYmVmb3JlTW91bnQ7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLm1vdW50ZWQpIHtcblx0ICAgICAgdnVlLnJlYWR5ID0gdnVlLm1vdW50ZWQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUubW91bnRlZDtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgLy90cmFuc2xhdGUgdnVlMSBhdHRyaWJ1dGVzIHRvIHZ1ZTJcblx0ICAgIGlmICh2dWUuYmVmb3JlQ29tcGlsZSkge1xuXHQgICAgICB2dWUuYmVmb3JlTW91bnQgPSB2dWUuYmVmb3JlQ29tcGlsZTtcblx0ICAgICAgZGVsZXRlIHZ1ZS5iZWZvcmVDb21waWxlO1xuXHQgICAgfVxuXHQgICAgaWYgKHZ1ZS5jb21waWxlZCkge1xuXHQgICAgICBtaXhpbi5jb21waWxlZCA9IHZ1ZS5jb21waWxlZDtcblx0ICAgICAgZGVsZXRlIHZ1ZS5jb21waWxlZDtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUucmVhZHkpIHtcblx0ICAgICAgdnVlLm1vdW50ZWQgPSB2dWUucmVhZHk7XG5cdCAgICAgIGRlbGV0ZSB2dWUucmVhZHk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGlmICghdnVlLm1peGlucykge1xuXHQgICAgdnVlLm1peGlucyA9IFtdO1xuXHQgIH1cblx0ICB2dWUubWl4aW5zLnVuc2hpZnQobWl4aW4pO1xuXHQgIHJldHVybiB2dWU7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24ocHJvY2Vzcykgeyd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvKipcclxuXHQgKiBDbGljayBvdXRzaWRlIGRpcmVjdGl2ZVxyXG5cdCAqL1xuXHR2YXIgYmluZGVkID0gW107XG5cdFxuXHRmdW5jdGlvbiBoYW5kbGVyKGUpIHtcblx0ICBiaW5kZWQuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgIGlmICghZWwubm9kZS5jb250YWlucyhlLnRhcmdldCkpIGVsLmNhbGxiYWNrKGUpO1xuXHQgIH0pO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBhZGRMaXN0ZW5lcihub2RlLCBjYWxsYmFjaykge1xuXHQgIGlmICghYmluZGVkLmxlbmd0aCkgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG5cdCAgYmluZGVkLnB1c2goeyBub2RlOiBub2RlLCBjYWxsYmFjazogY2FsbGJhY2sgfSk7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGNhbGxiYWNrKSB7XG5cdCAgYmluZGVkID0gYmluZGVkLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgIHJldHVybiBlbC5ub2RlICE9PSBub2RlID8gdHJ1ZSA6ICFjYWxsYmFjayA/IGZhbHNlIDogZWwuY2FsbGJhY2sgIT09IGNhbGxiYWNrO1xuXHQgIH0pO1xuXHQgIGlmICghYmluZGVkLmxlbmd0aCkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG5cdH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBiaW5kOiBmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICBpZiAodHlwZW9mIGJpbmRpbmcudmFsdWUgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcblx0ICAgICAgICBWdWUudXRpbC53YXJuKCdDbGlja091dHNpZGUgb25seSB3b3JrIHdpdGggYSBmdW5jdGlvbiwgcmVjZWl2ZWQ6IHYtJyArIGJpbmRpbmcubmFtZSArICc9XCInICsgYmluZGluZy5leHByZXNzaW9uICsgJ1wiJyk7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGFkZExpc3RlbmVyKGVsLCBiaW5kaW5nLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGVsLCBiaW5kaW5nKSB7XG5cdCAgICBpZiAoYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSkge1xuXHQgICAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy5vbGRWYWx1ZSk7XG5cdCAgICAgIGFkZExpc3RlbmVyKGVsLCBiaW5kaW5nLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgfVxuXHR9O1xuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg2NykpKVxuXG4vKioqLyB9LFxuLyogNjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXHR2YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cdFxuXHQvLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcblx0Ly8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG5cdC8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcblx0Ly8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblx0XG5cdHZhciBjYWNoZWRTZXRUaW1lb3V0O1xuXHR2YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXHRcblx0ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xuXHR9XG5cdGZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcblx0fVxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHQgICAgfVxuXHQgICAgdHJ5IHtcblx0ICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcblx0ICAgICAgICB9XG5cdCAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcblx0ICAgIH1cblx0fSAoKSlcblx0ZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcblx0ICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG5cdCAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG5cdCAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH1cblx0ICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG5cdCAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcblx0ICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcblx0ICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuXHQgICAgfVxuXHQgICAgdHJ5IHtcblx0ICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG5cdCAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH0gY2F0Y2goZSl7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcblx0ICAgICAgICB9IGNhdGNoKGUpe1xuXHQgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHRcblx0XG5cdH1cblx0ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuXHQgICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG5cdCAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG5cdCAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuXHQgICAgfVxuXHQgICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXHQgICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG5cdCAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH0gY2F0Y2ggKGUpe1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG5cdCAgICAgICAgfSBjYXRjaCAoZSl7XG5cdCAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuXHQgICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0XG5cdFxuXHRcblx0fVxuXHR2YXIgcXVldWUgPSBbXTtcblx0dmFyIGRyYWluaW5nID0gZmFsc2U7XG5cdHZhciBjdXJyZW50UXVldWU7XG5cdHZhciBxdWV1ZUluZGV4ID0gLTE7XG5cdFxuXHRmdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG5cdCAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBkcmFpbmluZyA9IGZhbHNlO1xuXHQgICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcblx0ICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG5cdCAgICB9XG5cdCAgICBpZiAocXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgZHJhaW5RdWV1ZSgpO1xuXHQgICAgfVxuXHR9XG5cdFxuXHRmdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuXHQgICAgaWYgKGRyYWluaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG5cdCAgICBkcmFpbmluZyA9IHRydWU7XG5cdFxuXHQgICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICAgIHdoaWxlKGxlbikge1xuXHQgICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuXHQgICAgICAgIHF1ZXVlID0gW107XG5cdCAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuXHQgICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICAgIH1cblx0ICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG5cdCAgICBkcmFpbmluZyA9IGZhbHNlO1xuXHQgICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHR9XG5cdFxuXHRwcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuXHQgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuXHQgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcblx0ICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG5cdCAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcblx0ICAgIH1cblx0fTtcblx0XG5cdC8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcblx0ZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG5cdCAgICB0aGlzLmZ1biA9IGZ1bjtcblx0ICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcblx0fVxuXHRJdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcblx0fTtcblx0cHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcblx0cHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcblx0cHJvY2Vzcy5lbnYgPSB7fTtcblx0cHJvY2Vzcy5hcmd2ID0gW107XG5cdHByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xuXHRwcm9jZXNzLnZlcnNpb25zID0ge307XG5cdFxuXHRmdW5jdGlvbiBub29wKCkge31cblx0XG5cdHByb2Nlc3Mub24gPSBub29wO1xuXHRwcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcblx0cHJvY2Vzcy5vbmNlID0gbm9vcDtcblx0cHJvY2Vzcy5vZmYgPSBub29wO1xuXHRwcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xuXHRwcm9jZXNzLmVtaXQgPSBub29wO1xuXHRcblx0cHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0XG5cdHByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5cdHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuXHR9O1xuXHRwcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cbi8qKiovIH0sXG4vKiA2OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKHByb2Nlc3MpIHsndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0LyoqXHJcblx0ICogQ2xpY2sgb3V0c2lkZSBkaXJlY3RpdmVcclxuXHQgKi9cblx0dmFyIEhBTkRMRVIgPSAnX3Z1ZV9zY3JvbGxfaGFuZGxlcic7XG5cdHZhciBldmVudHMgPSBbJ3Jlc2l6ZScsICdzY3JvbGwnXTtcblx0XG5cdGZ1bmN0aW9uIGJpbmQoZWwsIGJpbmRpbmcpIHtcblx0ICB1bmJpbmQoZWwpO1xuXHRcblx0ICB2YXIgY2FsbGJhY2sgPSBiaW5kaW5nLnZhbHVlO1xuXHQgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG5cdCAgICAgIFZ1ZS51dGlsLndhcm4oJ0NsaWNrT3V0c2lkZSBvbmx5IHdvcmsgd2l0aCBhIGZ1bmN0aW9uIHZhbHVlLCByZWNlaXZlZDogdi0nICsgYmluZGluZy5uYW1lICsgJz1cIicgKyBiaW5kaW5nLmV4cHJlc3Npb24gKyAnXCInKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgZWxbSEFORExFUl0gPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBjYWxsYmFjayhlKTtcblx0ICAgIH07XG5cdCAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuXHQgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihlLCBlbFtIQU5ETEVSXSwgZmFsc2UpO1xuXHQgICAgfSk7XG5cdCAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICBlbFtIQU5ETEVSXSgpO1xuXHQgICAgfSwgMCk7XG5cdCAgfVxuXHR9XG5cdFxuXHRmdW5jdGlvbiB1bmJpbmQoZWwpIHtcblx0ICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICB9KTtcblx0ICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICBkZWxldGUgZWxbSEFORExFUl07XG5cdH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBiaW5kOiBiaW5kLFxuXHQgIHVuYmluZDogdW5iaW5kLFxuXHQgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGVsLCBiaW5kaW5nKSB7XG5cdCAgICBpZiAoYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSkgYmluZChlbCwgYmluZGluZyk7XG5cdCAgfVxuXHR9O1xuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg2NykpKVxuXG4vKioqLyB9LFxuLyogNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzEpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQWNjb3JkaW9uLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1kNGI3NWE5MlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtZDRiNzVhOTJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBY2NvcmRpb24udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB0eXBlOiB7XG5cdCAgICAgIHR5cGU6IFN0cmluZyxcblx0ICAgICAgZGVmYXVsdDogbnVsbFxuXHQgICAgfSxcblx0ICAgIG9uZUF0QXRpbWU6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogZmFsc2Vcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIG9wZW5DaGlsZDogZnVuY3Rpb24gb3BlbkNoaWxkKGNoaWxkKSB7XG5cdCAgICAgIGlmICh0aGlzLm9uZUF0QXRpbWUpIHtcblx0ICAgICAgICB0aGlzLiRjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICAgICAgICBpZiAoY2hpbGQgIT09IGl0ZW0pIHtcblx0ICAgICAgICAgICAgaXRlbS5vcGVuID0gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9pc0FjY29yZGlvbiA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtZDRiNzVhOTJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA3MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Mylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxBZmZpeC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNWViZGRlYmZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTVlYmRkZWJmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWZmaXgudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9TY3JvbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4KTtcblx0XG5cdHZhciBfU2Nyb2xsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Njcm9sbCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIFNjcm9sbDogX1Njcm9sbDIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIG9mZnNldDoge1xuXHQgICAgICB0eXBlOiBOdW1iZXIsXG5cdCAgICAgIGRlZmF1bHQ6IDBcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhZmZpeGVkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdG9wOiBmdW5jdGlvbiB0b3AoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm9mZnNldCA+IDAgPyB0aGlzLm9mZnNldCArICdweCcgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvYWZmaXgvaW5kZXguanN4I0wyMFxuXHQgICAgY2hlY2tTY3JvbGw6IGZ1bmN0aW9uIGNoZWNrU2Nyb2xsKCkge1xuXHQgICAgICAvLyBpZiBpcyBoaWRkZW4gZG9uJ3QgY2FsY3VsYXRlIGFueXRoaW5nXG5cdCAgICAgIGlmICghKHRoaXMuJGVsLm9mZnNldFdpZHRoIHx8IHRoaXMuJGVsLm9mZnNldEhlaWdodCB8fCB0aGlzLiRlbC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgLy8gZ2V0IHdpbmRvdyBzY3JvbGwgYW5kIGVsZW1lbnQgcG9zaXRpb24gdG8gZGV0ZWN0IGlmIGhhdmUgdG8gYmUgbm9ybWFsIG9yIGFmZml4ZWRcblx0ICAgICAgdmFyIHNjcm9sbCA9IHt9O1xuXHQgICAgICB2YXIgZWxlbWVudCA9IHt9O1xuXHQgICAgICB2YXIgcmVjdCA9IHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBfYXJyID0gWydUb3AnLCAnTGVmdCddO1xuXHQgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcblx0ICAgICAgICB2YXIgdHlwZSA9IF9hcnJbX2ldO1xuXHQgICAgICAgIHZhciB0ID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgIHZhciByZXQgPSB3aW5kb3dbJ3BhZ2UnICsgKHR5cGUgPT09ICdUb3AnID8gJ1knIDogJ1gnKSArICdPZmZzZXQnXTtcblx0ICAgICAgICB2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyB0eXBlO1xuXHQgICAgICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgICAgLy8gaWU2LDcsOCBzdGFuZGFyZCBtb2RlXG5cdCAgICAgICAgICByZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbbWV0aG9kXTtcblx0ICAgICAgICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgICAgICAvLyBxdWlya3MgbW9kZVxuXHQgICAgICAgICAgICByZXQgPSBkb2N1bWVudC5ib2R5W21ldGhvZF07XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHNjcm9sbFt0XSA9IHJldDtcblx0ICAgICAgICBlbGVtZW50W3RdID0gc2Nyb2xsW3RdICsgcmVjdFt0XSAtICh0aGlzLiRlbFsnY2xpZW50JyArIHR5cGVdIHx8IGJvZHlbJ2NsaWVudCcgKyB0eXBlXSB8fCAwKTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZml4ID0gc2Nyb2xsLnRvcCA+IGVsZW1lbnQudG9wIC0gdGhpcy5vZmZzZXQ7XG5cdCAgICAgIGlmICh0aGlzLmFmZml4ZWQgIT09IGZpeCkge1xuXHQgICAgICAgIHRoaXMuYWZmaXhlZCA9IGZpeDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhpZGRlbi1wcmludCBoaWRkZW4teHMgaGlkZGVuLXNtXCJcblx0ICB9LCBbX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNjcm9sbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2Nyb2xsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNoZWNrU2Nyb2xsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjaGVja1Njcm9sbFwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLWRvY3Mtc2lkZWJhclwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgYWZmaXg6IF92bS5hZmZpeGVkXG5cdCAgICB9LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIG1hcmdpblRvcDogX3ZtLnRvcFxuXHQgICAgfSlcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNWViZGRlYmZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA3NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg3Nilcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFsZXJ0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1hZjdjMWY2YVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYWY3YzFmNmFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBbGVydC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiA3NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNzcpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWFmN2MxZjZhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9BbGVydC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWFmN2MxZjZhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9BbGVydC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA3NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZmFkZS1lbnRlci1hY3RpdmUsXFxyXFxuLmZhZGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxufVxcbi5mYWRlLWVudGVyLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBoZWlnaHQ6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcbn1cXG4uYWxlcnQudG9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMzBweDtcXHJcXG4gIG1hcmdpbjogMCBhdXRvO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMTA1MDtcXG59XFxuLmFsZXJ0LnRvcC1yaWdodCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICByaWdodDogNTBweDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQWxlcnQudnVlPzcxYTkxYzFhXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFvREE7O0VBRUEsNkJBQUE7Q0FDQTtBQUNBOztFQUVBLFVBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLGVBQUE7RUFDQSxRQUFBO0VBQ0EsU0FBQTtFQUNBLGNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLGNBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQWxlcnQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDx0cmFuc2l0aW9uIG5hbWU9XFxcImZhZGVcXFwiPlxcclxcbiAgICA8ZGl2IHYtc2hvdz1cXFwidmFsXFxcIiA6Y2xhc3M9XFxcIlsnYWxlcnQnLCAnYWxlcnQtJyt0eXBlLCBwbGFjZW1lbnRdXFxcIiA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aH1cXFwiIHJvbGU9XFxcImFsZXJ0XFxcIj5cXHJcXG4gICAgICA8YnV0dG9uIHYtc2hvdz1cXFwiZGlzbWlzc2FibGVcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9IGZhbHNlXFxcIj5cXHJcXG4gICAgICAgIDxzcGFuPiZ0aW1lczs8L3NwYW4+XFxyXFxuICAgICAgPC9idXR0b24+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gIDwvdHJhbnNpdGlvbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuXFxyXFxudmFyIERVUkFUSU9OID0gMFxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc21pc3NhYmxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBkdXJhdGlvbjoge2RlZmF1bHQ6IERVUkFUSU9OfSxcXHJcXG4gICAgcGxhY2VtZW50OiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IFN0cmluZ31cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICB2YWw6IHRoaXMudmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGR1cmF0aW9uTnVtICgpIHsgcmV0dXJuIGNvZXJjZS5udW1iZXIodGhpcy5kdXJhdGlvbiwgRFVSQVRJT04pIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICB2YWwgKHZhbCkge1xcclxcbiAgICAgIGlmICh2YWwgJiYgdGhpcy5kdXJhdGlvbk51bSA+IDApIHsgdGhpcy5fZGVsYXlDbG9zZSgpIH1cXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XFxyXFxuICAgICAgICB0aGlzLnZhbCA9IHZhbFxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9kZWxheUNsb3NlID0gZGVsYXllcihmdW5jdGlvbiAoKSB7XFxyXFxuICAgICAgdGhpcy52YWwgPSBmYWxzZVxcclxcbiAgICB9LCAnZHVyYXRpb25OdW0nKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmZhZGUtZW50ZXItYWN0aXZlLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcyBlYXNlO1xcclxcbn1cXHJcXG4uZmFkZS1lbnRlcixcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgaGVpZ2h0OiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG59XFxyXFxuLmFsZXJ0LnRvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxyXFxufVxcclxcbi5hbGVydC50b3AtcmlnaHQge1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgcmlnaHQ6IDUwcHg7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogNzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXHJcblx0XHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5cdFx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxyXG5cdCovXHJcblx0Ly8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcclxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGxpc3QgPSBbXTtcclxuXHRcclxuXHRcdC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcclxuXHRcdGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcclxuXHRcdFx0dmFyIHJlc3VsdCA9IFtdO1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpdGVtID0gdGhpc1tpXTtcclxuXHRcdFx0XHRpZihpdGVtWzJdKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaChcIkBtZWRpYSBcIiArIGl0ZW1bMl0gKyBcIntcIiArIGl0ZW1bMV0gKyBcIn1cIik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1bMV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0LmpvaW4oXCJcIik7XHJcblx0XHR9O1xyXG5cdFxyXG5cdFx0Ly8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcclxuXHRcdGxpc3QuaSA9IGZ1bmN0aW9uKG1vZHVsZXMsIG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0aWYodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpXHJcblx0XHRcdFx0bW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgXCJcIl1dO1xyXG5cdFx0XHR2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpZCA9IHRoaXNbaV1bMF07XHJcblx0XHRcdFx0aWYodHlwZW9mIGlkID09PSBcIm51bWJlclwiKVxyXG5cdFx0XHRcdFx0YWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvcihpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaXRlbSA9IG1vZHVsZXNbaV07XHJcblx0XHRcdFx0Ly8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxyXG5cdFx0XHRcdC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IDEwMCUgcGVyZmVjdCBmb3Igd2VpcmQgbWVkaWEgcXVlcnkgY29tYmluYXRpb25zXHJcblx0XHRcdFx0Ly8gIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cclxuXHRcdFx0XHQvLyAgSSBob3BlIHRoaXMgd2lsbCBuZXZlciBvY2N1ciAoSGV5IHRoaXMgd2F5IHdlIGhhdmUgc21hbGxlciBidW5kbGVzKVxyXG5cdFx0XHRcdGlmKHR5cGVvZiBpdGVtWzBdICE9PSBcIm51bWJlclwiIHx8ICFhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XHJcblx0XHRcdFx0XHRpZihtZWRpYVF1ZXJ5ICYmICFpdGVtWzJdKSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmKG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0XHRcdFx0aXRlbVsyXSA9IFwiKFwiICsgaXRlbVsyXSArIFwiKSBhbmQgKFwiICsgbWVkaWFRdWVyeSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHRcdHJldHVybiBsaXN0O1xyXG5cdH07XHJcblxuXG4vKioqLyB9LFxuLyogNzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qXG5cdFx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcblx0XHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG5cdCovXG5cdHZhciBzdHlsZXNJbkRvbSA9IHt9LFxuXHRcdG1lbW9pemUgPSBmdW5jdGlvbihmbikge1xuXHRcdFx0dmFyIG1lbW87XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIG1lbW8gPT09IFwidW5kZWZpbmVkXCIpIG1lbW8gPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0XHRyZXR1cm4gbWVtbztcblx0XHRcdH07XG5cdFx0fSxcblx0XHRpc09sZElFID0gbWVtb2l6ZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiAvbXNpZSBbNi05XVxcYi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtcblx0XHR9KSxcblx0XHRnZXRIZWFkRWxlbWVudCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO1xuXHRcdH0pLFxuXHRcdHNpbmdsZXRvbkVsZW1lbnQgPSBudWxsLFxuXHRcdHNpbmdsZXRvbkNvdW50ZXIgPSAwLFxuXHRcdHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wID0gW107XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGxpc3QsIG9wdGlvbnMpIHtcblx0XHRpZihmYWxzZSkge1xuXHRcdFx0aWYodHlwZW9mIGRvY3VtZW50ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIik7XG5cdFx0fVxuXHRcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0XHQvLyBGb3JjZSBzaW5nbGUtdGFnIHNvbHV0aW9uIG9uIElFNi05LCB3aGljaCBoYXMgYSBoYXJkIGxpbWl0IG9uIHRoZSAjIG9mIDxzdHlsZT5cblx0XHQvLyB0YWdzIGl0IHdpbGwgYWxsb3cgb24gYSBwYWdlXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zLnNpbmdsZXRvbiA9PT0gXCJ1bmRlZmluZWRcIikgb3B0aW9ucy5zaW5nbGV0b24gPSBpc09sZElFKCk7XG5cdFxuXHRcdC8vIEJ5IGRlZmF1bHQsIGFkZCA8c3R5bGU+IHRhZ3MgdG8gdGhlIGJvdHRvbSBvZiA8aGVhZD4uXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zLmluc2VydEF0ID09PSBcInVuZGVmaW5lZFwiKSBvcHRpb25zLmluc2VydEF0ID0gXCJib3R0b21cIjtcblx0XG5cdFx0dmFyIHN0eWxlcyA9IGxpc3RUb1N0eWxlcyhsaXN0KTtcblx0XHRhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcblx0XHRcdHZhciBtYXlSZW1vdmUgPSBbXTtcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXHRcdFx0XHRkb21TdHlsZS5yZWZzLS07XG5cdFx0XHRcdG1heVJlbW92ZS5wdXNoKGRvbVN0eWxlKTtcblx0XHRcdH1cblx0XHRcdGlmKG5ld0xpc3QpIHtcblx0XHRcdFx0dmFyIG5ld1N0eWxlcyA9IGxpc3RUb1N0eWxlcyhuZXdMaXN0KTtcblx0XHRcdFx0YWRkU3R5bGVzVG9Eb20obmV3U3R5bGVzLCBvcHRpb25zKTtcblx0XHRcdH1cblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtYXlSZW1vdmUubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIGRvbVN0eWxlID0gbWF5UmVtb3ZlW2ldO1xuXHRcdFx0XHRpZihkb21TdHlsZS5yZWZzID09PSAwKSB7XG5cdFx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKVxuXHRcdFx0XHRcdFx0ZG9tU3R5bGUucGFydHNbal0oKTtcblx0XHRcdFx0XHRkZWxldGUgc3R5bGVzSW5Eb21bZG9tU3R5bGUuaWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRcblx0ZnVuY3Rpb24gYWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKSB7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblx0XHRcdGlmKGRvbVN0eWxlKSB7XG5cdFx0XHRcdGRvbVN0eWxlLnJlZnMrKztcblx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0ZG9tU3R5bGUucGFydHNbal0oaXRlbS5wYXJ0c1tqXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yKDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRkb21TdHlsZS5wYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIHBhcnRzID0gW107XG5cdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0cGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3R5bGVzSW5Eb21baXRlbS5pZF0gPSB7aWQ6IGl0ZW0uaWQsIHJlZnM6IDEsIHBhcnRzOiBwYXJ0c307XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdFxuXHRmdW5jdGlvbiBsaXN0VG9TdHlsZXMobGlzdCkge1xuXHRcdHZhciBzdHlsZXMgPSBbXTtcblx0XHR2YXIgbmV3U3R5bGVzID0ge307XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gbGlzdFtpXTtcblx0XHRcdHZhciBpZCA9IGl0ZW1bMF07XG5cdFx0XHR2YXIgY3NzID0gaXRlbVsxXTtcblx0XHRcdHZhciBtZWRpYSA9IGl0ZW1bMl07XG5cdFx0XHR2YXIgc291cmNlTWFwID0gaXRlbVszXTtcblx0XHRcdHZhciBwYXJ0ID0ge2NzczogY3NzLCBtZWRpYTogbWVkaWEsIHNvdXJjZU1hcDogc291cmNlTWFwfTtcblx0XHRcdGlmKCFuZXdTdHlsZXNbaWRdKVxuXHRcdFx0XHRzdHlsZXMucHVzaChuZXdTdHlsZXNbaWRdID0ge2lkOiBpZCwgcGFydHM6IFtwYXJ0XX0pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRuZXdTdHlsZXNbaWRdLnBhcnRzLnB1c2gocGFydCk7XG5cdFx0fVxuXHRcdHJldHVybiBzdHlsZXM7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBzdHlsZUVsZW1lbnQpIHtcblx0XHR2YXIgaGVhZCA9IGdldEhlYWRFbGVtZW50KCk7XG5cdFx0dmFyIGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wID0gc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3Bbc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AubGVuZ3RoIC0gMV07XG5cdFx0aWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwidG9wXCIpIHtcblx0XHRcdGlmKCFsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCkge1xuXHRcdFx0XHRoZWFkLmluc2VydEJlZm9yZShzdHlsZUVsZW1lbnQsIGhlYWQuZmlyc3RDaGlsZCk7XG5cdFx0XHR9IGVsc2UgaWYobGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpIHtcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoc3R5bGVFbGVtZW50LCBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5wdXNoKHN0eWxlRWxlbWVudCk7XG5cdFx0fSBlbHNlIGlmIChvcHRpb25zLmluc2VydEF0ID09PSBcImJvdHRvbVwiKSB7XG5cdFx0XHRoZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciAnaW5zZXJ0QXQnLiBNdXN0IGJlICd0b3AnIG9yICdib3R0b20nLlwiKTtcblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcblx0XHRzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdHZhciBpZHggPSBzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5pbmRleE9mKHN0eWxlRWxlbWVudCk7XG5cdFx0aWYoaWR4ID49IDApIHtcblx0XHRcdHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wLnNwbGljZShpZHgsIDEpO1xuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcblx0XHR2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdHN0eWxlRWxlbWVudC50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuXHRcdGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBzdHlsZUVsZW1lbnQpO1xuXHRcdHJldHVybiBzdHlsZUVsZW1lbnQ7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFkZFN0eWxlKG9iaiwgb3B0aW9ucykge1xuXHRcdHZhciBzdHlsZUVsZW1lbnQsIHVwZGF0ZSwgcmVtb3ZlO1xuXHRcblx0XHRpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcblx0XHRcdHZhciBzdHlsZUluZGV4ID0gc2luZ2xldG9uQ291bnRlcisrO1xuXHRcdFx0c3R5bGVFbGVtZW50ID0gc2luZ2xldG9uRWxlbWVudCB8fCAoc2luZ2xldG9uRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKSk7XG5cdFx0XHR1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCBmYWxzZSk7XG5cdFx0XHRyZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3R5bGVFbGVtZW50ID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuXHRcdFx0dXBkYXRlID0gYXBwbHlUb1RhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCk7XG5cdFx0XHRyZW1vdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XG5cdFx0dXBkYXRlKG9iaik7XG5cdFxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGVTdHlsZShuZXdPYmopIHtcblx0XHRcdGlmKG5ld09iaikge1xuXHRcdFx0XHRpZihuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXApXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR1cGRhdGUob2JqID0gbmV3T2JqKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0XG5cdHZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHRleHRTdG9yZSA9IFtdO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gKGluZGV4LCByZXBsYWNlbWVudCkge1xuXHRcdFx0dGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xuXHRcdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG5cdFx0fTtcblx0fSkoKTtcblx0XG5cdGZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcoc3R5bGVFbGVtZW50LCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcblx0XHR2YXIgY3NzID0gcmVtb3ZlID8gXCJcIiA6IG9iai5jc3M7XG5cdFxuXHRcdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcyk7XG5cdFx0XHR2YXIgY2hpbGROb2RlcyA9IHN0eWxlRWxlbWVudC5jaGlsZE5vZGVzO1xuXHRcdFx0aWYgKGNoaWxkTm9kZXNbaW5kZXhdKSBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdFx0aWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHN0eWxlRWxlbWVudC5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGNzc05vZGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gYXBwbHlUb1RhZyhzdHlsZUVsZW1lbnQsIG9iaikge1xuXHRcdHZhciBjc3MgPSBvYmouY3NzO1xuXHRcdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcblx0XHR2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblx0XG5cdFx0aWYgKG1lZGlhKSB7XG5cdFx0XHRzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEpO1xuXHRcdH1cblx0XG5cdFx0aWYgKHNvdXJjZU1hcCkge1xuXHRcdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kZXZ0b29scy9kb2NzL2phdmFzY3JpcHQtZGVidWdnaW5nXG5cdFx0XHQvLyB0aGlzIG1ha2VzIHNvdXJjZSBtYXBzIGluc2lkZSBzdHlsZSB0YWdzIHdvcmsgcHJvcGVybHkgaW4gQ2hyb21lXG5cdFx0XHRjc3MgKz0gJ1xcbi8qIyBzb3VyY2VVUkw9JyArIHNvdXJjZU1hcC5zb3VyY2VzWzBdICsgJyAqLyc7XG5cdFx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNjYwMzg3NVxuXHRcdFx0Y3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIiArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSkgKyBcIiAqL1wiO1xuXHRcdH1cblx0XG5cdFx0aWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG5cdFx0XHRzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aGlsZShzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuXHRcdFx0XHRzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuXHRcdFx0fVxuXHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuXHRcdH1cblx0fVxuXG5cbi8qKiovIH0sXG4vKiA4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgRFVSQVRJT04gPSAwOyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBkaXNtaXNzYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZHVyYXRpb246IHsgZGVmYXVsdDogRFVSQVRJT04gfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB2YWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICB3aWR0aDogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHZhbDogdGhpcy52YWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgZHVyYXRpb25OdW06IGZ1bmN0aW9uIGR1cmF0aW9uTnVtKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5udW1iZXIodGhpcy5kdXJhdGlvbiwgRFVSQVRJT04pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwpIHtcblx0ICAgICAgaWYgKF92YWwgJiYgdGhpcy5kdXJhdGlvbk51bSA+IDApIHtcblx0ICAgICAgICB0aGlzLl9kZWxheUNsb3NlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9kZWxheUNsb3NlID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMudmFsID0gZmFsc2U7XG5cdCAgICB9LCAnZHVyYXRpb25OdW0nKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IFwiZmFkZVwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLnZhbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwidmFsXCJcblx0ICAgIH1dLFxuXHQgICAgY2xhc3M6IFsnYWxlcnQnLCAnYWxlcnQtJyArIF92bS50eXBlLCBfdm0ucGxhY2VtZW50XSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImFsZXJ0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzbWlzc2FibGUpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc21pc3NhYmxlXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gZmFsc2Vcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1hZjdjMWY2YVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDgyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDgzKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODYpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQXNpZGUudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTNhNGJkZTI3XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zYTRiZGUyN1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEFzaWRlLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NCk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtM2E0YmRlMjchLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0FzaWRlLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtM2E0YmRlMjchLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0FzaWRlLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5hc2lkZS1vcGVuIHtcXHJcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzO1xcbn1cXG4uYXNpZGUtb3Blbi5oYXMtcHVzaC1yaWdodCB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTMwMHB4KTtcXG59XFxuLmFzaWRlIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDk7XFxyXFxuICBvdmVyZmxvdzogYXV0bztcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxufVxcbi5hc2lkZS5sZWZ0IHtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogYXV0bztcXG59XFxuLmFzaWRlLnJpZ2h0IHtcXHJcXG4gIGxlZnQ6IGF1dG87XFxyXFxuICByaWdodDogMDtcXG59XFxuLnNsaWRlbGVmdC1lbnRlciB7XFxyXFxuICB0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7XFxufVxcbi5zbGlkZWxlZnQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZWxlZnQtaW4gLjNzO1xcbn1cXG4uc2xpZGVsZWZ0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LW91dCAuM3M7XFxufVxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcbi5zbGlkZXJpZ2h0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVyaWdodC1pbiAuM3M7XFxufVxcbi5zbGlkZXJpZ2h0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVyaWdodC1vdXQgLjNzO1xcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlcmlnaHQtaW4ge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LW91dCB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXG4uYXNpZGU6Zm9jdXMge1xcclxcbiAgICBvdXRsaW5lOiAwO1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcXG4uYXNpZGUge1xcclxcbiAgICBtaW4td2lkdGg6IDI0MHB4O1xcbn1cXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciB7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDE2LjQzcHg7XFxyXFxuICBwYWRkaW5nOiA2cHggMTVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICMzMzdhYjc7XFxyXFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciAuY2xvc2Uge1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAtOHB4O1xcclxcbiAgcGFkZGluZzogNHB4IDhweDtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbiAgZm9udC1zaXplOiAyNXB4O1xcclxcbiAgb3BhY2l0eTogLjg7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1ib2R5IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIge1xcclxcbiAgcGFkZGluZzogMTVweDtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tYmxvY2srLmJ0bi1ibG9jayB7XFxyXFxuICBtYXJnaW4tbGVmdDogMDtcXG59XFxuLmFzaWRlLWJhY2tkcm9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYm90dG9tOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxufVxcbi5hc2lkZS1iYWNrZHJvcC5pbiB7XFxyXFxuICBvcGFjaXR5OiAuNTtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT01MCk7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQXNpZGUudnVlPzU3Mzk2MjFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrRkE7RUFDQSwyQkFBQTtDQUNBO0FBQ0E7RUFDQSw4QkFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLE9BQUE7RUFDQSxVQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7RUFDQSxRQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsU0FBQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7RUFDQSwyQkFBQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLDZCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLHlCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSw2QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7RUFDQSw2QkFBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLDRCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLHlCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSw0QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtBQUNBO0lBQ0EsaUJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxpQ0FBQTtFQUNBLG9CQUFBO0VBQ0Esa0JBQUE7RUFDQSxvQkFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtFQUNBLFlBQUE7RUFDQSxnQkFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxjQUFBO0NBQ0E7QUFDQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLDhCQUFBO0NBQ0E7QUFDQTtFQUNBLGlCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7Q0FDQTtBQUNBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLFFBQUE7RUFDQSxjQUFBO0VBQ0EsV0FBQTtFQUNBLDZCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLDBCQUFBO0NBQ0FcIixcImZpbGVcIjpcIkFzaWRlLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8dHJhbnNpdGlvbiA6bmFtZT1cXFwiJ3NsaWRlJyArIHBsYWNlbWVudFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlXFxcIiB2LWlmPVxcXCJzaG93XFxcIiA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aCsncHgnfVxcXCIgOmNsYXNzPVxcXCJwbGFjZW1lbnRcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWRpYWxvZ1xcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1jb250ZW50XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXNpZGUtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9J3RyaWdnZXJfY2xvc2UnPjxzcGFuPiZ0aW1lczs8L3NwYW4+PC9idXR0b24+XFxyXFxuICAgICAgICAgICAgPGg0IGNsYXNzPVxcXCJhc2lkZS10aXRsZVxcXCI+PHNsb3QgbmFtZT1cXFwiaGVhZGVyXFxcIj57eyBoZWFkZXIgfX08L3Nsb3Q+PC9oND5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWJvZHlcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gIDwvdHJhbnNpdGlvbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtnZXRTY3JvbGxCYXJXaWR0aH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGhlYWRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHBsYWNlbWVudDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ3JpZ2h0J30sXFxyXFxuICAgIHNob3c6IHt0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZX0sXFxyXFxuICAgIHdpZHRoOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzMjB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgc2hvdyAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KHRoaXMuc2hvdyA/ICdvcGVuJyA6ICdjbG9zZScpXFxyXFxuICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHlcXHJcXG4gICAgICBjb25zdCBzY3JvbGxCYXJXaWR0aCA9IGdldFNjcm9sbEJhcldpZHRoKClcXHJcXG4gICAgICBpZiAodmFsKSB7XFxyXFxuICAgICAgICBpZiAoIXRoaXMuX2JhY2tkcm9wKSB7XFxyXFxuICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCdcXHJcXG4gICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fYmFja2Ryb3ApXFxyXFxuICAgICAgICBib2R5LmNsYXNzTGlzdC5hZGQoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XFxyXFxuICAgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gc2Nyb2xsQmFyV2lkdGggKyAncHgnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XFxyXFxuICAgICAgICB2YXIgeCA9IHRoaXMuX2JhY2tkcm9wLmNsaWVudEhlaWdodFxcclxcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZCgnaW4nKVxcclxcbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkub24oJ2NsaWNrJywgKCkgPT4gdGhpcy50cmlnZ2VyX2Nsb3NlKCkpXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLm9uKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xcclxcbiAgICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vZmYoKVxcclxcbiAgICAgICAgICB0cnkge1xcclxcbiAgICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMCdcXHJcXG4gICAgICAgICAgICBib2R5LnJlbW92ZUNoaWxkKHRoaXMuX2JhY2tkcm9wKVxcclxcbiAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gbnVsbFxcclxcbiAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCdcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHRyaWdnZXIgKCkge1xcclxcbiAgICAgIHJldHVybiB7XFxyXFxuICAgICAgICBjbG9zZTogKCkgPT4gdGhpcy50cmlnZ2VyX2Nsb3NlKCksXFxyXFxuICAgICAgICBvcGVuOiAoKSA9PiB0aGlzLnRyaWdnZXJfb3BlbigpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB0cmlnZ2VyX2Nsb3NlICgpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCAnY2xvc2UnIClcXHJcXG4gICAgfSxcXHJcXG4gICAgdHJpZ2dlcl9vcGVuKCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoICdvcGVuJyApXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgdGhpcy4kZW1pdCgndHJpZ2dlcicsICgpID0+IHRoaXMudHJpZ2dlcilcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5hc2lkZS1vcGVuIHtcXHJcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzO1xcclxcbn1cXHJcXG4uYXNpZGUtb3Blbi5oYXMtcHVzaC1yaWdodCB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTMwMHB4KTtcXHJcXG59XFxyXFxuLmFzaWRlIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDk7XFxyXFxuICBvdmVyZmxvdzogYXV0bztcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxyXFxufVxcclxcbi5hc2lkZS5sZWZ0IHtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogYXV0bztcXHJcXG59XFxyXFxuLmFzaWRlLnJpZ2h0IHtcXHJcXG4gIGxlZnQ6IGF1dG87XFxyXFxuICByaWdodDogMDtcXHJcXG59XFxyXFxuLnNsaWRlbGVmdC1lbnRlciB7XFxyXFxuICB0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxufVxcclxcbi5zbGlkZWxlZnQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZWxlZnQtaW4gLjNzO1xcclxcbn1cXHJcXG4uc2xpZGVsZWZ0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LW91dCAuM3M7XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG4uc2xpZGVyaWdodC1lbnRlci1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtaW4gLjNzO1xcclxcbn1cXHJcXG4uc2xpZGVyaWdodC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtb3V0IC4zcztcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxufVxcclxcbi5hc2lkZTpmb2N1cyB7XFxyXFxuICAgIG91dGxpbmU6IDA7XFxyXFxufVxcclxcbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xcclxcbiAgLmFzaWRlIHtcXHJcXG4gICAgbWluLXdpZHRoOiAyNDBweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciB7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDE2LjQzcHg7XFxyXFxuICBwYWRkaW5nOiA2cHggMTVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICMzMzdhYjc7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciAuY2xvc2Uge1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAtOHB4O1xcclxcbiAgcGFkZGluZzogNHB4IDhweDtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbiAgZm9udC1zaXplOiAyNXB4O1xcclxcbiAgb3BhY2l0eTogLjg7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1ib2R5IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIge1xcclxcbiAgcGFkZGluZzogMTVweDtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tYmxvY2srLmJ0bi1ibG9jayB7XFxyXFxuICBtYXJnaW4tbGVmdDogMDtcXHJcXG59XFxyXFxuLmFzaWRlLWJhY2tkcm9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYm90dG9tOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxyXFxufVxcclxcbi5hc2lkZS1iYWNrZHJvcC5pbiB7XFxyXFxuICBvcGFjaXR5OiAuNTtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT01MCk7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiA4NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdyaWdodCcgfSxcblx0ICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMzIwIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCwgb2xkKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQodGhpcy5zaG93ID8gJ29wZW4nIDogJ2Nsb3NlJyk7XG5cdCAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcblx0ICAgICAgdmFyIHNjcm9sbEJhcldpZHRoID0gKDAsIF91dGlscy5nZXRTY3JvbGxCYXJXaWR0aCkoKTtcblx0ICAgICAgaWYgKHZhbCkge1xuXHQgICAgICAgIGlmICghdGhpcy5fYmFja2Ryb3ApIHtcblx0ICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCc7XG5cdCAgICAgICAgYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9iYWNrZHJvcCk7XG5cdCAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XG5cdCAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4Jztcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxuXHQgICAgICAgIHZhciB4ID0gdGhpcy5fYmFja2Ryb3AuY2xpZW50SGVpZ2h0O1xuXHQgICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ2luJyk7XG5cdCAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fYmFja2Ryb3ApLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpcy50cmlnZ2VyX2Nsb3NlKCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fYmFja2Ryb3ApLm9uKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoX3RoaXMuX2JhY2tkcm9wKS5vZmYoKTtcblx0ICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpO1xuXHQgICAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcwJztcblx0ICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZChfdGhpcy5fYmFja2Ryb3ApO1xuXHQgICAgICAgICAgICBfdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuXHQgICAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICB0cmlnZ2VyOiBmdW5jdGlvbiB0cmlnZ2VyKCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzMi50cmlnZ2VyX2Nsb3NlKCk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBvcGVuOiBmdW5jdGlvbiBvcGVuKCkge1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzMi50cmlnZ2VyX29wZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICB9LFxuXHQgICAgdHJpZ2dlcl9jbG9zZTogZnVuY3Rpb24gdHJpZ2dlcl9jbG9zZSgpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnY2xvc2UnKTtcblx0ICAgIH0sXG5cdCAgICB0cmlnZ2VyX29wZW46IGZ1bmN0aW9uIHRyaWdnZXJfb3BlbigpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnb3BlbicpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgIHRoaXMuJGVtaXQoJ3RyaWdnZXInLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiBfdGhpczMudHJpZ2dlcjtcblx0ICAgIH0pO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogJ3NsaWRlJyArIF92bS5wbGFjZW1lbnRcblx0ICAgIH1cblx0ICB9LCBbKF92bS5zaG93KSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGVcIixcblx0ICAgIGNsYXNzOiBfdm0ucGxhY2VtZW50LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ud2lkdGggKyAncHgnXG5cdCAgICB9KVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWRpYWxvZ1wiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtY29udGVudFwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtaGVhZGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS50cmlnZ2VyX2Nsb3NlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnaDQnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhc2lkZS10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl92KF92bS5fcyhfdm0uaGVhZGVyKSldKV0sIDIpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtYm9keVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXSldKSA6IF92bS5fZSgpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtM2E0YmRlMjdcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA4NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OClcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxCdXR0b25Hcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMTI1ZWIwYzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTEyNWViMGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQnV0dG9uR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBidXR0b25zOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBqdXN0aWZpZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZlcnRpY2FsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBidG5Hcm91cDogZnVuY3Rpb24gYnRuR3JvdXAoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIC8vIHRoaXMgd2lsbCB1cGRhdGUgRVhURVJOQUwgdi1tb2RlbCB3aGVuIG91ciB2YWwgY2hhbmdlc1xuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIF92YWwpO1xuXHQgICAgfSxcblx0XG5cdCAgICAvLyB0aGlzIHdpbGwgdXBkYXRlIG91ciBJTlRFUk5BTCB2YWwsIHdoZW4gc29tZXRoaW5nIGV4dGVybmFsIGNoYW5nZXMgb3VyIHYtbW9kZWxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogODkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgJ2J0bi1ncm91cCc6IF92bS5idXR0b25zLCAnYnRuLWdyb3VwLWp1c3RpZmllZCc6IF92bS5qdXN0aWZpZWQsICdidG4tZ3JvdXAtdmVydGljYWwnOiBfdm0udmVydGljYWxcblx0ICAgIH0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImRhdGEtdG9nZ2xlXCI6IF92bS5idXR0b25zICYmICdidXR0b25zJ1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMTI1ZWIwYzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA5MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg5MSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXENhcm91c2VsLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtMzIyZGVlNDFcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTMyMmRlZTQxXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zMjJkZWU0MVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIENhcm91c2VsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDkxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMzIyZGVlNDEmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0Nhcm91c2VsLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMzIyZGVlNDEmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0Nhcm91c2VsLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDkyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5jYXJvdXNlbC1jb250cm9sW2RhdGEtdi0zMjJkZWU0MV0ge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0Nhcm91c2VsLnZ1ZT8yZjQ0NjM0MlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBNEdBO0VBQ0EsZ0JBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2Fyb3VzZWwudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG48ZGl2IGNsYXNzPVxcXCJjYXJvdXNlbCBzbGlkZVxcXCIgZGF0YS1yaWRlPVxcXCJjYXJvdXNlbFxcXCI+XFxyXFxuICA8IS0tIEluZGljYXRvcnMgLS0+XFxyXFxuICA8b2wgY2xhc3M9XFxcImNhcm91c2VsLWluZGljYXRvcnNcXFwiIHYtc2hvdz1cXFwiaW5kaWNhdG9yc1xcXCI+XFxyXFxuICAgIDxsaSB2LWZvcj1cXFwiKGluZGljYXRvcixpKSBpbiBpbmRpY2F0b3JfbGlzdFxcXCIgQGNsaWNrPVxcXCJpbmRpY2F0b3JDbGljayhpKVxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmkgPT09IGluZGV4fVxcXCI+PHNwYW4+PC9zcGFuPjwvbGk+XFxyXFxuICA8L29sPlxcclxcbiAgPCEtLSBXcmFwcGVyIGZvciBzbGlkZXMgLS0+XFxyXFxuICA8ZGl2IGNsYXNzPVxcXCJjYXJvdXNlbC1pbm5lclxcXCIgcm9sZT1cXFwibGlzdGJveFxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gIDwvZGl2PlxcclxcbiAgPCEtLSBDb250cm9scyAtLT5cXHJcXG4gIDxkaXYgdi1zaG93PVxcXCJjb250cm9sc1xcXCIgY2xhc3M9XFxcImNhcm91c2VsLWNvbnRyb2xzIGhpZGRlbi14c1xcXCI+XFxyXFxuICAgIDxhIGNsYXNzPVxcXCJsZWZ0IGNhcm91c2VsLWNvbnRyb2xcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCIgQGNsaWNrPVxcXCJwcmV2XFxcIj5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnRcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvYT5cXHJcXG4gICAgPGEgY2xhc3M9XFxcInJpZ2h0IGNhcm91c2VsLWNvbnRyb2xcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCIgQGNsaWNrPVxcXCJuZXh0XFxcIj5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0XFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICA8L2E+XFxyXFxuICA8L2Rpdj5cXHJcXG48L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG4vLyBsZXQgY29lcmNlID0ge1xcclxcbi8vICAgaW50ZXJ2YWw6ICdudW1iZXInXFxyXFxuLy8gfVxcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGluZGljYXRvcnM6IHtcXHJcXG4gICAgICB0eXBlOiBCb29sZWFuLFxcclxcbiAgICAgIGRlZmF1bHQ6IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgY29udHJvbHM6IHtcXHJcXG4gICAgICB0eXBlOiBCb29sZWFuLFxcclxcbiAgICAgIGRlZmF1bHQ6IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgaW50ZXJ2YWw6IHtcXHJcXG4gICAgICB0eXBlOiBOdW1iZXIsXFxyXFxuICAgICAgZGVmYXVsdDogNTAwMFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgaW5kaWNhdG9yX2xpc3Q6IFtdLFxcclxcbiAgICAgIGluZGV4OiAwLFxcclxcbiAgICAgIGlzQW5pbWF0aW5nOiBmYWxzZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKG5ld1ZhbCwgb2xkVmFsKSB7XFxyXFxuICAgICAgdGhpcy5zbGlkZShuZXdWYWwgPiBvbGRWYWwgPyAnbGVmdCcgOiAncmlnaHQnLCBuZXdWYWwsIG9sZFZhbClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaW5kaWNhdG9yQ2xpY2sgKGluZGV4KSB7XFxyXFxuICAgICAgaWYgKHRoaXMuaXNBbmltYXRpbmcgfHwgdGhpcy5pbmRleCA9PT0gaW5kZXgpIHJldHVybiBmYWxzZVxcclxcbiAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5pbmRleCA9IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIHNsaWRlIChkaXJlY3Rpb24sIG5leHQsIHByZXYpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuJGVsKSB7IHJldHVybiB9XFxyXFxuICAgICAgY29uc3QgJHNsaWRlciA9ICQoJy5pdGVtJywgdGhpcy4kZWwpXFxyXFxuICAgICAgaWYgKCEkc2xpZGVyLmxlbmd0aCkgeyByZXR1cm4gfVxcclxcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gJHNsaWRlcltuZXh0XSB8fCAkc2xpZGVyWzBdXFxyXFxuICAgICAgJChzZWxlY3RlZCkuYWRkQ2xhc3MoZGlyZWN0aW9uID09PSAnbGVmdCcgPyAnbmV4dCcgOiAncHJldicpXFxyXFxuICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxcclxcbiAgICAgIHZhciB4ID0gc2VsZWN0ZWQuY2xpZW50SGVpZ2h0XFxyXFxuICAgICAgJChbJHNsaWRlcltwcmV2XSwgc2VsZWN0ZWRdKS5hZGRDbGFzcyhkaXJlY3Rpb24pLm9uKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xcclxcbiAgICAgICAgJHNsaWRlci5vZmYoJ3RyYW5zaXRpb25lbmQnKS5jbGFzc05hbWUgPSAnaXRlbSdcXHJcXG4gICAgICAgICQoc2VsZWN0ZWQpLmFkZENsYXNzKCdhY3RpdmUnKVxcclxcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgbmV4dCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ICsgMSA8ICQoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCA/IHRoaXMuaW5kZXggKz0gMSA6IHRoaXMuaW5kZXggPSAwXFxyXFxuICAgIH0sXFxyXFxuICAgIHByZXYgKCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwgfHwgdGhpcy5pc0FuaW1hdGluZykgeyByZXR1cm4gZmFsc2UgfVxcclxcbiAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5pbmRleCA9PT0gMCA/IHRoaXMuaW5kZXggPSAkKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggLSAxIDogdGhpcy5pbmRleCAtPSAxXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZUludGVydmFsICh2YWwpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdmFsID0gdGhpcy5faW50ZXJ2YWxJRCB9XFxyXFxuICAgICAgaWYodGhpcy5faW50ZXJ2YWxJRCkge1xcclxcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbElEKVxcclxcbiAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVydmFsSURcXHJcXG4gICAgICB9XFxyXFxuICAgICAgaWYodmFsICYmIHRoaXMuaW50ZXJ2YWwgPiAwKSB7XFxyXFxuICAgICAgICB0aGlzLl9pbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwodGhpcy5uZXh0LCB0aGlzLmludGVydmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpXFxyXFxuICAgICQodGhpcy4kZWwpLm9uKCdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSkpLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy50b2dnbGVJbnRlcnZhbCh0cnVlKSlcXHJcXG4gIH0sXFxyXFxuICBiZWZvcmVEZXN0cm95ICgpIHtcXHJcXG4gICAgdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSlcXHJcXG4gICAgJCh0aGlzLiRlbCkub2ZmKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5jYXJvdXNlbC1jb250cm9sIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDkzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly8gbGV0IGNvZXJjZSA9IHtcblx0Ly8gICBpbnRlcnZhbDogJ251bWJlcidcblx0Ly8gfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBpbmRpY2F0b3JzOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IHRydWVcblx0ICAgIH0sXG5cdCAgICBjb250cm9sczoge1xuXHQgICAgICB0eXBlOiBCb29sZWFuLFxuXHQgICAgICBkZWZhdWx0OiB0cnVlXG5cdCAgICB9LFxuXHQgICAgaW50ZXJ2YWw6IHtcblx0ICAgICAgdHlwZTogTnVtYmVyLFxuXHQgICAgICBkZWZhdWx0OiA1MDAwXG5cdCAgICB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kaWNhdG9yX2xpc3Q6IFtdLFxuXHQgICAgICBpbmRleDogMCxcblx0ICAgICAgaXNBbmltYXRpbmc6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBpbmRleDogZnVuY3Rpb24gaW5kZXgobmV3VmFsLCBvbGRWYWwpIHtcblx0ICAgICAgdGhpcy5zbGlkZShuZXdWYWwgPiBvbGRWYWwgPyAnbGVmdCcgOiAncmlnaHQnLCBuZXdWYWwsIG9sZFZhbCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBpbmRpY2F0b3JDbGljazogZnVuY3Rpb24gaW5kaWNhdG9yQ2xpY2soaW5kZXgpIHtcblx0ICAgICAgaWYgKHRoaXMuaXNBbmltYXRpbmcgfHwgdGhpcy5pbmRleCA9PT0gaW5kZXgpIHJldHVybiBmYWxzZTtcblx0ICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcblx0ICAgIH0sXG5cdCAgICBzbGlkZTogZnVuY3Rpb24gc2xpZGUoZGlyZWN0aW9uLCBuZXh0LCBwcmV2KSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMuJGVsKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciAkc2xpZGVyID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5pdGVtJywgdGhpcy4kZWwpO1xuXHQgICAgICBpZiAoISRzbGlkZXIubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBzZWxlY3RlZCA9ICRzbGlkZXJbbmV4dF0gfHwgJHNsaWRlclswXTtcblx0ICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoc2VsZWN0ZWQpLmFkZENsYXNzKGRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJ25leHQnIDogJ3ByZXYnKTtcblx0ICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxuXHQgICAgICB2YXIgeCA9IHNlbGVjdGVkLmNsaWVudEhlaWdodDtcblx0ICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoWyRzbGlkZXJbcHJldl0sIHNlbGVjdGVkXSkuYWRkQ2xhc3MoZGlyZWN0aW9uKS5vbigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAkc2xpZGVyLm9mZigndHJhbnNpdGlvbmVuZCcpLmNsYXNzTmFtZSA9ICdpdGVtJztcblx0ICAgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShzZWxlY3RlZCkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXHQgICAgICAgIF90aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG5cdCAgICAgIGlmICghdGhpcy4kZWwgfHwgdGhpcy5pc0FuaW1hdGluZykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5pbmRleCArIDEgPCAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLml0ZW0nLCB0aGlzLiRlbCkubGVuZ3RoID8gdGhpcy5pbmRleCArPSAxIDogdGhpcy5pbmRleCA9IDA7XG5cdCAgICB9LFxuXHQgICAgcHJldjogZnVuY3Rpb24gcHJldigpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLmluZGV4ID09PSAwID8gdGhpcy5pbmRleCA9ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggLSAxIDogdGhpcy5pbmRleCAtPSAxO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZUludGVydmFsOiBmdW5jdGlvbiB0b2dnbGVJbnRlcnZhbCh2YWwpIHtcblx0ICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgdmFsID0gdGhpcy5faW50ZXJ2YWxJRDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5faW50ZXJ2YWxJRCkge1xuXHQgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWxJRCk7XG5cdCAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVydmFsSUQ7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbCAmJiB0aGlzLmludGVydmFsID4gMCkge1xuXHQgICAgICAgIHRoaXMuX2ludGVydmFsSUQgPSBzZXRJbnRlcnZhbCh0aGlzLm5leHQsIHRoaXMuaW50ZXJ2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgdGhpcy50b2dnbGVJbnRlcnZhbCh0cnVlKTtcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuJGVsKS5vbignbW91c2VlbnRlcicsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzMi50b2dnbGVJbnRlcnZhbChmYWxzZSk7XG5cdCAgICB9KS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzMi50b2dnbGVJbnRlcnZhbCh0cnVlKTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIHRoaXMudG9nZ2xlSW50ZXJ2YWwoZmFsc2UpO1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy4kZWwpLm9mZignbW91c2VlbnRlciBtb3VzZWxlYXZlJyk7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogOTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2Fyb3VzZWwgc2xpZGVcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiZGF0YS1yaWRlXCI6IFwiY2Fyb3VzZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ29sJywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmluZGljYXRvcnMpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImluZGljYXRvcnNcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1pbmRpY2F0b3JzXCJcblx0ICB9LCBfdm0uX2woKF92bS5pbmRpY2F0b3JfbGlzdCksIGZ1bmN0aW9uKGluZGljYXRvciwgaSkge1xuXHQgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgYWN0aXZlOiBpID09PSBfdm0uaW5kZXhcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLmluZGljYXRvckNsaWNrKGkpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdzcGFuJyldKVxuXHQgIH0pKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1pbm5lclwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwibGlzdGJveFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY29udHJvbHMpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNvbnRyb2xzXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2Fyb3VzZWwtY29udHJvbHMgaGlkZGVuLXhzXCJcblx0ICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibGVmdCBjYXJvdXNlbC1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnByZXZcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2EnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJyaWdodCBjYXJvdXNlbC1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLm5leHRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0XCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIyZGVlNDFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA5NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg5Nilcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXENoZWNrYm94LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtNjkyMmJmMjRcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTY5MjJiZjI0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi02OTIyYmYyNFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIENoZWNrYm94LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDk2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Nyk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjkyMmJmMjQmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0NoZWNrYm94LnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjkyMmJmMjQmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0NoZWNrYm94LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDk3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbmxhYmVsLmNoZWNrYm94W2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxOHB4O1xcbn1cXG5sYWJlbC5jaGVja2JveCA+IGlucHV0W2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHotaW5kZXg6IC0xO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICBtYXJnaW46IDA7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4ycmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgbGluZS1oZWlnaHQ6MXJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjM1cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxufVxcbmxhYmVsLmNoZWNrYm94Om5vdCguYWN0aXZlKSA+IC5pY29uW2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjNjZhZmU5O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxubGFiZWwuY2hlY2tib3guYWN0aXZlID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCM2FXUjBhRDBpTnlJZ2FHVnBaMmgwUFNJM0lqNDhjR0YwYUNCbWFXeHNQU0lqWm1abUlpQmtQU0p0TlM0M015d3dMalV5YkMwekxqRXlOREl5TERNdU16UXhOakZzTFRFdU16TTRPVFVzTFRFdU5ETXlNVEpzTFRFdU1qUTVOamtzTVM0ek16WTJOV3d5TGpVNE9EWXpMREl1TnpZNE56WnNOQzR6TnpNNUxDMDBMalkzT0RJMmJDMHhMakkwT1RZNUxDMHhMak16TmpZMWJEQXNNR3d3TGpBd01EQXlMREF1TURBd01ERjZJaTgrUEM5emRtYyspO1xcbn1cXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgLmJ0bi1kZWZhdWx0W2RhdGEtdi02OTIyYmYyNF0geyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTtcXG59XFxubGFiZWwuY2hlY2tib3guZGlzYWJsZWRbZGF0YS12LTY5MjJiZjI0XSxcXHJcXG5sYWJlbC5jaGVja2JveC5yZWFkb25seVtkYXRhLXYtNjkyMmJmMjRdLFxcclxcbi5idG4ucmVhZG9ubHlbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NjUpO1xcclxcbiAgYm94LXNoYWRvdzogbm9uZTtcXHJcXG4gIG9wYWNpdHk6IC42NTtcXG59XFxubGFiZWwuYnRuID4gaW5wdXRbdHlwZT1jaGVja2JveF1bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQ2hlY2tib3gudnVlPzU4YTFlNWM0XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF1RkE7RUFDQSxtQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSxVQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFFBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtFQUNBLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSxzQkFBQTtFQUNBLDZCQUFBO0VBQ0EsbUNBQUE7RUFDQSx5QkFBQTtDQUNBO0FBQ0E7RUFDQSx1QkFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7RUFDQSwwQkFBQTtFQUNBLDBFQUFBO0NBQ0E7QUFDQTtFQUNBLDJCQUFBO0VBQ0Esa1pBQUE7Q0FDQTtBQUNBLHNEQUFBLHdCQUFBO0NBQUE7QUFFQTs7O0VBR0EsMEJBQUE7RUFDQSxpQkFBQTtFQUNBLGFBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0NBQ0FcIixcImZpbGVcIjpcIkNoZWNrYm94LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8YSA6aXM9XFxcImlzQnV0dG9uPydhJzonbGFiZWwnXFxcIiBAY2xpY2s9XFxcInRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbaXNCdXR0b24/J2J0biBidG4tJyt0eXBlQ29sb3I6J29wZW4gY2hlY2tib3ggJyt0eXBlQ29sb3Ise2FjdGl2ZTpjaGVja2VkLGRpc2FibGVkOmRpc2FibGVkLHJlYWRvbmx5OnJlYWRvbmx5fV1cXFwiPlxcclxcbiAgICA8aW5wdXQgdi1pZj1cXFwibmFtZVxcXCIgdHlwZT1cXFwiaGlkZGVuXFxcIiA6bmFtZT1cXFwibmFtZVxcXCIgOnZhbHVlPVxcXCJjaGVja2VkP3RydWVWYWx1ZTpmYWxzZVZhbHVlXFxcIiAvPlxcclxcbiAgICA8c3BhbiB2LWlmPVxcXCIhaXNCdXR0b25cXFwiIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbY2hlY2tlZD8nYnRuLScrdHlwZUNvbG9yOicnLHtiZzp0eXBlQ29sb3I9PT0nZGVmYXVsdCd9XVxcXCI+PC9zcGFuPlxcclxcbiAgICA8c3BhbiB2LWlmPVxcXCIhaXNCdXR0b24mJmNoZWNrZWQmJnR5cGVDb2xvcj09PSdkZWZhdWx0J1xcXCIgY2xhc3M9XFxcImljb25cXFwiPjwvc3Bhbj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgPC9hPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBidXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBmYWxzZVZhbHVlOiB7ZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHRydWVWYWx1ZToge2RlZmF1bHQ6IHRydWV9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBmYWxzZX1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjaGVja2VkOiAodGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWUpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBpbkdyb3VwICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuYnRuR3JvdXAgJiYgIXRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCB9LFxcclxcbiAgICBpc0J1dHRvbiAoKSB7IHJldHVybiB0aGlzLmJ1dHRvbiB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucykgfSxcXHJcXG4gICAgaXNGYWxzZSAoKSB7IHJldHVybiB0aGlzLnZhbHVlID09PSB0aGlzLmZhbHNlVmFsdWUgfSxcXHJcXG4gICAgaXNUcnVlICgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT09IHRoaXMudHJ1ZVZhbHVlIH0sXFxyXFxuICAgIHBhcmVudFZhbHVlICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC52YWwgfSxcXHJcXG4gICAgdHlwZUNvbG9yICgpIHsgcmV0dXJuICh0aGlzLnR5cGUgfHwgKHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSkpIHx8ICdkZWZhdWx0JyB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgY2hlY2tlZCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB2YXIgdmFsdWUgPSB2YWwgPyB0aGlzLnRydWVWYWx1ZSA6IHRoaXMuZmFsc2VWYWx1ZVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB2YWwpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XFxyXFxuICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJlbnRWYWx1ZSAodmFsKSB7XFxyXFxuICAgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICAgIHBhcmVudC5fY2hlY2tib3hHcm91cCA9IHRydWVcXHJcXG4gICAgICBpZiAoIShwYXJlbnQudmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7IHBhcmVudC52YWwgPSBbXSB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICAvLyBjYWxsZWQgQCBtb3VudGVkKCksIG9yIHdoZW5ldmVyICRwYXJlbnQudmFsIGNoYW5nZXNcXHJcXG4gICAgLy8gc3luYyBvdXIgc3RhdGUgd2l0aCB0aGUgJHBhcmVudC52YWxcXHJcXG4gICAgdXBkYXRlRnJvbVBhcmVudCgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XFxyXFxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodGhpcy50cnVlVmFsdWUpXFxyXFxuICAgICAgICB0aGlzLmNoZWNrZWQgPSB+aW5kZXhcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIC8vIGNhbGxlZCB3aGVuIG91ciBjaGVja2VkIHN0YXRlIGNoYW5nZXNcXHJcXG4gICAgdXBkYXRlUGFyZW50KCkge1xcclxcbiAgICAgIGlmICh0aGlzLmluR3JvdXApIHtcXHJcXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuJHBhcmVudC52YWwuaW5kZXhPZih0aGlzLnRydWVWYWx1ZSlcXHJcXG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWQgJiYgIX5pbmRleCkgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHRoaXMudHJ1ZVZhbHVlKVxcclxcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWRcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbmxhYmVsLmNoZWNrYm94IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmctbGVmdDogMThweDtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3ggPiBpbnB1dCB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3ggPiAuaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4ycmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgbGluZS1oZWlnaHQ6MXJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjM1cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94Om5vdCguYWN0aXZlKSA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCM2FXUjBhRDBpTnlJZ2FHVnBaMmgwUFNJM0lqNDhjR0YwYUNCbWFXeHNQU0lqWm1abUlpQmtQU0p0TlM0M015d3dMalV5YkMwekxqRXlOREl5TERNdU16UXhOakZzTFRFdU16TTRPVFVzTFRFdU5ETXlNVEpzTFRFdU1qUTVOamtzTVM0ek16WTJOV3d5TGpVNE9EWXpMREl1TnpZNE56WnNOQzR6TnpNNUxDMDBMalkzT0RJMmJDMHhMakkwT1RZNUxDMHhMak16TmpZMWJEQXNNR3d3TGpBd01EQXlMREF1TURBd01ERjZJaTgrUEM5emRtYyspO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgLmJ0bi1kZWZhdWx0IHsgZmlsdGVyOiBicmlnaHRuZXNzKDc1JSk7IH1cXHJcXG5cXHJcXG5sYWJlbC5jaGVja2JveC5kaXNhYmxlZCxcXHJcXG5sYWJlbC5jaGVja2JveC5yZWFkb25seSxcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcclxcbn1cXHJcXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPWNoZWNrYm94XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiA5OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGZhbHNlVmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdHJ1ZVZhbHVlOiB7IGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB2YWx1ZTogeyBkZWZhdWx0OiBmYWxzZSB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2hlY2tlZDogdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluR3JvdXA6IGZ1bmN0aW9uIGluR3JvdXAoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LmJ0bkdyb3VwICYmICF0aGlzLiRwYXJlbnQuX3JhZGlvR3JvdXA7XG5cdCAgICB9LFxuXHQgICAgaXNCdXR0b246IGZ1bmN0aW9uIGlzQnV0dG9uKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICBpc0ZhbHNlOiBmdW5jdGlvbiBpc0ZhbHNlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5mYWxzZVZhbHVlO1xuXHQgICAgfSxcblx0ICAgIGlzVHJ1ZTogZnVuY3Rpb24gaXNUcnVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LnZhbDtcblx0ICAgIH0sXG5cdCAgICB0eXBlQ29sb3I6IGZ1bmN0aW9uIHR5cGVDb2xvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIGNoZWNrZWQ6IGZ1bmN0aW9uIGNoZWNrZWQodmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gdmFsID8gdGhpcy50cnVlVmFsdWUgOiB0aGlzLmZhbHNlVmFsdWU7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcblx0ICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJlbnRWYWx1ZTogZnVuY3Rpb24gcGFyZW50VmFsdWUodmFsKSB7XG5cdCAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgY2hlY2tlZCA9IHZhbCA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcblx0ICAgICAgICB0aGlzLmNoZWNrZWQgPSBjaGVja2VkO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgICBwYXJlbnQuX2NoZWNrYm94R3JvdXAgPSB0cnVlO1xuXHQgICAgICBpZiAoIShwYXJlbnQudmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7XG5cdCAgICAgICAgcGFyZW50LnZhbCA9IFtdO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XG5cdCAgfSxcblx0XG5cdCAgbWV0aG9kczoge1xuXHQgICAgLy8gY2FsbGVkIEAgbW91bnRlZCgpLCBvciB3aGVuZXZlciAkcGFyZW50LnZhbCBjaGFuZ2VzXG5cdCAgICAvLyBzeW5jIG91ciBzdGF0ZSB3aXRoIHRoZSAkcGFyZW50LnZhbFxuXHQgICAgdXBkYXRlRnJvbVBhcmVudDogZnVuY3Rpb24gdXBkYXRlRnJvbVBhcmVudCgpIHtcblx0ICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICAgIHZhciBpbmRleCA9IHRoaXMuJHBhcmVudC52YWwuaW5kZXhPZih0aGlzLnRydWVWYWx1ZSk7XG5cdCAgICAgICAgdGhpcy5jaGVja2VkID0gfmluZGV4O1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHRcblx0ICAgIC8vIGNhbGxlZCB3aGVuIG91ciBjaGVja2VkIHN0YXRlIGNoYW5nZXNcblx0ICAgIHVwZGF0ZVBhcmVudDogZnVuY3Rpb24gdXBkYXRlUGFyZW50KCkge1xuXHQgICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudHJ1ZVZhbHVlKTtcblx0ICAgICAgICBpZiAodGhpcy5jaGVja2VkICYmICF+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwucHVzaCh0aGlzLnRydWVWYWx1ZSk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnNwbGljZShpbmRleCwgMSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcblx0ICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDk5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoX3ZtLmlzQnV0dG9uID8gJ2EnIDogJ2xhYmVsJywge1xuXHQgICAgdGFnOiBcImFcIixcblx0ICAgIGNsYXNzOiBbX3ZtLmlzQnV0dG9uID8gJ2J0biBidG4tJyArIF92bS50eXBlQ29sb3IgOiAnb3BlbiBjaGVja2JveCAnICsgX3ZtLnR5cGVDb2xvciwge1xuXHQgICAgICBhY3RpdmU6IF92bS5jaGVja2VkLFxuXHQgICAgICBkaXNhYmxlZDogX3ZtLmRpc2FibGVkLFxuXHQgICAgICByZWFkb25seTogX3ZtLnJlYWRvbmx5XG5cdCAgICB9XSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnRvZ2dsZVxuXHQgICAgfVxuXHQgIH0sIFsoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5jaGVja2VkID8gX3ZtLnRydWVWYWx1ZSA6IF92bS5mYWxzZVZhbHVlXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKCFfdm0uaXNCdXR0b24pID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbiBkcm9wZG93bi10b2dnbGVcIixcblx0ICAgIGNsYXNzOiBbX3ZtLmNoZWNrZWQgPyAnYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJycsIHtcblx0ICAgICAgYmc6IF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0J1xuXHQgICAgfV1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoIV92bS5pc0J1dHRvbiAmJiBfdm0uY2hlY2tlZCAmJiBfdm0udHlwZUNvbG9yID09PSAnZGVmYXVsdCcpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY5MjJiZjI0XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcRGF0ZXBpY2tlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNDc3YjhlNWRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTQ3N2I4ZTVkXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRGF0ZXBpY2tlci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDc3YjhlNWQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0RhdGVwaWNrZXIudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi00NzdiOGU1ZCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vRGF0ZXBpY2tlci52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmRhdGVwaWNrZXIge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5pbnB1dC5kYXRlcGlja2VyLWlucHV0LndpdGgtcmVzZXQtYnV0dG9uIHtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDI1cHg7XFxufVxcbi5kYXRlcGlja2VyID4gYnV0dG9uLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5kYXRlcGlja2VyID4gYnV0dG9uLmNsb3NlOmZvY3VzIHtcXHJcXG4gIG9wYWNpdHk6IC4yO1xcbn1cXG4uZGF0ZXBpY2tlci1wb3B1cCB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgYmFja2dyb3VuZDogI2ZmZjtcXHJcXG4gIG1hcmdpbi10b3A6IDJweDtcXHJcXG4gIHotaW5kZXg6IDEwMDA7XFxyXFxuICBib3gtc2hhZG93OiAwIDZweCAxMnB4IHJnYmEoMCwwLDAsMC4xNzUpO1xcbn1cXG4uZGF0ZXBpY2tlci1pbm5lciB7XFxyXFxuICB3aWR0aDogMjE4cHg7XFxufVxcbi5kYXRlcGlja2VyLWJvZHkge1xcclxcbiAgcGFkZGluZzogMTBweCAxMHB4O1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHAsXFxyXFxuLmRhdGVwaWNrZXItY3RybCBzcGFuLFxcclxcbi5kYXRlcGlja2VyLWJvZHkgc3BhbiB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICB3aWR0aDogMjhweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyOHB4O1xcclxcbiAgaGVpZ2h0OiAyOHB4O1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHAge1xcclxcbiAgd2lkdGg6IDY1JTtcXG59XFxuLmRhdGVwaWNrZXItY3RybCBzcGFuIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuIHtcXHJcXG4gIHdpZHRoOiA0OHB4O1xcclxcbiAgaGVpZ2h0OiA1MHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDQ1cHg7XFxufVxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7XFxyXFxuICBjdXJzb3I6IG5vdC1hbGxvd2VkIWltcG9ydGFudDtcXG59XFxuLmRlY2FkZVJhbmdlIHNwYW46Zmlyc3QtY2hpbGQsXFxyXFxuLmRlY2FkZVJhbmdlIHNwYW46bGFzdC1jaGlsZCxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUsXFxyXFxuLmRhdGVwaWNrZXItaXRlbS1ncmF5IHtcXHJcXG4gIGNvbG9yOiAjOTk5O1xcbn1cXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmU6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlIHtcXHJcXG4gIGJhY2tncm91bmQ6IHJnYig1MCwgMTE4LCAxNzcpIWltcG9ydGFudDtcXHJcXG4gIGNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Uge1xcclxcbiAgbWFyZ2luLXRvcDogMTBweFxcbn1cXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBzcGFuLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2Ugc3BhbiB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3Bhbjpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHA6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItY3RybCBpOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWhvdmVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3IgOiAjZWVlZWVlO1xcbn1cXG4uZGF0ZXBpY2tlci13ZWVrUmFuZ2Ugc3BhbiB7XFxyXFxuICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuLmRhdGVwaWNrZXItbGFiZWwge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxyXFxuICBwYWRkaW5nOiA3cHggMDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItY3RybCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBoZWlnaHQ6IDMwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzBweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4ubW9udGgtYnRuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDpub25lO1xcclxcbiAgLW1vei11c2VyLXNlbGVjdDpub25lO1xcclxcbiAgLW1zLXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICB1c2VyLXNlbGVjdDpub25lO1xcbn1cXG4uZGF0ZXBpY2tlci1wcmVCdG4ge1xcclxcbiAgbGVmdDogMnB4O1xcbn1cXG4uZGF0ZXBpY2tlci1uZXh0QnRuIHtcXHJcXG4gIHJpZ2h0OiAycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvRGF0ZXBpY2tlci52dWU/NTIwMDZmNmNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQWlWQTtFQUNBLG1CQUFBO0VBQ0Esc0JBQUE7Q0FDQTtBQUNBO0VBQ0Esb0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLGlCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxjQUFBO0VBQ0EseUNBQUE7Q0FDQTtBQUNBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7OztFQUdBLHNCQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBO0VBQ0EsYUFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtDQUNBO0FBQ0E7RUFDQSxrQ0FBQTtFQUNBLDhCQUFBO0NBQ0E7QUFDQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUVBOztFQUVBLHdDQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBOzs7O0VBSUEsZ0JBQUE7Q0FDQTtBQUNBOzs7OztFQUtBLDJCQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLDBCQUFBO0VBQ0EsaUJBQUE7RUFDQSxlQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0VBQ0EseUJBQUE7RUFDQSxzQkFBQTtFQUNBLHFCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0EsVUFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0NBQ0FcIixcImZpbGVcIjpcIkRhdGVwaWNrZXIudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXJcXFwiPlxcclxcbiAgICA8aW5wdXQgY2xhc3M9XFxcImZvcm0tY29udHJvbCBkYXRlcGlja2VyLWlucHV0XFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIlxcclxcbiAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICA6Y2xhc3M9XFxcInsnd2l0aC1yZXNldC1idXR0b24nOiBjbGVhckJ1dHRvbn1cXFwiXFxyXFxuICAgICAgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aH1cXFwiXFxyXFxuICAgICAgQGNsaWNrPVxcXCJpbnB1dENsaWNrXFxcIlxcclxcbiAgICAvPlxcclxcbiAgICA8YnV0dG9uIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWxcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9ICcnXFxcIj5cXHJcXG4gICAgICA8c3Bhbj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICA8L2J1dHRvbj5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1wb3B1cFxcXCIgdi1zaG93PVxcXCJkaXNwbGF5RGF5Vmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dE1vbnRoQ2xpY2soMClcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcIm5leHRCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0TW9udGhDbGljaygxKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxwIEBjbGljaz1cXFwic3dpdGNoTW9udGhWaWV3XFxcIj57e3N0cmluZ2lmeURheUhlYWRlcihjdXJyRGF0ZSl9fTwvcD5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItd2Vla1JhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiB2LWZvcj1cXFwidyBpbiB0ZXh0LmRheXNPZldlZWtcXFwiPnt7d319PC9zcGFuPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1kYXRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIHYtZm9yPVxcXCJkIGluIGRhdGVSYW5nZVxcXCIgOmNsYXNzPVxcXCJkLnNjbGFzc1xcXCIgQGNsaWNrPVxcXCJkYXlTZWxlY3QoZClcXFwiPnt7ZC50ZXh0fX08L3NwYW4+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlNb250aFZpZXdcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItaW5uZXJcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1jdHJsXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcInByZUJ0bkNsYXNzZXNcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIiBAY2xpY2s9XFxcInByZU5leHRZZWFyQ2xpY2soMClcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcIm5leHRCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0WWVhckNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHAgQGNsaWNrPVxcXCJzd2l0Y2hEZWNhZGVWaWV3XFxcIj57e3N0cmluZ2lmeVllYXJIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiKG0sIGluZGV4KSBpbiB0ZXh0Lm1vbnRoc1xcXCI+XFxyXFxuICAgICAgICAgICAgICA8c3BhbiB2LXRleHQ9XFxcIm0uc3Vic3RyKDAsMylcXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6XFxyXFxuICAgICAgICAgICAgICAgICAgKHRleHQubW9udGhzW3BhcnNlKHZhbCkuZ2V0TW9udGgoKV0gPT09IG0pICYmXFxyXFxuICAgICAgICAgICAgICAgICAgY3VyckRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gcGFyc2UodmFsKS5nZXRGdWxsWWVhcigpfVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgQGNsaWNrPVxcXCJtb250aFNlbGVjdChpbmRleClcXFwiXFxyXFxuICAgICAgICAgICAgICA+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlZZWFyVmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHA+e3tzdHJpbmdpZnlEZWNhZGVIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2UgZGVjYWRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiZGVjYWRlIGluIGRlY2FkZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6cGFyc2UodmFsKS5nZXRGdWxsWWVhcigpID09PSBkZWNhZGUudGV4dH1cXFwiXFxyXFxuICAgICAgICAgICAgICAgIHYtdGV4dD1cXFwiZGVjYWRlLnRleHRcXFwiXFxyXFxuICAgICAgICAgICAgICAgIEBjbGljay5zdG9wPVxcXCJ5ZWFyU2VsZWN0KGRlY2FkZS50ZXh0KVxcXCJcXHJcXG4gICAgICAgICAgICAgID48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHt0cmFuc2xhdGlvbnN9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuLy8gaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICB2YWx1ZToge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGZvcm1hdDoge2RlZmF1bHQ6ICdNTS9kZC95eXl5J30sXFxyXFxuICAgIGRpc2FibGVkRGF5c09mV2Vlazoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGNsZWFyQnV0dG9uOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGljb25zRm9udDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2dseXBoaWNvbid9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgY3VyckRhdGU6IG5ldyBEYXRlKCksXFxyXFxuICAgICAgZGF0ZVJhbmdlOiBbXSxcXHJcXG4gICAgICBkZWNhZGVSYW5nZTogW10sXFxyXFxuICAgICAgZGlzcGxheURheVZpZXc6IGZhbHNlLFxcclxcbiAgICAgIGRpc3BsYXlNb250aFZpZXc6IGZhbHNlLFxcclxcbiAgICAgIGRpc3BsYXlZZWFyVmlldzogZmFsc2UsXFxyXFxuICAgICAgdmFsOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjdXJyRGF0ZSAoKSB7XFxyXFxuICAgICAgdGhpcy5nZXREYXRlUmFuZ2UoKVxcclxcbiAgICB9LFxcclxcbiAgICBmb3JtYXQgKCkge1xcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICB9LFxcclxcbiAgICB2YWx1ZSAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsICE9PSB2YWwpIHsgdGhpcy52YWwgPSB2YWwgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgdGV4dCAoKSB7XFxyXFxuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpXFxyXFxuICAgIH0sXFxyXFxuICAgIHByZUJ0bkNsYXNzZXMgKCkge1xcclxcbiAgICAgIHJldHVybiBgZGF0ZXBpY2tlci1wcmVCdG4gJHt0aGlzLmljb25zRm9udH0gJHt0aGlzLmljb25zRm9udH0tY2hldnJvbi1sZWZ0YFxcclxcbiAgICB9LFxcclxcbiAgICBuZXh0QnRuQ2xhc3NlcyAoKSB7XFxyXFxuICAgICAgcmV0dXJuIGBkYXRlcGlja2VyLW5leHRCdG4gJHt0aGlzLmljb25zRm9udH0gJHt0aGlzLmljb25zRm9udH0tY2hldnJvbi1yaWdodGBcXHJcXG4gICAgfSxcXHJcXG4gICAgZGlzYWJsZWREYXlzQXJyYXkgKCkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF5c09mV2Vlay5tYXAoZCA9PiBwYXJzZUludChkLCAxMCkpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGNsb3NlICgpIHtcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICB9LFxcclxcbiAgICBpbnB1dENsaWNrICgpIHtcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbCkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKVxcclxcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlNb250aFZpZXcgfHwgdGhpcy5kaXNwbGF5WWVhclZpZXcpIHtcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gIXRoaXMuZGlzcGxheURheVZpZXdcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHByZU5leHREZWNhZGVDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKClcXHJcXG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKClcXHJcXG5cXHJcXG4gICAgICBpZiAoZmxhZyA9PT0gMCkge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgLSAxMCwgbW9udGhzLCBkYXRlKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEwLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0TW9udGhDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICBjb25zdCBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZShwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCwgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0WWVhckNsaWNrIChmbGFnKSB7XFxyXFxuICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciAtIDEsIG1vbnRocywgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB5ZWFyU2VsZWN0ICh5ZWFyKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZGF5U2VsZWN0IChkYXkpIHtcXHJcXG4gICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBkYXkuZGF0ZVxcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKVxcclxcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzd2l0Y2hNb250aFZpZXcgKCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgc3dpdGNoRGVjYWRlVmlldyAoKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgbW9udGhTZWxlY3QgKGluZGV4KSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksIGluZGV4LCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZ2V0WWVhck1vbnRoICh5ZWFyLCBtb250aCkge1xcclxcbiAgICAgIGlmIChtb250aCA+IDExKSB7XFxyXFxuICAgICAgICB5ZWFyKytcXHJcXG4gICAgICAgIG1vbnRoID0gMFxcclxcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XFxyXFxuICAgICAgICB5ZWFyLS1cXHJcXG4gICAgICAgIG1vbnRoID0gMTFcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIHt5ZWFyOiB5ZWFyLCBtb250aDogbW9udGh9XFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeURlY2FkZUhlYWRlciAoZGF0ZSkge1xcclxcbiAgICAgIGNvbnN0IHllYXJTdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKVxcclxcbiAgICAgIGNvbnN0IGZpcnN0WWVhck9mRGVjYWRlID0geWVhclN0ci5zdWJzdHJpbmcoMCwgeWVhclN0ci5sZW5ndGggLSAxKSArIDBcXHJcXG4gICAgICBjb25zdCBsYXN0WWVhck9mRGVjYWRlID0gcGFyc2VJbnQoZmlyc3RZZWFyT2ZEZWNhZGUsIDEwKSArIDEwXFxyXFxuICAgICAgcmV0dXJuIGZpcnN0WWVhck9mRGVjYWRlICsgJy0nICsgbGFzdFllYXJPZkRlY2FkZVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlEYXlIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldICsgJyAnICsgZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgIH0sXFxyXFxuICAgIHBhcnNlTW9udGggKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldXFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeVllYXJIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeSAoZGF0ZSwgZm9ybWF0ID0gdGhpcy5mb3JtYXQpIHtcXHJcXG4gICAgICBpZiAoIWRhdGUpIGRhdGUgPSB0aGlzLnBhcnNlKClcXHJcXG4gICAgICBpZiAoIWRhdGUpIHJldHVybiAnJ1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDFcXHJcXG4gICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRoTmFtZSA9IHRoaXMucGFyc2VNb250aChkYXRlKVxcclxcbiAgICAgIHJldHVybiBmb3JtYXRcXHJcXG4gICAgICAgIC5yZXBsYWNlKC95eXl5L2csIHllYXIpXFxyXFxuICAgICAgICAucmVwbGFjZSgveXkvZywgeWVhcilcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTU1NL2csIG1vbnRoTmFtZSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTU0vZywgbW9udGhOYW1lLnN1YnN0cmluZygwLCAzKSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NKD8hYSkvZywgbW9udGgpXFxyXFxuICAgICAgICAucmVwbGFjZSgvZGQvZywgKCcwJyArIGRheSkuc2xpY2UoLTIpKVxcclxcbiAgICAgICAgLnJlcGxhY2UoL2QvZywgZGF5KVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZSAoc3RyKSB7XFxyXFxuICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkIHx8IHN0ciA9PT0gbnVsbCkgeyBzdHIgPSB0aGlzLnZhbCB9XFxyXFxuICAgICAgbGV0IGRhdGUgPSBzdHIubGVuZ3RoID09PSAxMCAmJiAodGhpcy5mb3JtYXQgPT09ICdkZC1NTS15eXl5JyB8fCB0aGlzLmZvcm1hdCA9PT0gJ2RkL01NL3l5eXknKSA/XFxyXFxuICAgICAgICBuZXcgRGF0ZShzdHIuc3Vic3RyaW5nKDYsIDEwKSwgc3RyLnN1YnN0cmluZygzLCA1KS0xLCBzdHIuc3Vic3RyaW5nKDAsIDIpKSA6XFxyXFxuICAgICAgICBuZXcgRGF0ZShzdHIpXFxyXFxuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0RnVsbFllYXIoKSkgPyBuZXcgRGF0ZSgpIDogZGF0ZVxcclxcbiAgICB9LFxcclxcbiAgICBnZXREYXlDb3VudCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBjb25zdCBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdXFxyXFxuICAgICAgaWYgKG1vbnRoID09PSAxKSB7XFxyXFxuICAgICAgICBpZiAoKHllYXIgJSA0MDAgPT09IDApIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSkge1xcclxcbiAgICAgICAgICByZXR1cm4gMjlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGRpY3RbbW9udGhdXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldERhdGVSYW5nZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIGNvbnN0IHRpbWUgPSB7XFxyXFxuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXFxyXFxuICAgICAgICBtb250aDogdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLFxcclxcbiAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9ICh5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCkgLSAxXFxyXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XFxyXFxuICAgICAgICB0aGlzLmRlY2FkZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKVxcclxcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcXHJcXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XFxyXFxuICAgICAgICBmaXJzdERheVdlZWsgPSA3XFxyXFxuICAgICAgfVxcclxcbiAgICAgIGNvbnN0IGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpXFxyXFxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcXHJcXG4gICAgICAgIGNvbnN0IHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSlcXHJcXG4gICAgICAgIGNvbnN0IHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aClcXHJcXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF5VGV4dCA9IHByZXZNb250aERheUNvdW50IC0gZmlyc3REYXlXZWVrICsgaSArIDFcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KVxcclxcbiAgICAgICAgICBsZXQgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7dGV4dDogZGF5VGV4dCwgZGF0ZSwgc2NsYXNzIH0pXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRheUNvdW50OyBpKyspIHtcXHJcXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIGkpXFxyXFxuICAgICAgICBsZXQgc2NsYXNzID0gJydcXHJcXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICBpZiAoaSA9PSB0aW1lLmRheSAmJiBkYXRlLmdldEZ1bGxZZWFyKCkgPT0gdGltZS55ZWFyICYmIGRhdGUuZ2V0TW9udGgoKSA9PSB0aW1lLm1vbnRoKXtcXHJcXG4gICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlJ1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7dGV4dDogaSwgZGF0ZSwgc2NsYXNzfSlcXHJcXG4gICAgICB9XFxyXFxuXFxyXFxuICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlLmxlbmd0aCA8IDQyKSB7XFxyXFxuICAgICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcXHJcXG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpXFxyXFxuXFxyXFxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXFxyXFxuICAgICAgICAgIGxldCBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXFxyXFxuICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSdcXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHt0ZXh0OiBpLCBkYXRlLCBzY2xhc3N9KVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcylcXHJcXG4gICAgdGhpcy5jdXJyRGF0ZSA9IHRoaXMucGFyc2UodGhpcy52YWwpIHx8IHRoaXMucGFyc2UobmV3IERhdGUoKSlcXHJcXG4gICAgdGhpcy5fYmx1ciA9IGUgPT4ge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKVxcclxcbiAgICAgICAgdGhpcy5jbG9zZSgpXFxyXFxuICAgIH1cXHJcXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JsdXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxufVxcclxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDEwMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHQvLyBpbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB2YWx1ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGZvcm1hdDogeyBkZWZhdWx0OiAnTU0vZGQveXl5eScgfSxcblx0ICAgIGRpc2FibGVkRGF5c09mV2VlazogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG5cdCAgICAgICAgcmV0dXJuIFtdO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBpY29uc0ZvbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZ2x5cGhpY29uJyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY3VyckRhdGU6IG5ldyBEYXRlKCksXG5cdCAgICAgIGRhdGVSYW5nZTogW10sXG5cdCAgICAgIGRlY2FkZVJhbmdlOiBbXSxcblx0ICAgICAgZGlzcGxheURheVZpZXc6IGZhbHNlLFxuXHQgICAgICBkaXNwbGF5TW9udGhWaWV3OiBmYWxzZSxcblx0ICAgICAgZGlzcGxheVllYXJWaWV3OiBmYWxzZSxcblx0ICAgICAgdmFsOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBjdXJyRGF0ZTogZnVuY3Rpb24gY3VyckRhdGUoKSB7XG5cdCAgICAgIHRoaXMuZ2V0RGF0ZVJhbmdlKCk7XG5cdCAgICB9LFxuXHQgICAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQoKSB7XG5cdCAgICAgIHRoaXMudmFsID0gdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSk7XG5cdCAgICB9LFxuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdGV4dDogZnVuY3Rpb24gdGV4dCgpIHtcblx0ICAgICAgcmV0dXJuICgwLCBfdXRpbHMudHJhbnNsYXRpb25zKSh0aGlzLmxhbmcpO1xuXHQgICAgfSxcblx0ICAgIHByZUJ0bkNsYXNzZXM6IGZ1bmN0aW9uIHByZUJ0bkNsYXNzZXMoKSB7XG5cdCAgICAgIHJldHVybiAnZGF0ZXBpY2tlci1wcmVCdG4gJyArIHRoaXMuaWNvbnNGb250ICsgJyAnICsgdGhpcy5pY29uc0ZvbnQgKyAnLWNoZXZyb24tbGVmdCc7XG5cdCAgICB9LFxuXHQgICAgbmV4dEJ0bkNsYXNzZXM6IGZ1bmN0aW9uIG5leHRCdG5DbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gJ2RhdGVwaWNrZXItbmV4dEJ0biAnICsgdGhpcy5pY29uc0ZvbnQgKyAnICcgKyB0aGlzLmljb25zRm9udCArICctY2hldnJvbi1yaWdodCc7XG5cdCAgICB9LFxuXHQgICAgZGlzYWJsZWREYXlzQXJyYXk6IGZ1bmN0aW9uIGRpc2FibGVkRGF5c0FycmF5KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERheXNPZldlZWsubWFwKGZ1bmN0aW9uIChkKSB7XG5cdCAgICAgICAgcmV0dXJuIHBhcnNlSW50KGQsIDEwKTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIGlucHV0Q2xpY2s6IGZ1bmN0aW9uIGlucHV0Q2xpY2soKSB7XG5cdCAgICAgIHRoaXMuY3VyckRhdGUgPSB0aGlzLnBhcnNlKHRoaXMudmFsKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgICBpZiAodGhpcy5kaXNwbGF5TW9udGhWaWV3IHx8IHRoaXMuZGlzcGxheVllYXJWaWV3KSB7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSAhdGhpcy5kaXNwbGF5RGF5Vmlldztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHREZWNhZGVDbGljazogZnVuY3Rpb24gcHJlTmV4dERlY2FkZUNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMTAsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxMCwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHRNb250aENsaWNrOiBmdW5jdGlvbiBwcmVOZXh0TW9udGhDbGljayhmbGFnKSB7XG5cdCAgICAgIHZhciB5ZWFyID0gdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgICB2YXIgbW9udGggPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSk7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKTtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwcmVOZXh0WWVhckNsaWNrOiBmdW5jdGlvbiBwcmVOZXh0WWVhckNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMSwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB5ZWFyU2VsZWN0OiBmdW5jdGlvbiB5ZWFyU2VsZWN0KHllYXIpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpO1xuXHQgICAgfSxcblx0ICAgIGRheVNlbGVjdDogZnVuY3Rpb24gZGF5U2VsZWN0KGRheSkge1xuXHQgICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gZGF5LmRhdGU7XG5cdCAgICAgICAgdGhpcy52YWwgPSB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKTtcblx0ICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzd2l0Y2hNb250aFZpZXc6IGZ1bmN0aW9uIHN3aXRjaE1vbnRoVmlldygpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHN3aXRjaERlY2FkZVZpZXc6IGZ1bmN0aW9uIHN3aXRjaERlY2FkZVZpZXcoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IHRydWU7XG5cdCAgICB9LFxuXHQgICAgbW9udGhTZWxlY3Q6IGZ1bmN0aW9uIG1vbnRoU2VsZWN0KGluZGV4KSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKSwgaW5kZXgsIHRoaXMuY3VyckRhdGUuZ2V0RGF0ZSgpKTtcblx0ICAgIH0sXG5cdCAgICBnZXRZZWFyTW9udGg6IGZ1bmN0aW9uIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuXHQgICAgICBpZiAobW9udGggPiAxMSkge1xuXHQgICAgICAgIHllYXIrKztcblx0ICAgICAgICBtb250aCA9IDA7XG5cdCAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XG5cdCAgICAgICAgeWVhci0tO1xuXHQgICAgICAgIG1vbnRoID0gMTE7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHsgeWVhcjogeWVhciwgbW9udGg6IG1vbnRoIH07XG5cdCAgICB9LFxuXHQgICAgc3RyaW5naWZ5RGVjYWRlSGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlEZWNhZGVIZWFkZXIoZGF0ZSkge1xuXHQgICAgICB2YXIgeWVhclN0ciA9IGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpO1xuXHQgICAgICB2YXIgZmlyc3RZZWFyT2ZEZWNhZGUgPSB5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMDtcblx0ICAgICAgdmFyIGxhc3RZZWFyT2ZEZWNhZGUgPSBwYXJzZUludChmaXJzdFllYXJPZkRlY2FkZSwgMTApICsgMTA7XG5cdCAgICAgIHJldHVybiBmaXJzdFllYXJPZkRlY2FkZSArICctJyArIGxhc3RZZWFyT2ZEZWNhZGU7XG5cdCAgICB9LFxuXHQgICAgc3RyaW5naWZ5RGF5SGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlEYXlIZWFkZXIoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldICsgJyAnICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgfSxcblx0ICAgIHBhcnNlTW9udGg6IGZ1bmN0aW9uIHBhcnNlTW9udGgoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeVllYXJIZWFkZXI6IGZ1bmN0aW9uIHN0cmluZ2lmeVllYXJIZWFkZXIoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGRhdGUpIHtcblx0ICAgICAgdmFyIGZvcm1hdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdGhpcy5mb3JtYXQ7XG5cdFxuXHQgICAgICBpZiAoIWRhdGUpIGRhdGUgPSB0aGlzLnBhcnNlKCk7XG5cdCAgICAgIGlmICghZGF0ZSkgcmV0dXJuICcnO1xuXHQgICAgICB2YXIgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgICAgdmFyIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcblx0ICAgICAgdmFyIGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHQgICAgICB2YXIgbW9udGhOYW1lID0gdGhpcy5wYXJzZU1vbnRoKGRhdGUpO1xuXHQgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoL3l5eXkvZywgeWVhcikucmVwbGFjZSgveXkvZywgeWVhcikucmVwbGFjZSgvTU1NTS9nLCBtb250aE5hbWUpLnJlcGxhY2UoL01NTS9nLCBtb250aE5hbWUuc3Vic3RyaW5nKDAsIDMpKS5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSkucmVwbGFjZSgvTSg/IWEpL2csIG1vbnRoKS5yZXBsYWNlKC9kZC9nLCAoJzAnICsgZGF5KS5zbGljZSgtMikpLnJlcGxhY2UoL2QvZywgZGF5KTtcblx0ICAgIH0sXG5cdCAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG5cdCAgICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCB8fCBzdHIgPT09IG51bGwpIHtcblx0ICAgICAgICBzdHIgPSB0aGlzLnZhbDtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZGF0ZSA9IHN0ci5sZW5ndGggPT09IDEwICYmICh0aGlzLmZvcm1hdCA9PT0gJ2RkLU1NLXl5eXknIHx8IHRoaXMuZm9ybWF0ID09PSAnZGQvTU0veXl5eScpID8gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSkgLSAxLCBzdHIuc3Vic3RyaW5nKDAsIDIpKSA6IG5ldyBEYXRlKHN0cik7XG5cdCAgICAgIHJldHVybiBpc05hTihkYXRlLmdldEZ1bGxZZWFyKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG5cdCAgICB9LFxuXHQgICAgZ2V0RGF5Q291bnQ6IGZ1bmN0aW9uIGdldERheUNvdW50KHllYXIsIG1vbnRoKSB7XG5cdCAgICAgIHZhciBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuXHQgICAgICBpZiAobW9udGggPT09IDEpIHtcblx0ICAgICAgICBpZiAoeWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB7XG5cdCAgICAgICAgICByZXR1cm4gMjk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBkaWN0W21vbnRoXTtcblx0ICAgIH0sXG5cdCAgICBnZXREYXRlUmFuZ2U6IGZ1bmN0aW9uIGdldERhdGVSYW5nZSgpIHtcblx0ICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXTtcblx0ICAgICAgdGhpcy5kZWNhZGVSYW5nZSA9IFtdO1xuXHQgICAgICB2YXIgdGltZSA9IHtcblx0ICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXG5cdCAgICAgICAgbW9udGg6IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSxcblx0ICAgICAgICBkYXk6IHRoaXMuY3VyckRhdGUuZ2V0RGF0ZSgpXG5cdCAgICAgIH07XG5cdCAgICAgIHZhciB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKCk7XG5cdCAgICAgIHZhciBmaXJzdFllYXJPZkRlY2FkZSA9IHllYXJTdHIuc3Vic3RyaW5nKDAsIHllYXJTdHIubGVuZ3RoIC0gMSkgKyAwIC0gMTtcblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG5cdCAgICAgICAgdGhpcy5kZWNhZGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgIHRleHQ6IGZpcnN0WWVhck9mRGVjYWRlICsgaVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIDEpO1xuXHQgICAgICB2YXIgZmlyc3REYXlXZWVrID0gY3Vyck1vbnRoRmlyc3REYXkuZ2V0RGF5KCkgKyAxO1xuXHQgICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XG5cdCAgICAgICAgZmlyc3REYXlXZWVrID0gNztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZGF5Q291bnQgPSB0aGlzLmdldERheUNvdW50KHRpbWUueWVhciwgdGltZS5tb250aCk7XG5cdCAgICAgIGlmIChmaXJzdERheVdlZWsgPiAxKSB7XG5cdCAgICAgICAgdmFyIHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSk7XG5cdCAgICAgICAgdmFyIHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCk7XG5cdCAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGZpcnN0RGF5V2VlazsgX2krKykge1xuXHQgICAgICAgICAgdmFyIGRheVRleHQgPSBwcmV2TW9udGhEYXlDb3VudCAtIGZpcnN0RGF5V2VlayArIF9pICsgMTtcblx0ICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUocHJlTW9udGgueWVhciwgcHJlTW9udGgubW9udGgsIGRheVRleHQpO1xuXHQgICAgICAgICAgdmFyIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZ3JheSc7XG5cdCAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcblx0ICAgICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goeyB0ZXh0OiBkYXlUZXh0LCBkYXRlOiBkYXRlLCBzY2xhc3M6IHNjbGFzcyB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8PSBkYXlDb3VudDsgX2kyKyspIHtcblx0ICAgICAgICB2YXIgX2RhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIF9pMik7XG5cdCAgICAgICAgdmFyIF9zY2xhc3MgPSAnJztcblx0ICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICBfc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKF9pMiA9PSB0aW1lLmRheSAmJiBfZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBfZGF0ZS5nZXRNb250aCgpID09IHRpbWUubW9udGgpIHtcblx0ICAgICAgICAgIF9zY2xhc3MgPSAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHsgdGV4dDogX2kyLCBkYXRlOiBfZGF0ZSwgc2NsYXNzOiBfc2NsYXNzIH0pO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBpZiAodGhpcy5kYXRlUmFuZ2UubGVuZ3RoIDwgNDIpIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoTmVlZCA9IDQyIC0gdGhpcy5kYXRlUmFuZ2UubGVuZ3RoO1xuXHQgICAgICAgIHZhciBuZXh0TW9udGggPSB0aGlzLmdldFllYXJNb250aCh0aW1lLnllYXIsIHRpbWUubW9udGggKyAxKTtcblx0XG5cdCAgICAgICAgZm9yICh2YXIgX2kzID0gMTsgX2kzIDw9IG5leHRNb250aE5lZWQ7IF9pMysrKSB7XG5cdCAgICAgICAgICB2YXIgX2RhdGUyID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgX2kzKTtcblx0ICAgICAgICAgIHZhciBfc2NsYXNzMiA9ICdkYXRlcGlja2VyLWl0ZW0tZ3JheSc7XG5cdCAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlMi5nZXREYXkoKSkgPiAtMSkge1xuXHQgICAgICAgICAgICBfc2NsYXNzMiA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSc7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHsgdGV4dDogX2kzLCBkYXRlOiBfZGF0ZTIsIHNjbGFzczogX3NjbGFzczIgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcyk7XG5cdCAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbCkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKTtcblx0ICAgIHRoaXMuX2JsdXIgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZiAoIV90aGlzLiRlbC5jb250YWlucyhlLnRhcmdldCkpIF90aGlzLmNsb3NlKCk7XG5cdCAgICB9O1xuXHQgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2wgZGF0ZXBpY2tlci1pbnB1dFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgJ3dpdGgtcmVzZXQtYnV0dG9uJzogX3ZtLmNsZWFyQnV0dG9uXG5cdCAgICB9LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ud2lkdGhcblx0ICAgIH0pLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwidGV4dFwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlclxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uaW5wdXRDbGljayxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS52YWwgPSAnJ1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzcGxheURheVZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlEYXlWaWV3XCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1wb3B1cFwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1pbm5lclwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1ib2R5XCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWN0cmxcIlxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLnByZUJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dE1vbnRoQ2xpY2soMClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLm5leHRCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRNb250aENsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywge1xuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uc3dpdGNoTW9udGhWaWV3XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURheUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItd2Vla1JhbmdlXCJcblx0ICB9LCBfdm0uX2woKF92bS50ZXh0LmRheXNPZldlZWspLCBmdW5jdGlvbih3KSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdihfdm0uX3ModykpXSlcblx0ICB9KSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1kYXRlUmFuZ2VcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLmRhdGVSYW5nZSksIGZ1bmN0aW9uKGQpIHtcblx0ICAgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGNsYXNzOiBkLnNjbGFzcyxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLmRheVNlbGVjdChkKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3MoZC50ZXh0KSldKVxuXHQgIH0pKV0pXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzcGxheU1vbnRoVmlldyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiZGlzcGxheU1vbnRoVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRZZWFyQ2xpY2soMClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLm5leHRCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRZZWFyQ2xpY2soMSlcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3AnLCB7XG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5zd2l0Y2hEZWNhZGVWaWV3XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeVllYXJIZWFkZXIoX3ZtLmN1cnJEYXRlKSkpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2VcIlxuXHQgIH0sIFtfdm0uX2woKF92bS50ZXh0Lm1vbnRocyksIGZ1bmN0aW9uKG0sIGluZGV4KSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOlxuXHQgICAgICAgIChfdm0udGV4dC5tb250aHNbX3ZtLnBhcnNlKF92bS52YWwpLmdldE1vbnRoKCldID09PSBtKSAmJlxuXHQgICAgICAgIF92bS5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpID09PSBfdm0ucGFyc2UoX3ZtLnZhbCkuZ2V0RnVsbFllYXIoKVxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidGV4dENvbnRlbnRcIjogX3ZtLl9zKG0uc3Vic3RyKDAsIDMpKVxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICBfdm0ubW9udGhTZWxlY3QoaW5kZXgpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9KV1cblx0ICB9KV0sIDIpXSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5kaXNwbGF5WWVhclZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlZZWFyVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHREZWNhZGVDbGljaygwKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ubmV4dEJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dERlY2FkZUNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURlY2FkZUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItbW9udGhSYW5nZSBkZWNhZGVSYW5nZVwiXG5cdCAgfSwgW192bS5fbCgoX3ZtLmRlY2FkZVJhbmdlKSwgZnVuY3Rpb24oZGVjYWRlKSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOiBfdm0ucGFyc2UoX3ZtLnZhbCkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHRcblx0ICAgICAgfSxcblx0ICAgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgICBcInRleHRDb250ZW50XCI6IF92bS5fcyhkZWNhZGUudGV4dClcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICAgX3ZtLnllYXJTZWxlY3QoZGVjYWRlLnRleHQpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9KV1cblx0ICB9KV0sIDIpXSldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDc3YjhlNWRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA2KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxEcm9wZG93bi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzliZTEwNzJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTM5YmUxMDcyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRHJvcGRvd24udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBzaXplOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICB2YXIgc2hvdyA9IHRoaXMudmFsdWU7XG5cdCAgICByZXR1cm4geyBzaG93OiBzaG93IH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHNob3c6IGZ1bmN0aW9uIHNob3codmFsKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBidXR0b25TaXplOiBmdW5jdGlvbiBidXR0b25TaXplKCkge1xuXHQgICAgICByZXR1cm4gflsnbGcnLCAnc20nLCAneHMnXS5pbmRleE9mKHRoaXMuc2l6ZSkgPyAnYnRuLScgKyB0aGlzLnNpemUgOiAnJztcblx0ICAgIH0sXG5cdCAgICBpbklucHV0OiBmdW5jdGlvbiBpbklucHV0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50Ll9pbnB1dDtcblx0ICAgIH0sXG5cdCAgICBpc0xpOiBmdW5jdGlvbiBpc0xpKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50Ll9pc1RhYnMgfHwgdGhpcy4kcGFyZW50Ll9uYXZiYXIgfHwgdGhpcy4kcGFyZW50Lm1lbnU7XG5cdCAgICB9LFxuXHQgICAgbWVudTogZnVuY3Rpb24gbWVudSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLiRwYXJlbnQgfHwgdGhpcy4kcGFyZW50Lm5hdmJhcjtcblx0ICAgIH0sXG5cdCAgICBzbG90czogZnVuY3Rpb24gc2xvdHMoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zbG90Q29udGVudHM7XG5cdCAgICB9LFxuXHQgICAgc3VibWVudTogZnVuY3Rpb24gc3VibWVudSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiAodGhpcy4kcGFyZW50Lm1lbnUgfHwgdGhpcy4kcGFyZW50LnN1Ym1lbnUpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcblx0ICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuXHQgICAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3c7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCd1bCcsIHRoaXMuJGVsKS5vbignY2xpY2snLCAnbGk+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIF90aGlzLnNob3cgPSBmYWxzZTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCd1bCcsIHRoaXMuJGVsKS5vZmYoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uaXNMaSA/ICdsaScgOiAnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJjbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1jbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmJsdXIpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImJsdXJcIlxuXHQgICAgfV0sXG5cdCAgICB0YWc6IFwiZGl2XCIsXG5cdCAgICBjbGFzczogW3tcblx0ICAgICAgb3BlbjogX3ZtLnNob3csXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIGRyb3Bkb3duOiBfdm0uaXNMaSxcblx0ICAgICAgJ2lucHV0LWdyb3VwLWJ0bic6IF92bS5pbklucHV0LFxuXHQgICAgICAnYnRuLWdyb3VwJzogIV92bS5pc0xpICYmICFfdm0uaW5JbnB1dFxuXHQgICAgfV1cblx0ICB9LCBbX3ZtLl90KFwiYmVmb3JlXCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmlzTGkpID8gX3ZtLl9jKCdhJywge1xuXHQgICAgY2xhc3M6IFsnZHJvcGRvd24tdG9nZ2xlJywgX3ZtLmJ1dHRvblNpemUsIHtcblx0ICAgICAgZGlzYWJsZWQ6IF92bS5kaXNhYmxlZFxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwia2V5dXBcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5zaG93ID0gZmFsc2Vcblx0ICAgICAgfSxcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJidXR0b25cIiwgW192bS5fdihfdm0uX3MoX3ZtLnRleHQpKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJldFwiXG5cdCAgfSldLCAyKSA6IF92bS5fYygnYnV0dG9uJywge1xuXHQgICAgY2xhc3M6IFsnYnRuIGJ0bi0nICsgX3ZtLnR5cGUsIF92bS5idXR0b25TaXplLCAnZHJvcGRvd24tdG9nZ2xlJ10sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJidXR0b25cIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZXNjXCIsIDI3KSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uc2hvdyA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiYnV0dG9uXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50ZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2FyZXRcIlxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRyb3Bkb3duLW1lbnVcIiwgW192bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zOWJlMTA3MlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEwOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEZvcm1Hcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzllYjQwMGFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTc5ZWI0MDBhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRm9ybUdyb3VwLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vIGxldCBjb2VyY2UgPSB7XG5cdC8vICAgICBlbnRlclN1Ym1pdDogJ2Jvb2xlYW4nLFxuXHQvLyAgICAgaWNvbjogJ2Jvb2xlYW4nXG5cdC8vIH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZW50ZXJTdWJtaXQ6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogZmFsc2Vcblx0ICAgIH0sXG5cdCAgICBpY29uOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9LFxuXHQgICAgbGFuZzoge1xuXHQgICAgICB0eXBlOiBTdHJpbmcsXG5cdCAgICAgIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoaWxkcmVuOiBbXSxcblx0ICAgICAgdmFsaWQ6IG51bGwsXG5cdCAgICAgIHRpbWVvdXQ6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbGlkOiBmdW5jdGlvbiB2YWxpZCh2YWwsIG9sZCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuXHQgICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuXHQgICAgICB0aGlzLmNoaWxkcmVuLnNvbWUoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgdmFyIHYgPSBlbC52YWxpZGF0ZSA/IGVsLnZhbGlkYXRlKCkgOiBlbC52YWxpZCAhPT0gdW5kZWZpbmVkID8gZWwudmFsaWQgOiBlbC5yZXF1aXJlZCAmJiAhflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKGVsLnZhbHVlKTtcblx0ICAgICAgICBpZiAoIXYpIHZhbGlkID0gZmFsc2U7XG5cdCAgICAgICAgcmV0dXJuICF2YWxpZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMudmFsaWQgPSB2YWxpZDtcblx0ICAgICAgcmV0dXJuIHZhbGlkID09PSB0cnVlO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2Zvcm1Hcm91cCA9IHRydWU7XG5cdCAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtR3JvdXApIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybUdyb3VwKSB7XG5cdCAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy52YWxpZGF0ZSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDExMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03OWViNDAwYVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEzKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEZvcm1WYWxpZGF0b3IudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWI5ZjU3YzQ2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1iOWY1N2M0NlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEZvcm1WYWxpZGF0b3IudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTEyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBlbnRlclN1Ym1pdDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgaWNvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgdmFsdWU6IG51bGxcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGlsZHJlbjogW10sXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuXHQgICAgICB2YXIgaW52YWxpZCA9ICF0aGlzLmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbC52YWxpZGF0ZSA/IGVsLnZhbGlkYXRlKCkgOiBlbC52YWxpZCAhPT0gdW5kZWZpbmVkID8gZWwudmFsaWQgOiBlbC5yZXF1aXJlZCAmJiAhflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKGVsLnZhbHVlKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMudmFsaWQgPSAhaW52YWxpZDtcblx0ICAgICAgcmV0dXJuICFpbnZhbGlkO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2Zvcm1WYWxpZGF0b3IgPSB0cnVlO1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcblx0ICAgIH1cblx0ICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy52YWxpZGF0ZSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDExMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1iOWY1N2M0NlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMTUpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTcpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE4KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXElucHV0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtNjUyYWQ3YjlcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTY1MmFkN2I5XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi02NTJhZDdiOVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIElucHV0LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDExNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE2KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02NTJhZDdiOSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vSW5wdXQudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02NTJhZDdiOSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vSW5wdXQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTE2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5mb3JtLWdyb3VwW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5sYWJlbH4uY2xvc2VbZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICB0b3A6IDI1cHg7XFxufVxcbi5pbnB1dC1ncm91cD4uaWNvbltkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxyXFxuICB3aWR0aDowO1xcclxcbiAgei1pbmRleDogMztcXG59XFxuLmNsb3NlW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICB6LWluZGV4OiAyO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMzRweDtcXHJcXG4gIGhlaWdodDogMzRweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzNHB4O1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uaGFzLWZlZWRiYWNrIC5jbG9zZVtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHJpZ2h0OiAyMHB4O1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0lucHV0LnZ1ZT81NmNlMTY5ZFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBMFFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsVUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EsUUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiSW5wdXQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIDpjbGFzcz1cXFwie3ZhbGlkYXRlOmNhblZhbGlkYXRlLCdoYXMtZmVlZGJhY2snOmljb24sJ2hhcy1lcnJvcic6Y2FuVmFsaWRhdGUmJnZhbGlkPT09ZmFsc2UsJ2hhcy1zdWNjZXNzJzpjYW5WYWxpZGF0ZSYmdmFsaWR9XFxcIj5cXHJcXG4gICAgPHNsb3QgbmFtZT1cXFwibGFiZWxcXFwiPjxsYWJlbCB2LWlmPVxcXCJsYWJlbFxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7bGFiZWx9fTwvbGFiZWw+PC9zbG90PlxcclxcbiAgICA8ZGl2IHYtaWY9XFxcIiRzbG90cy5iZWZvcmV8fCRzbG90cy5hZnRlclxcXCIgY2xhc3M9XFxcImlucHV0LWdyb3VwXFxcIj5cXHJcXG4gICAgICA8c2xvdCBuYW1lPVxcXCJiZWZvcmVcXFwiPjwvc2xvdD5cXHJcXG4gICAgICA8dGV4dGFyZWEgOmlzPVxcXCJ0eXBlPT0ndGV4dGFyZWEnP3R5cGU6J2lucHV0J1xcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIDpjb2xzPVxcXCJjb2xzXFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAgIDpsaXN0PVxcXCJpZF9kYXRhbGlzdFxcXCJcXHJcXG4gICAgICAgIDptYXg9XFxcImF0dHIobWF4KVxcXCJcXHJcXG4gICAgICAgIDptYXhsZW5ndGg9XFxcIm1heGxlbmd0aFxcXCJcXHJcXG4gICAgICAgIDptaW49XFxcImF0dHIobWluKVxcXCJcXHJcXG4gICAgICAgIDpuYW1lPVxcXCJuYW1lXFxcIlxcclxcbiAgICAgICAgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICAgIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiXFxyXFxuICAgICAgICA6cmVxdWlyZWQ9XFxcInJlcXVpcmVkXFxcIlxcclxcbiAgICAgICAgOnJvd3M9XFxcInJvd3NcXFwiXFxyXFxuICAgICAgICA6c3RlcD1cXFwic3RlcFxcXCJcXHJcXG4gICAgICAgIDp0aXRsZT1cXFwiYXR0cih0aXRsZSlcXFwiXFxyXFxuICAgICAgICA6dHlwZT1cXFwidHlwZT09J3RleHRhcmVhJz9udWxsOnR5cGVcXFwiXFxyXFxuICAgICAgICB2LW1vZGVsPVxcXCJ2YWxcXFwiXFxyXFxuICAgICAgICBAYmx1cj1cXFwiZW1pdFxcXCIgQGZvY3VzPVxcXCJlbWl0XFxcIiBAaW5wdXQ9XFxcImVtaXRcXFwiXFxyXFxuICAgICAgICBAa2V5dXAuZW50ZXI9XFxcInR5cGUhPSd0ZXh0YXJlYScmJmVudGVyU3VibWl0JiZzdWJtaXQoKVxcXCJcXHJcXG4gICAgICA+PC90ZXh0YXJlYT5cXHJcXG4gICAgICA8ZGl2IHYtaWY9XFxcImNsZWFyQnV0dG9uICYmIHZhbHVlXFxcIiA6Y2xhc3M9XFxcIntpY29uOmljb259XFxcIj5cXHJcXG4gICAgICAgIDxzcGFuIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJ2YWx1ZSA9ICcnXFxcIj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICAgIDxkaXYgdi1pZj1cXFwiaWNvblxcXCIgY2xhc3M9XFxcImljb25cXFwiPlxcclxcbiAgICAgICAgPHNwYW4gdi1pZj1cXFwiaWNvbiYmdmFsaWQhPT1udWxsXFxcIiA6Y2xhc3M9XFxcIlsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsJ2dseXBoaWNvbi0nKyh2YWxpZD8nb2snOidyZW1vdmUnKV1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiYWZ0ZXJcXFwiPjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XFxyXFxuICAgICAgPHRleHRhcmVhIDppcz1cXFwidHlwZT09J3RleHRhcmVhJz90eXBlOidpbnB1dCdcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICA6Y29scz1cXFwiY29sc1xcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgICA6bGlzdD1cXFwiaWRfZGF0YWxpc3RcXFwiXFxyXFxuICAgICAgICA6bWF4PVxcXCJhdHRyKG1heClcXFwiXFxyXFxuICAgICAgICA6bWF4bGVuZ3RoPVxcXCJtYXhsZW5ndGhcXFwiXFxyXFxuICAgICAgICA6bWluPVxcXCJhdHRyKG1pbilcXFwiXFxyXFxuICAgICAgICA6bmFtZT1cXFwibmFtZVxcXCJcXHJcXG4gICAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOnJlcXVpcmVkPVxcXCJyZXF1aXJlZFxcXCJcXHJcXG4gICAgICAgIDpyb3dzPVxcXCJyb3dzXFxcIlxcclxcbiAgICAgICAgOnN0ZXA9XFxcInN0ZXBcXFwiXFxyXFxuICAgICAgICA6dGl0bGU9XFxcImF0dHIodGl0bGUpXFxcIlxcclxcbiAgICAgICAgOnR5cGU9XFxcInR5cGU9PSd0ZXh0YXJlYSc/bnVsbDp0eXBlXFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgICAgQGJsdXI9XFxcImVtaXRcXFwiIEBmb2N1cz1cXFwiZW1pdFxcXCIgQGlucHV0PVxcXCJlbWl0XFxcIlxcclxcbiAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ0eXBlIT0ndGV4dGFyZWEnJiZlbnRlclN1Ym1pdCYmc3VibWl0KClcXFwiXFxyXFxuICAgICAgPjwvdGV4dGFyZWE+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiY2xlYXJCdXR0b24gJiYgdmFsXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwidmFsID0gJydcXFwiPiZ0aW1lczs8L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiaWNvbiYmdmFsaWQhPT1udWxsXFxcIiA6Y2xhc3M9XFxcIlsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsJ2dseXBoaWNvbi0nKyh2YWxpZD8nb2snOidyZW1vdmUnKV1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgIDxkYXRhbGlzdCB2LWlmPVxcXCJpZF9kYXRhbGlzdFxcXCIgOmlkPVxcXCJpZF9kYXRhbGlzdFxcXCI+XFxyXFxuICAgICAgPG9wdGlvbiB2LWZvcj1cXFwib3BjIGluIG9wdGlvbnNcXFwiIDp2YWx1ZT1cXFwib3BjXFxcIj48L29wdGlvbj5cXHJcXG4gICAgPC9kYXRhbGlzdD5cXHJcXG4gICAgPGRpdiB2LWlmPVxcXCJzaG93SGVscFxcXCIgY2xhc3M9XFxcImhlbHAtYmxvY2tcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7aGVscH19PC9kaXY+XFxyXFxuICAgIDxkaXYgdi1pZj1cXFwic2hvd0Vycm9yXFxcIiBjbGFzcz1cXFwiaGVscC1ibG9jayB3aXRoLWVycm9yc1xcXCIgQGNsaWNrPVxcXCJmb2N1c1xcXCI+e3tlcnJvclRleHR9fTwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Y29lcmNlLCBkZWxheWVyLCB0cmFuc2xhdGlvbnN9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG52YXIgREVMQVkgPSAzMDBcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBjbGVhckJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgY29sczoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGRhdGFsaXN0OiB7dHlwZTogQXJyYXksIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBkaXNhYmxlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZW50ZXJTdWJtaXQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGVycm9yOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgaGVscDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGhpZGVIZWxwOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIGljb246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGxhYmVsOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgbGFuZzoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbmF2aWdhdG9yLmxhbmd1YWdlfSxcXHJcXG4gICAgbWFzazogbnVsbCxcXHJcXG4gICAgbWFza0RlbGF5OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDB9LFxcclxcbiAgICBtYXRjaDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1heDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1heGxlbmd0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1pbjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1pbmxlbmd0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBwYXR0ZXJuOiB7ZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHJlcXVpcmVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICByb3dzOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzfSxcXHJcXG4gICAgc3RlcDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0J30sXFxyXFxuICAgIHVybDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHVybE1hcDoge3R5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsaWRhdGlvbkRlbGF5OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAyNTB9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgb3B0aW9uczogdGhpcy5kYXRhbGlzdCxcXHJcXG4gICAgICB2YWwsXFxyXFxuICAgICAgdmFsaWQ6IG51bGwsXFxyXFxuICAgICAgdGltZW91dDogbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgY2FuVmFsaWRhdGUgKCkgeyByZXR1cm4gIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHkgJiYgKHRoaXMucmVxdWlyZWQgfHwgdGhpcy5yZWdleCB8fCB0aGlzLm5hdGl2ZVZhbGlkYXRlIHx8IHRoaXMubWF0Y2ggIT09IG51bGwpIH0sXFxyXFxuICAgIGVycm9yVGV4dCAoKSB7XFxyXFxuICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZVxcclxcbiAgICAgIGxldCBlcnJvciA9IFt0aGlzLmVycm9yXVxcclxcbiAgICAgIGlmICghdmFsdWUgJiYgdGhpcy5yZXF1aXJlZCkgZXJyb3IucHVzaCgnKCcgKyB0aGlzLnRleHQucmVxdWlyZWQudG9Mb3dlckNhc2UoKSArICcpJylcXHJcXG4gICAgICBpZiAodmFsdWUgJiYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSkgZXJyb3IucHVzaCgnKCcgKyB0aGlzLnRleHQubWluTGVuZ3RoLnRvTG93ZXJDYXNlKCkgKyAnOiAnICsgdGhpcy5taW5sZW5ndGggKyAnKScpXFxyXFxuICAgICAgcmV0dXJuIGVycm9yLmpvaW4oJyAnKVxcclxcbiAgICB9LFxcclxcbiAgICBpZF9kYXRhbGlzdCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0aGlzLmRhdGFsaXN0IGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIGlmICghdGhpcy5faWRfZGF0YWxpc3QpIHtcXHJcXG4gICAgICAgICAgaWYgKCF0aGlzLiRyb290LmlkX2RhdGFsaXN0KSB7IHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QgPSAwIH1cXHJcXG4gICAgICAgICAgdGhpcy5faWRfZGF0YWxpc3QgPSAnaW5wdXQtZGF0YWxpc3QnICsgdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCsrXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICByZXR1cm4gdGhpcy5faWRfZGF0YWxpc3RcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIG51bGxcXHJcXG4gICAgfSxcXHJcXG4gICAgaW5wdXQgKCkgeyByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dCB9LFxcclxcbiAgICBuYXRpdmVWYWxpZGF0ZSAoKSB7IHJldHVybiAodGhpcy5pbnB1dCB8fCB7fSkuY2hlY2tWYWxpZGl0eSAmJiAoflsndXJsJywgJ2VtYWlsJ10uaW5kZXhPZih0aGlzLnR5cGUudG9Mb3dlckNhc2UoKSkgfHwgdGhpcy5taW4gfHwgdGhpcy5tYXgpIH0sXFxyXFxuICAgIHJlZ2V4ICgpIHsgcmV0dXJuIGNvZXJjZS5wYXR0ZXJuKHRoaXMucGF0dGVybikgfSxcXHJcXG4gICAgc2hvd0Vycm9yICgpIHsgcmV0dXJuIHRoaXMuZXJyb3IgJiYgdGhpcy52YWxpZCA9PT0gZmFsc2UgfSxcXHJcXG4gICAgc2hvd0hlbHAgKCkgeyByZXR1cm4gdGhpcy5oZWxwICYmICghdGhpcy5zaG93RXJyb3IgfHwgIXRoaXMuaGlkZUhlbHApIH0sXFxyXFxuICAgIHRleHQgKCkgeyByZXR1cm4gdHJhbnNsYXRpb25zKHRoaXMubGFuZykgfSxcXHJcXG4gICAgdGl0bGUgKCkgeyByZXR1cm4gdGhpcy5lcnJvclRleHQgfHwgdGhpcy5oZWxwIHx8ICcnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBkYXRhbGlzdCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQgJiYgdmFsIGluc3RhbmNlb2YgQXJyYXkpIHsgdGhpcy5vcHRpb25zID0gdmFsIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgbWF0Y2ggKHZhbCkgeyB0aGlzLmV2YWwoKSB9LFxcclxcbiAgICBvcHRpb25zICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdXJsICh2YWwpIHtcXHJcXG4gICAgICB0aGlzLl91cmwoKVxcclxcbiAgICB9LFxcclxcbiAgICB2YWwgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XFxyXFxuICAgICAgICBpZiAodGhpcy5tYXNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcXHJcXG4gICAgICAgICAgdmFsID0gdGhpcy5tYXNrKHZhbCB8fCAnJylcXHJcXG4gICAgICAgICAgaWYgKHRoaXMudmFsICE9PSB2YWwpIHtcXHJcXG4gICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dC5tYXNrKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5tYXNrKVxcclxcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQubWFzayA9IHNldFRpbWVvdXQoKCkgPT4ge1xcclxcbiAgICAgICAgICAgICAgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgICAgICAgICB9LCBpc05hTih0aGlzLm1hc2tEZWxheSkgPyAwIDogdGhpcy5tYXNrRGVsYXkpXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuZXZhbCgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB2YWxpZCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpXFxyXFxuICAgICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LnZhbGlkYXRlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7IHRoaXMudmFsID0gdmFsIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgYXR0ciAodmFsdWUpIHtcXHJcXG4gICAgICByZXR1cm4gflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gbnVsbCA6IHZhbHVlXFxyXFxuICAgIH0sXFxyXFxuICAgIGVtaXQgKGUpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KGUudHlwZSwgZS50eXBlID09ICdpbnB1dCcgPyBlLnRhcmdldC52YWx1ZSA6IGUpXFxyXFxuICAgICAgaWYgKGUudHlwZSA9PT0gJ2JsdXInICYmIHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGV2YWwgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpXFxyXFxuICAgICAgaWYgKCF0aGlzLmNhblZhbGlkYXRlKSB7XFxyXFxuICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKVxcclxcbiAgICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBudWxsXFxyXFxuICAgICAgICB9LCB0aGlzLnZhbGlkYXRpb25EZWxheSlcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGZvY3VzICgpIHsgdGhpcy5pbnB1dC5mb2N1cygpIH0sXFxyXFxuICAgIHN1Ym1pdCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuJHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICAgIGlmICh0aGlzLmlucHV0LmZvcm0pIHtcXHJcXG4gICAgICAgIGNvbnN0IGludmFsaWRzID0gJCgnLmZvcm0tZ3JvdXAudmFsaWRhdGU6bm90KC5oYXMtc3VjY2VzcyknLCB0aGlzLmlucHV0LmZvcm0pXFxyXFxuICAgICAgICBpZiAoaW52YWxpZHMubGVuZ3RoKSB7XFxyXFxuICAgICAgICAgIGludmFsaWRzLmZpbmQoJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcpWzBdLmZvY3VzKClcXHJcXG4gICAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICAgIHRoaXMuaW5wdXQuZm9ybS5zdWJtaXQoKVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWRhdGUgKCkge1xcclxcbiAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkgeyByZXR1cm4gdHJ1ZSB9XFxyXFxuICAgICAgbGV0IHZhbHVlID0gKHRoaXMudmFsIHx8ICcnKS50cmltKClcXHJcXG4gICAgICBpZiAoIXZhbHVlKSB7IHJldHVybiAhdGhpcy5yZXF1aXJlZCB9XFxyXFxuICAgICAgaWYgKHRoaXMubWF0Y2ggIT09IG51bGwpIHsgcmV0dXJuIHRoaXMubWF0Y2ggPT09IHZhbHVlIH1cXHJcXG4gICAgICBpZiAodmFsdWUubGVuZ3RoIDwgdGhpcy5taW5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICBpZiAodGhpcy5uYXRpdmVWYWxpZGF0ZSAmJiAhdGhpcy5pbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICBpZiAodGhpcy5yZWdleCkge1xcclxcbiAgICAgICAgaWYgKCEodGhpcy5yZWdleCBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdGhpcy5yZWdleCh0aGlzLnZhbCkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWwpKSkgeyByZXR1cm4gZmFsc2UgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgICByZXR1cm4gdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICByZXNldCgpIHtcXHJcXG4gICAgICB0aGlzLnZhbHVlID0gJydcXHJcXG4gICAgICB0aGlzLnZhbGlkID0gbnVsbFxcclxcbiAgICAgIGlmICh0aGlzLl90aW1lb3V0Lm1hc2spIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0Lm1hc2spXFxyXFxuICAgICAgaWYgKHRoaXMuX3RpbWVvdXQuZXZhbCkgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQuZXZhbClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9pbnB1dCA9IHRydWVcXHJcXG4gICAgdGhpcy5fdGltZW91dCA9IHt9XFxyXFxuICAgIGxldCBwYXJlbnQgPSB0aGlzLiRwYXJlbnRcXHJcXG4gICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7IHBhcmVudCA9IHBhcmVudC4kcGFyZW50IH1cXHJcXG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcXHJcXG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKVxcclxcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudFxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuX3VybCA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuJGh0dHAgfHwgdGhpcy5fbG9hZGluZykgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy4kaHR0cC5nZXQodGhpcy51cmwpLnRoZW4ocmVzcG9uc2UgPT4ge1xcclxcbiAgICAgICAgdmFyIGRhdGEgPSByZXNwb25zZS5kYXRhIGluc3RhbmNlb2YgQXJyYXkgPyByZXNwb25zZS5kYXRhIDogW11cXHJcXG4gICAgICAgIHRyeSB7IGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpIH0gY2F0Y2ggKGUpIHt9XFxyXFxuICAgICAgICBpZiAodGhpcy51cmxNYXApIHsgZGF0YSA9IGRhdGEubWFwKHRoaXMudXJsTWFwKSB9XFxyXFxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBkYXRhXFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIH0sIHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSwgREVMQVkpXFxyXFxuICAgIGlmICh0aGlzLnVybCkgdGhpcy5fdXJsKClcXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgLy8gJCh0aGlzLmlucHV0KS5vbignZm9jdXMnLCBlID0+IHsgdGhpcy4kZW1pdCgnZm9jdXMnLCBlKSB9KS5vbignYmx1cicsIGUgPT4ge1xcclxcbiAgICAvLyAgIGlmICh0aGlzLmNhblZhbGlkYXRlKSB7IHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKCkgfVxcclxcbiAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxcclxcbiAgICAvLyB9KVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXFxyXFxuICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcXHJcXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKVxcclxcbiAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpXFxyXFxuICAgIH1cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlIHNjb3BlZD5cXHJcXG4uZm9ybS1ncm91cCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxufVxcclxcbmxhYmVsfi5jbG9zZSB7XFxyXFxuICB0b3A6IDI1cHg7XFxyXFxufVxcclxcbi5pbnB1dC1ncm91cD4uaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcclxcbiAgd2lkdGg6MDtcXHJcXG4gIHotaW5kZXg6IDM7XFxyXFxufVxcclxcbi5jbG9zZSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5oYXMtZmVlZGJhY2sgLmNsb3NlIHtcXHJcXG4gIHJpZ2h0OiAyMHB4O1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTE3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdHZhciBERUxBWSA9IDMwMDtcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgY2xlYXJCdXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGNvbHM6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBkYXRhbGlzdDogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGVudGVyU3VibWl0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBlcnJvcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGhlbHA6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBoaWRlSGVscDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBpY29uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBsYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIG1hc2s6IG51bGwsXG5cdCAgICBtYXNrRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDAgfSxcblx0ICAgIG1hdGNoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWF4OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWF4bGVuZ3RoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWluOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWlubGVuZ3RoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHBhdHRlcm46IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgcmVxdWlyZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHJvd3M6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzIH0sXG5cdCAgICBzdGVwOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0JyB9LFxuXHQgICAgdXJsOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdXJsTWFwOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB2YWxpZGF0aW9uRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAyNTAgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgb3B0aW9uczogdGhpcy5kYXRhbGlzdCxcblx0ICAgICAgdmFsOiB2YWwsXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBjYW5WYWxpZGF0ZTogZnVuY3Rpb24gY2FuVmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSAmJiAodGhpcy5yZXF1aXJlZCB8fCB0aGlzLnJlZ2V4IHx8IHRoaXMubmF0aXZlVmFsaWRhdGUgfHwgdGhpcy5tYXRjaCAhPT0gbnVsbCk7XG5cdCAgICB9LFxuXHQgICAgZXJyb3JUZXh0OiBmdW5jdGlvbiBlcnJvclRleHQoKSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG5cdCAgICAgIHZhciBlcnJvciA9IFt0aGlzLmVycm9yXTtcblx0ICAgICAgaWYgKCF2YWx1ZSAmJiB0aGlzLnJlcXVpcmVkKSBlcnJvci5wdXNoKCcoJyArIHRoaXMudGV4dC5yZXF1aXJlZC50b0xvd2VyQ2FzZSgpICsgJyknKTtcblx0ICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSBlcnJvci5wdXNoKCcoJyArIHRoaXMudGV4dC5taW5MZW5ndGgudG9Mb3dlckNhc2UoKSArICc6ICcgKyB0aGlzLm1pbmxlbmd0aCArICcpJyk7XG5cdCAgICAgIHJldHVybiBlcnJvci5qb2luKCcgJyk7XG5cdCAgICB9LFxuXHQgICAgaWRfZGF0YWxpc3Q6IGZ1bmN0aW9uIGlkX2RhdGFsaXN0KCkge1xuXHQgICAgICBpZiAodGhpcy50eXBlICE9PSAndGV4dGFyZWEnICYmIHRoaXMuZGF0YWxpc3QgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIGlmICghdGhpcy5faWRfZGF0YWxpc3QpIHtcblx0ICAgICAgICAgIGlmICghdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCkge1xuXHQgICAgICAgICAgICB0aGlzLiRyb290LmlkX2RhdGFsaXN0ID0gMDtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuX2lkX2RhdGFsaXN0ID0gJ2lucHV0LWRhdGFsaXN0JyArIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QrKztcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2lkX2RhdGFsaXN0O1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfSxcblx0ICAgIGlucHV0OiBmdW5jdGlvbiBpbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgbmF0aXZlVmFsaWRhdGU6IGZ1bmN0aW9uIG5hdGl2ZVZhbGlkYXRlKCkge1xuXHQgICAgICByZXR1cm4gKHRoaXMuaW5wdXQgfHwge30pLmNoZWNrVmFsaWRpdHkgJiYgKH5bJ3VybCcsICdlbWFpbCddLmluZGV4T2YodGhpcy50eXBlLnRvTG93ZXJDYXNlKCkpIHx8IHRoaXMubWluIHx8IHRoaXMubWF4KTtcblx0ICAgIH0sXG5cdCAgICByZWdleDogZnVuY3Rpb24gcmVnZXgoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLnBhdHRlcm4odGhpcy5wYXR0ZXJuKTtcblx0ICAgIH0sXG5cdCAgICBzaG93RXJyb3I6IGZ1bmN0aW9uIHNob3dFcnJvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZXJyb3IgJiYgdGhpcy52YWxpZCA9PT0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvd0hlbHA6IGZ1bmN0aW9uIHNob3dIZWxwKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5oZWxwICYmICghdGhpcy5zaG93RXJyb3IgfHwgIXRoaXMuaGlkZUhlbHApO1xuXHQgICAgfSxcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICB0aXRsZTogZnVuY3Rpb24gdGl0bGUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmVycm9yVGV4dCB8fCB0aGlzLmhlbHAgfHwgJyc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgZGF0YWxpc3Q6IGZ1bmN0aW9uIGRhdGFsaXN0KHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB2YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIHRoaXMub3B0aW9ucyA9IHZhbDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1hdGNoOiBmdW5jdGlvbiBtYXRjaCh2YWwpIHtcblx0ICAgICAgdGhpcy5ldmFsKCk7XG5cdCAgICB9LFxuXHQgICAgb3B0aW9uczogZnVuY3Rpb24gb3B0aW9ucyh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHVybDogZnVuY3Rpb24gdXJsKHZhbCkge1xuXHQgICAgICB0aGlzLl91cmwoKTtcblx0ICAgIH0sXG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICAgIGlmIChfdmFsICE9PSBvbGQpIHtcblx0ICAgICAgICBpZiAodGhpcy5tYXNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICAgIF92YWwgPSB0aGlzLm1hc2soX3ZhbCB8fCAnJyk7XG5cdCAgICAgICAgICBpZiAodGhpcy52YWwgIT09IF92YWwpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQubWFzayA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgIF90aGlzLnZhbCA9IF92YWw7XG5cdCAgICAgICAgICAgIH0sIGlzTmFOKHRoaXMubWFza0RlbGF5KSA/IDAgOiB0aGlzLm1hc2tEZWxheSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXZhbCgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsaWQ6IGZ1bmN0aW9uIHZhbGlkKHZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lzdmFsaWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKTtcblx0ICAgICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LnZhbGlkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBhdHRyOiBmdW5jdGlvbiBhdHRyKHZhbHVlKSB7XG5cdCAgICAgIHJldHVybiB+WycnLCBudWxsLCB1bmRlZmluZWRdLmluZGV4T2YodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBudWxsIDogdmFsdWU7XG5cdCAgICB9LFxuXHQgICAgZW1pdDogZnVuY3Rpb24gZW1pdChlKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoZS50eXBlLCBlLnR5cGUgPT0gJ2lucHV0JyA/IGUudGFyZ2V0LnZhbHVlIDogZSk7XG5cdCAgICAgIGlmIChlLnR5cGUgPT09ICdibHVyJyAmJiB0aGlzLmNhblZhbGlkYXRlKSB7XG5cdCAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGV2YWw6IGZ1bmN0aW9uIF9ldmFsKCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgICBpZiAoIXRoaXMuY2FuVmFsaWRhdGUpIHtcblx0ICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIF90aGlzMi52YWxpZCA9IF90aGlzMi52YWxpZGF0ZSgpO1xuXHQgICAgICAgICAgX3RoaXMyLl90aW1lb3V0LmV2YWwgPSBudWxsO1xuXHQgICAgICAgIH0sIHRoaXMudmFsaWRhdGlvbkRlbGF5KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcblx0ICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuXHQgICAgfSxcblx0ICAgIHN1Ym1pdDogZnVuY3Rpb24gc3VibWl0KCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLmlucHV0LmZvcm0pIHtcblx0ICAgICAgICB2YXIgaW52YWxpZHMgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLmZvcm0tZ3JvdXAudmFsaWRhdGU6bm90KC5oYXMtc3VjY2VzcyknLCB0aGlzLmlucHV0LmZvcm0pO1xuXHQgICAgICAgIGlmIChpbnZhbGlkcy5sZW5ndGgpIHtcblx0ICAgICAgICAgIGludmFsaWRzLmZpbmQoJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcpWzBdLmZvY3VzKCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuaW5wdXQuZm9ybS5zdWJtaXQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG5cdCAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciB2YWx1ZSA9ICh0aGlzLnZhbCB8fCAnJykudHJpbSgpO1xuXHQgICAgICBpZiAoIXZhbHVlKSB7XG5cdCAgICAgICAgcmV0dXJuICF0aGlzLnJlcXVpcmVkO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLm1hdGNoICE9PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2ggPT09IHZhbHVlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbmxlbmd0aCkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5uYXRpdmVWYWxpZGF0ZSAmJiAhdGhpcy5pbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMucmVnZXgpIHtcblx0ICAgICAgICBpZiAoISh0aGlzLnJlZ2V4IGluc3RhbmNlb2YgRnVuY3Rpb24gPyB0aGlzLnJlZ2V4KHRoaXMudmFsKSA6IHRoaXMucmVnZXgudGVzdCh0aGlzLnZhbCkpKSB7XG5cdCAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLnZhbGlkID0gbnVsbDtcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lucHV0ID0gdHJ1ZTtcblx0ICAgIHRoaXMuX3RpbWVvdXQgPSB7fTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgICAgdGhpcy5fdXJsID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdCAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICBpZiAoX3RoaXMzLnVybE1hcCkge1xuXHQgICAgICAgICAgZGF0YSA9IGRhdGEubWFwKF90aGlzMy51cmxNYXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBfdGhpczMub3B0aW9ucyA9IGRhdGE7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LCBERUxBWSk7XG5cdCAgICBpZiAodGhpcy51cmwpIHRoaXMuX3VybCgpO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIC8vICQodGhpcy5pbnB1dCkub24oJ2ZvY3VzJywgZSA9PiB7IHRoaXMuJGVtaXQoJ2ZvY3VzJywgZSkgfSkub24oJ2JsdXInLCBlID0+IHtcblx0ICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XG5cdCAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxuXHQgICAgLy8gfSlcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1ncm91cFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgdmFsaWRhdGU6IF92bS5jYW5WYWxpZGF0ZSwgJ2hhcy1mZWVkYmFjayc6IF92bS5pY29uLCAnaGFzLWVycm9yJzogX3ZtLmNhblZhbGlkYXRlICYmIF92bS52YWxpZCA9PT0gZmFsc2UsICdoYXMtc3VjY2Vzcyc6IF92bS5jYW5WYWxpZGF0ZSAmJiBfdm0udmFsaWRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwibGFiZWxcIiwgWyhfdm0ubGFiZWwpID8gX3ZtLl9jKCdsYWJlbCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNvbnRyb2wtbGFiZWxcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmJlZm9yZSB8fCBfdm0uJHNsb3RzLmFmdGVyKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaW5wdXQtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJiZWZvcmVcIiksIF92bS5fdihcIiBcIiksIF92bS5fYyhfdm0udHlwZSA9PSAndGV4dGFyZWEnID8gX3ZtLnR5cGUgOiAnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgdGFnOiBcInRleHRhcmVhXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiY29sc1wiOiBfdm0uY29scyxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIFwibGlzdFwiOiBfdm0uaWRfZGF0YWxpc3QsXG5cdCAgICAgIFwibWF4XCI6IF92bS5hdHRyKF92bS5tYXgpLFxuXHQgICAgICBcIm1heGxlbmd0aFwiOiBfdm0ubWF4bGVuZ3RoLFxuXHQgICAgICBcIm1pblwiOiBfdm0uYXR0cihfdm0ubWluKSxcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJvd3NcIjogX3ZtLnJvd3MsXG5cdCAgICAgIFwic3RlcFwiOiBfdm0uc3RlcCxcblx0ICAgICAgXCJ0aXRsZVwiOiBfdm0uYXR0cihfdm0udGl0bGUpLFxuXHQgICAgICBcInR5cGVcIjogX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IG51bGwgOiBfdm0udHlwZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImZvY3VzXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImlucHV0XCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfSwgX3ZtLmVtaXRdLFxuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS50eXBlICE9ICd0ZXh0YXJlYScgJiYgX3ZtLmVudGVyU3VibWl0ICYmIF92bS5zdWJtaXQoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uY2xlYXJCdXR0b24gJiYgX3ZtLnZhbHVlKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgaWNvbjogX3ZtLmljb25cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbHVlID0gJydcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pY29uKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSwgWyhfdm0uaWNvbiAmJiBfdm0udmFsaWQgIT09IG51bGwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IFsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsaWQgPyAnb2snIDogJ3JlbW92ZScpXSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYWZ0ZXJcIildLCAyKSA6IFtfdm0uX2MoX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IF92bS50eXBlIDogJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIHRhZzogXCJ0ZXh0YXJlYVwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImNvbHNcIjogX3ZtLmNvbHMsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBcImxpc3RcIjogX3ZtLmlkX2RhdGFsaXN0LFxuXHQgICAgICBcIm1heFwiOiBfdm0uYXR0cihfdm0ubWF4KSxcblx0ICAgICAgXCJtYXhsZW5ndGhcIjogX3ZtLm1heGxlbmd0aCxcblx0ICAgICAgXCJtaW5cIjogX3ZtLmF0dHIoX3ZtLm1pbiksXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXIsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcInJlcXVpcmVkXCI6IF92bS5yZXF1aXJlZCxcblx0ICAgICAgXCJyb3dzXCI6IF92bS5yb3dzLFxuXHQgICAgICBcInN0ZXBcIjogX3ZtLnN0ZXAsXG5cdCAgICAgIFwidGl0bGVcIjogX3ZtLmF0dHIoX3ZtLnRpdGxlKSxcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlID09ICd0ZXh0YXJlYScgPyBudWxsIDogX3ZtLnR5cGVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0udmFsKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJmb2N1c1wiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJpbnB1dFwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH0sIF92bS5lbWl0XSxcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udHlwZSAhPSAndGV4dGFyZWEnICYmIF92bS5lbnRlclN1Ym1pdCAmJiBfdm0uc3VibWl0KClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9ICcnXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmljb24gJiYgX3ZtLnZhbGlkICE9PSBudWxsKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCAnZ2x5cGhpY29uLScgKyAoX3ZtLnZhbGlkID8gJ29rJyA6ICdyZW1vdmUnKV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKV0sIF92bS5fdihcIiBcIiksIChfdm0uaWRfZGF0YWxpc3QpID8gX3ZtLl9jKCdkYXRhbGlzdCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiaWRcIjogX3ZtLmlkX2RhdGFsaXN0XG5cdCAgICB9XG5cdCAgfSwgX3ZtLl9sKChfdm0ub3B0aW9ucyksIGZ1bmN0aW9uKG9wYykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnb3B0aW9uJywge1xuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidmFsdWVcIjogb3BjXG5cdCAgICAgIH1cblx0ICAgIH0pXG5cdCAgfSkpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uc2hvd0hlbHApID8gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoZWxwLWJsb2NrXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5mb2N1c1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWxwKSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLnNob3dFcnJvcikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmVycm9yVGV4dCkpXSkgOiBfdm0uX2UoKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY1MmFkN2I5XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcTW9kYWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWZlN2Q1ZGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1mZTdkNWRjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE1vZGFsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5tb2RhbCB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbn1cXG4ubW9kYWwuaW4ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjUpO1xcbn1cXG4ubW9kYWwuem9vbSAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdG9wOiAzMDBweDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4zcztcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzO1xcbn1cXG4ubW9kYWwuem9vbS5pbiAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgb3BhY2l0eTogMTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9Nb2RhbC52dWU/MWZkZDYyNjBcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXNHQTtFQUNBLDBCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0NBQ0E7QUFDQTtFQUNBLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSwwQkFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLDBCQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7RUFDQSx5QkFBQTtFQUNBLHdCQUFBO0VBQ0Esb0JBQUE7RUFDQSw2Q0FBQTtFQUNBLHFDQUFBO0VBQ0EsV0FBQTtDQUNBXCIsXCJmaWxlXCI6XCJNb2RhbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByb2xlPVxcXCJkaWFsb2dcXFwiIDpjbGFzcz1cXFwiWydtb2RhbCcsZWZmZWN0XVxcXCIgQGNsaWNrPVxcXCJiYWNrZHJvcCYmYWN0aW9uKGZhbHNlLDEpXFxcIiBAdHJhbnNpdGlvbmVuZD1cXFwidHJhbnNpdGlvbiA9IGZhbHNlXFxcIj5cXHJcXG4gICAgPGRpdiA6Y2xhc3M9XFxcIlsnbW9kYWwtZGlhbG9nJyx7J21vZGFsLWxnJzpsYXJnZSwnbW9kYWwtc20nOnNtYWxsfV1cXFwiIHJvbGU9XFxcImRvY3VtZW50XFxcIiA6c3R5bGU9XFxcInt3aWR0aDogb3B0aW9uYWxXaWR0aH1cXFwiIEBjbGljay5zdG9wPVxcXCJhY3Rpb24obnVsbClcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcImFjdGlvbihmYWxzZSwyKVxcXCI+PHNwYW4+JnRpbWVzOzwvc3Bhbj48L2J1dHRvbj5cXHJcXG4gICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj48c2xvdCBuYW1lPVxcXCJ0aXRsZVxcXCI+e3t0aXRsZX19PC9zbG90PjwvaDQ+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9zbG90PlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtYm9keVxcXCI+PGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+PHNsb3Q+PC9zbG90PjwvZGl2Pjwvc2xvdD5cXHJcXG4gICAgICAgIDxzbG90IG5hbWU9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIEBjbGljaz1cXFwiYWN0aW9uKGZhbHNlLDMpXFxcIj57eyBjYW5jZWxUZXh0IH19PC9idXR0b24+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwiYWN0aW9uKHRydWUsNClcXFwiPnt7IG9rVGV4dCB9fTwvYnV0dG9uPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgIDwvc2xvdD5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtnZXRTY3JvbGxCYXJXaWR0aH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBiYWNrZHJvcDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWV9LFxcclxcbiAgICBjYWxsYmFjazoge3R5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgY2FuY2VsVGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJ30sXFxyXFxuICAgIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxhcmdlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBva1RleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnfSxcXHJcXG4gICAgc21hbGw6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHRpdGxlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJ30sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWV9LFxcclxcbiAgICB3aWR0aDoge2RlZmF1bHQ6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgdHJhbnNpdGlvbjogZmFsc2UsXFxyXFxuICAgICAgdmFsOiBudWxsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBvcHRpb25hbFdpZHRoICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy53aWR0aCA9PT0gbnVsbCkge1xcclxcbiAgICAgICAgcmV0dXJuIG51bGxcXHJcXG4gICAgICB9IGVsc2UgaWYgKE51bWJlci5pc0ludGVnZXIodGhpcy53aWR0aCkpIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoICsgJ3B4J1xcclxcbiAgICAgIH1cXHJcXG4gICAgICByZXR1cm4gdGhpcy53aWR0aFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgdHJhbnNpdGlvbiAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSBvbGQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBjb25zdCBlbCA9IHRoaXMuJGVsXFxyXFxuICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHlcXHJcXG4gICAgICBpZiAodmFsKSB7Ly9zdGFydGluZ1xcclxcbiAgICAgICAgaWYgKHRoaXMudmFsKSB7XFxyXFxuICAgICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1jb250ZW50JykuZm9jdXMoKVxcclxcbiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xcclxcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGVsLmNsYXNzTGlzdC5hZGQoJ2luJyksIDApXFxyXFxuICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICAgIGlmIChnZXRTY3JvbGxCYXJXaWR0aCgpICE9PSAwKSB7XFxyXFxuICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBnZXRTY3JvbGxCYXJXaWR0aCgpICsgJ3B4J1xcclxcbiAgICAgICAgICB9XFxyXFxuICAgICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpbicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfSBlbHNlIHsvL2VuZGluZ1xcclxcbiAgICAgICAgdGhpcy4kZW1pdCh0aGlzLnZhbCA/ICdvcGVuZWQnIDogJ2Nsb3NlZCcpXFxyXFxuICAgICAgICBpZiAoIXRoaXMudmFsKSB7XFxyXFxuICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcXHJcXG4gICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsXFxyXFxuICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB2YWwgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgaWYgKG9sZCA9PT0gbnVsbCA/IHZhbCA9PT0gdHJ1ZSA6IHZhbCAhPT0gb2xkKSB0aGlzLnRyYW5zaXRpb24gPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgYWN0aW9uICh2YWwscCkge1xcclxcbiAgICAgIGlmICh2YWwgPT09IG51bGwpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBpZiAodmFsICYmIHRoaXMuY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbikgdGhpcy5jYWxsYmFjaygpXFxyXFxuICAgICAgdGhpcy4kZW1pdCh2YWwgPyAnb2snIDogJ2NhbmNlbCcscClcXHJcXG4gICAgICB0aGlzLnZhbCA9IHZhbCB8fCBmYWxzZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMudmFsID0gdGhpcy52YWx1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG48c3R5bGU+XFxyXFxuLm1vZGFsIHtcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxufVxcclxcbi5tb2RhbC5pbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7XFxyXFxufVxcclxcbi5tb2RhbC56b29tIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0b3A6IDMwMHB4O1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxuICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxufVxcclxcbi5tb2RhbC56b29tLmluIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICBvcGFjaXR5OiAxO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfaXNJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjMpO1xuXHRcblx0dmFyIF9pc0ludGVnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJbnRlZ2VyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJhY2tkcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGNhbGxiYWNrOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjYW5jZWxUZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJyB9LFxuXHQgICAgZWZmZWN0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFyZ2U6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG9rVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnIH0sXG5cdCAgICBzbWFsbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHRyYW5zaXRpb246IGZhbHNlLFxuXHQgICAgICB2YWw6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIG9wdGlvbmFsV2lkdGg6IGZ1bmN0aW9uIG9wdGlvbmFsV2lkdGgoKSB7XG5cdCAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgIH0gZWxzZSBpZiAoKDAsIF9pc0ludGVnZXIyLmRlZmF1bHQpKHRoaXMud2lkdGgpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24odmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCA9PT0gb2xkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIGlmICh2YWwpIHtcblx0ICAgICAgICAvL3N0YXJ0aW5nXG5cdCAgICAgICAgaWYgKHRoaXMudmFsKSB7XG5cdCAgICAgICAgICBlbC5xdWVyeVNlbGVjdG9yKCcubW9kYWwtY29udGVudCcpLmZvY3VzKCk7XG5cdCAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0ICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZWwuY2xhc3NMaXN0LmFkZCgnaW4nKTtcblx0ICAgICAgICAgIH0sIDApO1xuXHQgICAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgICBpZiAoKDAsIF91dGlscy5nZXRTY3JvbGxCYXJXaWR0aCkoKSAhPT0gMCkge1xuXHQgICAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCkgKyAncHgnO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpbicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAvL2VuZGluZ1xuXHQgICAgICAgIHRoaXMuJGVtaXQodGhpcy52YWwgPyAnb3BlbmVkJyA6ICdjbG9zZWQnKTtcblx0ICAgICAgICBpZiAoIXRoaXMudmFsKSB7XG5cdCAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHQgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsO1xuXHQgICAgICAgICAgYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICAgIGlmIChvbGQgPT09IG51bGwgPyBfdmFsID09PSB0cnVlIDogX3ZhbCAhPT0gb2xkKSB0aGlzLnRyYW5zaXRpb24gPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMudmFsID0gdmFsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYWN0aW9uOiBmdW5jdGlvbiBhY3Rpb24odmFsLCBwKSB7XG5cdCAgICAgIGlmICh2YWwgPT09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbCAmJiB0aGlzLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHRoaXMuY2FsbGJhY2soKTtcblx0ICAgICAgdGhpcy4kZW1pdCh2YWwgPyAnb2snIDogJ2NhbmNlbCcsIHApO1xuXHQgICAgICB0aGlzLnZhbCA9IHZhbCB8fCBmYWxzZTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTIzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMTI0KSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMTI0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5OdW1iZXIuaXNJbnRlZ2VyO1xuXG4vKioqLyB9LFxuLyogMTI1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7aXNJbnRlZ2VyOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNil9KTtcblxuLyoqKi8gfSxcbi8qIDEyNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpXG5cdCAgLCBmbG9vciAgICA9IE1hdGguZmxvb3I7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KXtcblx0ICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEyNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydtb2RhbCcsIF92bS5lZmZlY3RdLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwiZGlhbG9nXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5iYWNrZHJvcCAmJiBfdm0uYWN0aW9uKGZhbHNlLCAxKVxuXHQgICAgICB9LFxuXHQgICAgICBcInRyYW5zaXRpb25lbmRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnRyYW5zaXRpb24gPSBmYWxzZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsnbW9kYWwtZGlhbG9nJywge1xuXHQgICAgICAnbW9kYWwtbGcnOiBfdm0ubGFyZ2UsXG5cdCAgICAgICdtb2RhbC1zbSc6IF92bS5zbWFsbFxuXHQgICAgfV0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS5vcHRpb25hbFdpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRvY3VtZW50XCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICBfdm0uYWN0aW9uKG51bGwpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1jb250ZW50XCJcblx0ICB9LCBbX3ZtLl90KFwibW9kYWwtaGVhZGVyXCIsIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uYWN0aW9uKGZhbHNlLCAyKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnaDQnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcInRpdGxlXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXSldLCAyKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fdChcIm1vZGFsLWJvZHlcIiwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibW9kYWwtYm9keVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJtb2RhbC1mb290ZXJcIiwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibW9kYWwtZm9vdGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4gYnRuLWRlZmF1bHRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uYWN0aW9uKGZhbHNlLCAzKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmNhbmNlbFRleHQpKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJ0biBidG4tcHJpbWFyeVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5hY3Rpb24odHJ1ZSwgNClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5va1RleHQpKV0pXSldKV0sIDIpXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mZTdkNWRjOFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEyOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXE5hdmJhci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzhmMDYxOWVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTM4ZjA2MTllXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gTmF2YmFyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdkZWZhdWx0JyB9LFxuXHQgICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfSxcblx0ICAgIGNvbnRhaW5lcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpZDogJ2JzLWV4YW1wbGUtbmF2YmFyLWNvbGxhcHNlLTEnLFxuXHQgICAgICBjb2xsYXBzZWQ6IHRydWUsXG5cdCAgICAgIHN0eWxlczoge31cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHNsb3RzOiBmdW5jdGlvbiBzbG90cygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3Nsb3RDb250ZW50cztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZUNvbGxhcHNlOiBmdW5jdGlvbiB0b2dnbGVDb2xsYXBzZShlKSB7XG5cdCAgICAgIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9uYXZiYXIgPSB0cnVlO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgdHJ5IHtcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgJGRyb3Bkb3duID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bj5bZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsIF90aGlzLiRlbCkucGFyZW50KCk7XG5cdCAgICAgICAgaWYgKCRkcm9wZG93bikge1xuXHQgICAgICAgICAgJGRyb3Bkb3duLm9uKCdjbGljaycsICcuZHJvcGRvd24tdG9nZ2xlJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub24oJ2NsaWNrJywgJy5kcm9wZG93bi1tZW51PmxpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub25CbHVyKGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgICRkcm9wZG93bi5lYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG5cdCAgICAgICAgICAgICAgaWYgKCFjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KSgpO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGZpbmRpbmcgZHJvcGRvd24nKTtcblx0ICAgIH1cblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub24oJ2NsaWNrIHRvdWNoc3RhcnQnLCAnbGk6bm90KC5kcm9wZG93bik+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIF90aGlzLmNvbGxhcHNlZCA9IHRydWU7XG5cdCAgICAgIH0sIDIwMCk7XG5cdCAgICB9KS5vbkJsdXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCFfdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKSB7XG5cdCAgICAgICAgX3RoaXMuY29sbGFwc2VkID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICB2YXIgaGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0O1xuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAndG9wJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdUb3AgPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZUNvbGxhcHNlKGUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bicsIHRoaXMuJGVsKS5vZmYoJ2NsaWNrJykub2ZmQmx1cigpO1xuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub2ZmKCdjbGljaycpO1xuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXInLCAnbmF2YmFyLScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudCA9PT0gJ3N0YXRpYycgPyAnbmF2YmFyLXN0YXRpYy10b3AnIDogJ25hdmJhci1maXhlZC0nICsgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogX3ZtLmNvbnRhaW5lciA9PT0gJ2ZsdWlkJyA/ICdjb250YWluZXItZmx1aWQnIDogJ2NvbnRhaW5lcidcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXZiYXItaGVhZGVyXCJcblx0ICB9LCBbKCFfdm0uJHNsb3RzLmNvbGxhcHNlKSA/IF92bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2YmFyLXRvZ2dsZSBjb2xsYXBzZWRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiLFxuXHQgICAgICBcImFyaWEtZXhwYW5kZWRcIjogXCJmYWxzZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlQ29sbGFwc2Vcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Itb25seVwiXG5cdCAgfSwgW192bS5fdihcIlRvZ2dsZSBuYXZpZ2F0aW9uXCIpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24tYmFyXCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbi1iYXJcIlxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uLWJhclwiXG5cdCAgfSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJjb2xsYXBzZVwiKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYnJhbmRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXItY29sbGFwc2UnLCB7XG5cdCAgICAgIGNvbGxhcHNlOiBfdm0uY29sbGFwc2VkXG5cdCAgICB9XVxuXHQgIH0sIFtfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2IG5hdmJhci1uYXZcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmxlZnQpID8gX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdiBuYXZiYXItbmF2IG5hdmJhci1sZWZ0XCJcblx0ICB9LCBbX3ZtLl90KFwibGVmdFwiKV0sIDIpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLnJpZ2h0KSA/IF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXYgbmF2YmFyLW5hdiBuYXZiYXItcmlnaHRcIlxuXHQgIH0sIFtfdm0uX3QoXCJyaWdodFwiKV0sIDIpIDogX3ZtLl9lKCldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzhmMDYxOWVcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxPcHRpb24udnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQyMDg4MTE2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00MjA4ODExNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE9wdGlvbi52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7IHZhbHVlOiBudWxsIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7IGxvYWRpbmc6IHRydWUgfTtcblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAodGhpcy4kcGFyZW50Ll9zZWxlY3QpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRwYXJlbnQub3B0aW9ucykge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC5vcHRpb25zID0gW107XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGVsID0ge307XG5cdCAgICAgIGVsW3RoaXMuJHBhcmVudC5vcHRpb25zTGFiZWxdID0gdGhpcy4kZWwuaW5uZXJIVE1MO1xuXHQgICAgICBlbFt0aGlzLiRwYXJlbnQub3B0aW9uc1ZhbHVlXSA9IHRoaXMudmFsdWU7XG5cdCAgICAgIHRoaXMuJHBhcmVudC5vcHRpb25zLnB1c2goZWwpO1xuXHQgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnNvbGUud2Fybignb3B0aW9ucyBvbmx5IHdvcmsgaW5zaWRlIGEgc2VsZWN0IGNvbXBvbmVudCcpO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gKF92bS5sb2FkaW5nKSA/IF92bS5fYygnbGknLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpIDogX3ZtLl9lKClcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDIwODgxMTZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTM1KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTM3KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzOClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQYW5lbC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWIxZTA0NjFhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUGFuZWwudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTM1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzYpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWIxZTA0NjFhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9QYW5lbC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWIxZTA0NjFhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9QYW5lbC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjY29yZGlvbi10b2dnbGUge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uY29sbGFwc2UtZW50ZXItYWN0aXZlLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIC41cyBlYXNlO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuLmNvbGxhcHNlLWVudGVyLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcbn1cXHJcXG5cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1BhbmVsLnZ1ZT82MGU3OThlMlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBeUVBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBOztFQUVBLHlCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBOztDQUdBXCIsXCJmaWxlXCI6XCJQYW5lbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiA6Y2xhc3M9XFxcIlsncGFuZWwnLHBhbmVsVHlwZV1cXFwiPlxcclxcbiAgICA8ZGl2IDpjbGFzcz1cXFwiWydwYW5lbC1oZWFkaW5nJyx7J2FjY29yZGlvbi10b2dnbGUnOmluQWNjb3JkaW9ufV1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJpbkFjY29yZGlvbiYmdG9nZ2xlKClcXFwiPlxcclxcbiAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGg0IGNsYXNzPVxcXCJwYW5lbC10aXRsZVxcXCI+e3sgaGVhZGVyIH19PC9oND48L3Nsb3Q+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8dHJhbnNpdGlvblxcclxcbiAgICAgIG5hbWU9XFxcImNvbGxhcHNlXFxcIlxcclxcbiAgICAgIEBlbnRlcj1cXFwiZW50ZXJcXFwiXFxyXFxuICAgICAgQGFmdGVyLWVudGVyPVxcXCJhZnRlckVudGVyXFxcIlxcclxcbiAgICAgIEBiZWZvcmUtbGVhdmU9XFxcImJlZm9yZUxlYXZlXFxcIlxcclxcbiAgICA+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtY29sbGFwc2VcXFwiIHYtaWY9XFxcIm9wZW5cXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtYm9keVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L3RyYW5zaXRpb24+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgaGVhZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgaXNPcGVuOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQgOiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgb3BlbjogdGhpcy5pc09wZW5cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGlzT3BlbiggdmFsICkge1xcclxcbiAgICAgIHRoaXMub3BlbiA9IHZhbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgaW5BY2NvcmRpb24gKCkgeyByZXR1cm4gdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5faXNBY2NvcmRpb24gfSxcXHJcXG4gICAgcGFuZWxUeXBlICgpIHsgcmV0dXJuICdwYW5lbC0nICsgKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSB8fCAnZGVmYXVsdCcpIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gIXRoaXMub3BlblxcclxcbiAgICAgIGlmICh0aGlzLmluQWNjb3JkaW9uKSB7XFxyXFxuICAgICAgICB0aGlzLiRwYXJlbnQub3BlbkNoaWxkKHRoaXMpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBlbnRlciAoZWwpIHtcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0bydcXHJcXG4gICAgICB2YXIgZW5kV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKGVsKS5oZWlnaHRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnMHB4J1xcclxcbiAgICAgIGVsLm9mZnNldEhlaWdodCAvLyBmb3JjZSByZXBhaW50XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZW5kV2lkdGg7XFxyXFxuICAgIH0sXFxyXFxuICAgIGFmdGVyRW50ZXIgKGVsKSB7XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXFxyXFxuICAgIH0sXFxyXFxuICAgIGJlZm9yZUxlYXZlIChlbCkge1xcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodFxcclxcbiAgICAgIGVsLm9mZnNldEhlaWdodCAvLyBmb3JjZSByZXBhaW50XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCdcXHJcXG4gICAgfSxcXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaXNPcGVuID09PSBudWxsKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gIXRoaXMuaW5BY2NvcmRpb25cXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmFjY29yZGlvbi10b2dnbGUge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG4uY29sbGFwc2UtZW50ZXItYWN0aXZlLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIC41cyBlYXNlO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG59XFxyXFxuLmNvbGxhcHNlLWVudGVyLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTM3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgaGVhZGVyOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgaXNPcGVuOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBvcGVuOiB0aGlzLmlzT3BlblxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICB3YXRjaDoge1xuXHQgICAgaXNPcGVuOiBmdW5jdGlvbiBpc09wZW4odmFsKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBpbkFjY29yZGlvbjogZnVuY3Rpb24gaW5BY2NvcmRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50Ll9pc0FjY29yZGlvbjtcblx0ICAgIH0sXG5cdCAgICBwYW5lbFR5cGU6IGZ1bmN0aW9uIHBhbmVsVHlwZSgpIHtcblx0ICAgICAgcmV0dXJuICdwYW5lbC0nICsgKHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLm9wZW4gPSAhdGhpcy5vcGVuO1xuXHQgICAgICBpZiAodGhpcy5pbkFjY29yZGlvbikge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC5vcGVuQ2hpbGQodGhpcyk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBlbnRlcjogZnVuY3Rpb24gZW50ZXIoZWwpIHtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuXHQgICAgICB2YXIgZW5kV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKGVsKS5oZWlnaHQ7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuXHQgICAgICBlbC5vZmZzZXRIZWlnaHQ7IC8vIGZvcmNlIHJlcGFpbnRcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZW5kV2lkdGg7XG5cdCAgICB9LFxuXHQgICAgYWZ0ZXJFbnRlcjogZnVuY3Rpb24gYWZ0ZXJFbnRlcihlbCkge1xuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG5cdCAgICB9LFxuXHQgICAgYmVmb3JlTGVhdmU6IGZ1bmN0aW9uIGJlZm9yZUxlYXZlKGVsKSB7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodDtcblx0ICAgICAgZWwub2Zmc2V0SGVpZ2h0OyAvLyBmb3JjZSByZXBhaW50XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIGlmICh0aGlzLmlzT3BlbiA9PT0gbnVsbCkge1xuXHQgICAgICB0aGlzLm9wZW4gPSAhdGhpcy5pbkFjY29yZGlvbjtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncGFuZWwnLCBfdm0ucGFuZWxUeXBlXVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiBbJ3BhbmVsLWhlYWRpbmcnLCB7XG5cdCAgICAgICdhY2NvcmRpb24tdG9nZ2xlJzogX3ZtLmluQWNjb3JkaW9uXG5cdCAgICB9XSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLmluQWNjb3JkaW9uICYmIF92bS50b2dnbGUoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdoNCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLXRpdGxlXCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0uaGVhZGVyKSldKV0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImNvbGxhcHNlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImVudGVyXCI6IF92bS5lbnRlcixcblx0ICAgICAgXCJhZnRlci1lbnRlclwiOiBfdm0uYWZ0ZXJFbnRlcixcblx0ICAgICAgXCJiZWZvcmUtbGVhdmVcIjogX3ZtLmJlZm9yZUxlYXZlXG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ub3BlbikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWNvbGxhcHNlXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJwYW5lbC1ib2R5XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTQwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0NClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQb3BvdmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0yNDY1YmY1NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMjQ2NWJmNTRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQb3BvdmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE0MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0yNDY1YmY1NCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vUG9wb3Zlci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTI0NjViZjU0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Qb3BvdmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4ucG9wb3Zlci50b3AsXFxyXFxuLnBvcG92ZXIubGVmdCxcXHJcXG4ucG9wb3Zlci5yaWdodCxcXHJcXG4ucG9wb3Zlci5ib3R0b20ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcbi5zY2FsZS1lbnRlciB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtaW4gMC4xNXMgZWFzZS1pbjtcXG59XFxuLnNjYWxlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtb3V0IDAuMTVzIGVhc2Utb3V0O1xcbn1cXG5Aa2V5ZnJhbWVzIHNjYWxlLWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzY2FsZS1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1BvcG92ZXIudnVlP2U2MTY5NjNhXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF5QkE7Ozs7RUFJQSxlQUFBO0NBQ0E7QUFDQTtFQUNBLGlDQUFBO0NBQ0E7QUFDQTtFQUNBLG1DQUFBO0NBQ0E7QUFDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLG9CQUFBO0lBQ0EsV0FBQTtDQUNBO0NBQ0E7QUFDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLG9CQUFBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlBvcG92ZXIudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWydwb3BvdmVyJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImFycm93XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxoMyBjbGFzcz1cXFwicG9wb3Zlci10aXRsZVxcXCIgdi1pZj1cXFwidGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcInRpdGxlXFxcIj57e3RpdGxlfX08L3Nsb3Q+PC9oMz5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInBvcG92ZXItY29udGVudFxcXCI+PHNsb3QgbmFtZT1cXFwiY29udGVudFxcXCI+PHNwYW4gdi1odG1sPVxcXCJjb250ZW50XFxcIj48L3NwYW4+PC9zbG90PjwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L3RyYW5zaXRpb24+XFxyXFxuICA8L3NwYW4+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCBQb3BvdmVyTWl4aW4gZnJvbSAnLi91dGlscy9wb3BvdmVyTWl4aW5zLmpzJ1xcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIG1peGluczogW1BvcG92ZXJNaXhpbl0sXFxyXFxuICBwcm9wczoge1xcclxcbiAgICB0cmlnZ2VyOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLnBvcG92ZXIudG9wLFxcclxcbi5wb3BvdmVyLmxlZnQsXFxyXFxuLnBvcG92ZXIucmlnaHQsXFxyXFxuLnBvcG92ZXIuYm90dG9tIHtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbn1cXHJcXG4uc2NhbGUtZW50ZXIge1xcclxcbiAgYW5pbWF0aW9uOnNjYWxlLWluIDAuMTVzIGVhc2UtaW47XFxyXFxufVxcclxcbi5zY2FsZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNjYWxlLW91dCAwLjE1cyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzY2FsZS1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzY2FsZS1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9wb3BvdmVyTWl4aW5zID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDMpO1xuXHRcblx0dmFyIF9wb3BvdmVyTWl4aW5zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BvcG92ZXJNaXhpbnMpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBtaXhpbnM6IFtfcG9wb3Zlck1peGluczIuZGVmYXVsdF0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxNDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGNvbnRlbnQ6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZmFkZScgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndG9wJyB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgdG9wOiAwLFxuXHQgICAgICBsZWZ0OiAwLFxuXHQgICAgICBzaG93OiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgZXZlbnRzOiBmdW5jdGlvbiBldmVudHMoKSB7XG5cdCAgICAgIHJldHVybiB7IGNvbnRleHRtZW51OiBbJ2NvbnRleHRtZW51J10sIGhvdmVyOiBbJ21vdXNlbGVhdmUnLCAnbW91c2VlbnRlciddLCBmb2N1czogWydibHVyJywgJ2ZvY3VzJ10gfVt0aGlzLnRyaWdnZXJdIHx8IFsnY2xpY2snXTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJlZm9yZUVudGVyOiBmdW5jdGlvbiBiZWZvcmVFbnRlcigpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMucG9zaXRpb24oKTtcblx0ICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIF90aGlzLnBvc2l0aW9uKCk7XG5cdCAgICAgIH0sIDMwKTtcblx0ICAgIH0sXG5cdCAgICBwb3NpdGlvbjogZnVuY3Rpb24gcG9zaXRpb24oKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBwb3BvdmVyID0gX3RoaXMyLiRyZWZzLnBvcG92ZXI7XG5cdCAgICAgICAgdmFyIHRyaWdnZXIgPSBfdGhpczIuJHJlZnMudHJpZ2dlci5jaGlsZHJlblswXTtcblx0ICAgICAgICBzd2l0Y2ggKF90aGlzMi5wbGFjZW1lbnQpIHtcblx0ICAgICAgICAgIGNhc2UgJ3RvcCc6XG5cdCAgICAgICAgICAgIF90aGlzMi5sZWZ0ID0gdHJpZ2dlci5vZmZzZXRMZWZ0IC0gcG9wb3Zlci5vZmZzZXRXaWR0aCAvIDIgKyB0cmlnZ2VyLm9mZnNldFdpZHRoIC8gMjtcblx0ICAgICAgICAgICAgX3RoaXMyLnRvcCA9IHRyaWdnZXIub2Zmc2V0VG9wIC0gcG9wb3Zlci5vZmZzZXRIZWlnaHQ7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAnbGVmdCc6XG5cdCAgICAgICAgICAgIF90aGlzMi5sZWZ0ID0gdHJpZ2dlci5vZmZzZXRMZWZ0IC0gcG9wb3Zlci5vZmZzZXRXaWR0aDtcblx0ICAgICAgICAgICAgX3RoaXMyLnRvcCA9IHRyaWdnZXIub2Zmc2V0VG9wICsgdHJpZ2dlci5vZmZzZXRIZWlnaHQgLyAyIC0gcG9wb3Zlci5vZmZzZXRIZWlnaHQgLyAyO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgJ3JpZ2h0Jzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgKyB0cmlnZ2VyLm9mZnNldFdpZHRoO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodCAvIDIgLSBwb3BvdmVyLm9mZnNldEhlaWdodCAvIDI7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAnYm90dG9tJzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoIC8gMiArIHRyaWdnZXIub2Zmc2V0V2lkdGggLyAyO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodDtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1dyb25nIHBsYWNlbWVudCBwcm9wJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHBvcG92ZXIuc3R5bGUudG9wID0gX3RoaXMyLnRvcCArICdweCc7XG5cdCAgICAgICAgcG9wb3Zlci5zdHlsZS5sZWZ0ID0gX3RoaXMyLmxlZnQgKyAncHgnO1xuXHQgICAgICB9KTtcblx0ICAgIH0sXG5cdCAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZShlKSB7XG5cdCAgICAgIGlmIChlICYmIHRoaXMudHJpZ2dlciA9PT0gJ2NvbnRleHRtZW51JykgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICBpZiAodGhpcy5zaG93KSB0aGlzLmJlZm9yZUVudGVyKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cdFxuXHQgICAgdmFyIHRyaWdnZXIgPSB0aGlzLiRyZWZzLnRyaWdnZXIuY2hpbGRyZW5bMF07XG5cdCAgICBpZiAoIXRyaWdnZXIpIHJldHVybiBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgZmluZCB0cmlnZ2VyIHYtZWwgaW4geW91ciBjb21wb25lbnQgdGhhdCB1c2VzIHBvcG92ZXJNaXhpbi4nKTtcblx0XG5cdCAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnICYmICF+dHJpZ2dlci50YWJJbmRleCkge1xuXHQgICAgICB0cmlnZ2VyID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJ2EsaW5wdXQsc2VsZWN0LHRleHRhcmVhLGJ1dHRvbicsIHRyaWdnZXIpO1xuXHQgICAgICBpZiAoIXRyaWdnZXIubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0cmlnZ2VyKS5vbihldmVudCwgX3RoaXMzLnRvZ2dsZSk7XG5cdCAgICB9KTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fdHJpZ2dlcikgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fdHJpZ2dlcikub2ZmKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTQ0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWydwb3BvdmVyJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhcnJvd1wiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0udGl0bGUpID8gX3ZtLl9jKCdoMycsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBvcG92ZXItdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3QoXCJ0aXRsZVwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJwb3BvdmVyLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJjb250ZW50XCIsIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMjQ2NWJmNTRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ2KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0Nylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQcm9ncmVzc2Jhci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNjhhYTMzNzVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTY4YWEzMzc1XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUHJvZ3Jlc3NiYXIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQ2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYW5pbWF0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhYmVsOiB7IGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBub3c6IHsgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHN0cmlwZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBsYWJlbEJvb2w6IGZ1bmN0aW9uIGxhYmVsQm9vbCgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLmxhYmVsKTtcblx0ICAgIH0sXG5cdCAgICBub3dOdW06IGZ1bmN0aW9uIG5vd051bSgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UubnVtYmVyKHRoaXMubm93KTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxNDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncHJvZ3Jlc3MtYmFyJywgJ3Byb2dyZXNzLWJhci0nICsgX3ZtLnR5cGUsIHtcblx0ICAgICAgYWN0aXZlOiBfdm0uYW5pbWF0ZWQsXG5cdCAgICAgICdwcm9ncmVzcy1iYXItc3RyaXBlZCc6IF92bS5zdHJpcGVkXG5cdCAgICB9XSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLm5vd051bSArICclJ1xuXHQgICAgfSksXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInRleHRDb250ZW50XCI6IF92bS5fcyhfdm0ubGFiZWxCb29sID8gX3ZtLm5vd051bSArICclJyA6IG51bGwpXG5cdCAgICB9XG5cdCAgfSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNjhhYTMzNzVcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTQ5KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUxKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Milcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxSYWRpby52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzRjZmQ5MmNcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTc0Y2ZkOTJjXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUmFkaW8udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQ5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTApO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTc0Y2ZkOTJjIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9SYWRpby52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTc0Y2ZkOTJjIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9SYWRpby52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnJhZGlvIHsgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0IHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjE1cmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuN3JlbTtcXHJcXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxyXFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZC1zaXplOiA1MCUgNTAlO1xcbn1cXG4ucmFkaW86bm90KC5hY3RpdmUpID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2JiYjtcXG59XFxuLnJhZGlvID4gbGFiZWwgPiBpbnB1dDpmb2N1cyB+IC5pY29uIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjNjZhZmU5O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxuLnJhZGlvLmFjdGl2ZSA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1zaXplOiAxcmVtIDFyZW07XFxyXFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p4emRtY2dkbVZ5YzJsdmJqMGlNUzR4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpUGp4amFYSmpiR1VnWTNnOUlqVWlJR041UFNJMUlpQnlQU0kwSWlCbWFXeHNQU0lqWm1abUlpOCtQQzl6ZG1jKyk7XFxufVxcbi5yYWRpby5hY3RpdmUgLmJ0bi1kZWZhdWx0IHsgZmlsdGVyOiBicmlnaHRuZXNzKDc1JSk7XFxufVxcbi5yYWRpby5kaXNhYmxlZCA+IGxhYmVsID4gLmljb24sXFxyXFxuLnJhZGlvLnJlYWRvbmx5ID4gbGFiZWwgPiAuaWNvbixcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcbn1cXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPXJhZGlvXSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUmFkaW8udnVlPzExNjI0YzQ4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUE4R0EsU0FBQSxtQkFBQTtDQUFBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLFVBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLFlBQUE7RUFDQSxRQUFBO0VBQ0EsZUFBQTtFQUNBLGNBQUE7RUFDQSxlQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtFQUNBLHFCQUFBO0VBQ0EsNkJBQUE7RUFDQSxtQ0FBQTtFQUNBLHlCQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLDBCQUFBO0VBQ0EsMEVBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7RUFDQSw4T0FBQTtDQUNBO0FBQ0EsNkJBQUEsd0JBQUE7Q0FBQTtBQUVBOzs7RUFHQSwwQkFBQTtFQUNBLGlCQUFBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiUmFkaW8udnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgOmlzPVxcXCJidXR0b25TdHlsZT8nbGFiZWwnOidkaXYnXFxcIiBAY2xpY2sucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICA6Y2xhc3M9XFxcIlsoYnV0dG9uU3R5bGU/J2J0biBidG4tJyt0eXBlQ29sb3I6J3JhZGlvICcrdHlwZUNvbG9yKSx7YWN0aXZlOmFjdGl2ZSxkaXNhYmxlZDpkaXNhYmxlZCxyZWFkb25seTpyZWFkb25seX1dXFxcIlxcclxcbiAgPlxcclxcbiAgICA8dGVtcGxhdGUgdi1pZj1cXFwiYnV0dG9uU3R5bGVcXFwiPlxcclxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJyYWRpb1xcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICB2LXNob3c9XFxcIiFyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcImNoZWNrXFxcIlxcclxcbiAgICAgICAgOnZhbHVlPVxcXCJzZWxlY3RlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPGxhYmVsIHYtZWxzZSBjbGFzcz1cXFwib3BlblxcXCI+XFxyXFxuICAgICAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcImNoZWNrXFxcIlxcclxcbiAgICAgICAgOnZhbHVlPVxcXCJzZWxlY3RlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbYWN0aXZlPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiYWN0aXZlJiZ0eXBlQ29sb3I9PT0nZGVmYXVsdCdcXFwiIGNsYXNzPVxcXCJpY29uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2xhYmVsPlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgc2VsZWN0ZWRWYWx1ZToge2RlZmF1bHQ6IHRydWV9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBmYWxzZX1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjaGVjazogdGhpcy52YWx1ZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgYWN0aXZlICgpIHsgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZSB9LFxcclxcbiAgICBpbkdyb3VwICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuYnRuR3JvdXAgJiYgIXRoaXMuJHBhcmVudC5fY2hlY2tib3hHcm91cCB9LFxcclxcbiAgICBwYXJlbnRWYWx1ZSAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQudmFsIH0sXFxyXFxuICAgIGJ1dHRvblN0eWxlICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LmJ0bkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICB0eXBlQ29sb3IgKCkgeyByZXR1cm4gKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSkgfHwgJ2RlZmF1bHQnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjaGVjayAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdmFsKSB7XFxyXFxuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB0cnVlKVxcclxcbiAgICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHZhbCkge1xcclxcbiAgICAgICAgdGhpcy5jaGVjayA9IHZhbFxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmNoZWNrID0gZmFsc2VcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnRcXHJcXG4gICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlXFxyXFxuICAgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgdXBkYXRlRnJvbVBhcmVudCgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XFxyXFxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHRoaXMuJHBhcmVudC52YWwpIHtcXHJcXG4gICAgICAgICAgdGhpcy5jaGVjayA9IHRoaXMuc2VsZWN0ZWRWYWx1ZVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgdGhpcy5jaGVjayA9IGZhbHNlXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB1cGRhdGVQYXJlbnQoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdGhpcy5jaGVjaykge1xcclxcbiAgICAgICAgICB0aGlzLiRwYXJlbnQudmFsID0gdGhpcy5zZWxlY3RlZFZhbHVlXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBmb2N1cyAoKSB7XFxyXFxuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICB0aGlzLmZvY3VzKClcXHJcXG4gICAgICBpZiAodGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLnNlbGVjdGVkVmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGU+XFxyXFxuLnJhZGlvIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9XFxyXFxuLnJhZGlvID4gbGFiZWwgPiBpbnB1dCB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHotaW5kZXg6IC0xO1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuLnJhZGlvID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4xNXJlbTtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAxLjRyZW07XFxyXFxuICBoZWlnaHQ6IDEuNHJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjdyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXHJcXG59XFxyXFxuLnJhZGlvOm5vdCguYWN0aXZlKSA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxyXFxufVxcclxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbiB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzY2YWZlOTtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxyXFxufVxcclxcbi5yYWRpby5hY3RpdmUgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZG1WeWMybHZiajBpTVM0eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaVBqeGphWEpqYkdVZ1kzZzlJalVpSUdONVBTSTFJaUJ5UFNJMElpQm1hV3hzUFNJalptWm1JaTgrUEM5emRtYyspO1xcclxcbn1cXHJcXG4ucmFkaW8uYWN0aXZlIC5idG4tZGVmYXVsdCB7IGZpbHRlcjogYnJpZ2h0bmVzcyg3NSUpOyB9XFxyXFxuXFxyXFxuLnJhZGlvLmRpc2FibGVkID4gbGFiZWwgPiAuaWNvbixcXHJcXG4ucmFkaW8ucmVhZG9ubHkgPiBsYWJlbCA+IC5pY29uLFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxyXFxufVxcclxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9cmFkaW9dIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE1MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2VsZWN0ZWRWYWx1ZTogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcblx0ICAgIH0sXG5cdCAgICBpbkdyb3VwOiBmdW5jdGlvbiBpbkdyb3VwKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiAhdGhpcy4kcGFyZW50Ll9jaGVja2JveEdyb3VwO1xuXHQgICAgfSxcblx0ICAgIHBhcmVudFZhbHVlOiBmdW5jdGlvbiBwYXJlbnRWYWx1ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWw7XG5cdCAgICB9LFxuXHQgICAgYnV0dG9uU3R5bGU6IGZ1bmN0aW9uIGJ1dHRvblN0eWxlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICB0eXBlQ29sb3I6IGZ1bmN0aW9uIHR5cGVDb2xvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIGNoZWNrOiBmdW5jdGlvbiBjaGVjayh2YWwpIHtcblx0ICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB0cnVlKTtcblx0ICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudCgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLnVwZGF0ZUZyb21QYXJlbnQoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWUgPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy5jaGVjayA9IHZhbDtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmNoZWNrID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICBpZiAodGhpcy5pbkdyb3VwKSB7XG5cdCAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICAgIHBhcmVudC5fcmFkaW9Hcm91cCA9IHRydWU7XG5cdCAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHVwZGF0ZUZyb21QYXJlbnQ6IGZ1bmN0aW9uIHVwZGF0ZUZyb21QYXJlbnQoKSB7XG5cdCAgICAgIGlmICh0aGlzLmluR3JvdXApIHtcblx0ICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHRoaXMuJHBhcmVudC52YWwpIHtcblx0ICAgICAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLnNlbGVjdGVkVmFsdWU7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuY2hlY2sgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB1cGRhdGVQYXJlbnQ6IGZ1bmN0aW9uIHVwZGF0ZVBhcmVudCgpIHtcblx0ICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWUgPT09IHRoaXMuY2hlY2spIHtcblx0ICAgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB0aGlzLnNlbGVjdGVkVmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZm9jdXMoKTtcblx0ICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5jaGVjayA9IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uYnV0dG9uU3R5bGUgPyAnbGFiZWwnIDogJ2RpdicsIHtcblx0ICAgIHRhZzogXCJkaXZcIixcblx0ICAgIGNsYXNzOiBbKF92bS5idXR0b25TdHlsZSA/ICdidG4gYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJ3JhZGlvICcgKyBfdm0udHlwZUNvbG9yKSwge1xuXHQgICAgICBhY3RpdmU6IF92bS5hY3RpdmUsXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHlcblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFsoX3ZtLmJ1dHRvblN0eWxlKSA/IFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoIV92bS5yZWFkb25seSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiIXJlYWRvbmx5XCJcblx0ICAgIH0sIHtcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY2hlY2spLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNoZWNrXCJcblx0ICAgIH1dLFxuXHQgICAgcmVmOiBcImlucHV0XCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJyYWRpb1wiLFxuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWUsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcImRpc2FibGVkXCI6IF92bS5kaXNhYmxlZFxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLnNlbGVjdGVkVmFsdWUsXG5cdCAgICAgIFwiY2hlY2tlZFwiOiBfdm0uX3EoX3ZtLmNoZWNrLCBfdm0uc2VsZWN0ZWRWYWx1ZSlcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jaGVjayA9IF92bS5zZWxlY3RlZFZhbHVlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0gOiBfdm0uX2MoJ2xhYmVsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwib3BlblwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVjayksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInJhZGlvXCIsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uc2VsZWN0ZWRWYWx1ZSxcblx0ICAgICAgXCJjaGVja2VkXCI6IF92bS5fcShfdm0uY2hlY2ssIF92bS5zZWxlY3RlZFZhbHVlKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLmNoZWNrID0gX3ZtLnNlbGVjdGVkVmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uYWN0aXZlID8gJ2J0bi0nICsgX3ZtLnR5cGVDb2xvciA6ICcnLCB7XG5cdCAgICAgIGJnOiBfdm0udHlwZUNvbG9yID09PSAnZGVmYXVsdCdcblx0ICAgIH1dXG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uYWN0aXZlICYmIF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0JykgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uXCJcblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03NGNmZDkyY1wiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNTQpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTYpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTU3KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNlbGVjdC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdF9fdnVlX29wdGlvbnNfXy5fc2NvcGVJZCA9IFwiZGF0YS12LWU1MTRkYmM2XCJcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1lNTE0ZGJjNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtZTUxNGRiYzZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTZWxlY3QudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTU0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTUpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWU1MTRkYmM2JnNjb3BlZD10cnVlIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TZWxlY3QudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1lNTE0ZGJjNiZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU2VsZWN0LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZde1xcclxcbiAgaGVpZ2h0OiBhdXRvO1xcclxcbiAgcGFkZGluZy1yaWdodDogMjRweDtcXG59XFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGVbZGF0YS12LWU1MTRkYmM2XTphZnRlcntcXHJcXG4gIGNvbnRlbnQ6ICcgJztcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHJpZ2h0OiAxM3B4O1xcclxcbiAgdG9wOiA1MCU7XFxyXFxuICBtYXJnaW46IC0xcHggMCAwO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IGRhc2hlZDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBzb2xpZCBcXFxcOTtcXHJcXG4gIGJvcmRlci1yaWdodDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXG59XFxuLmJzLXNlYXJjaGJveFtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIG1hcmdpbjogNHB4IDhweDtcXG59XFxuLmJzLXNlYXJjaGJveCAuY2xvc2VbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5icy1zZWFyY2hib3ggaW5wdXRbZGF0YS12LWU1MTRkYmM2XTpmb2N1cyxcXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZdOmZvY3VzIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXItY29sb3I6ICM2NmFmZTkgIWltcG9ydGFudDtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxufVxcbi5zZWNyZXRbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBjbGlwOiByZWN0KDAgMCAwIDApO1xcclxcbiAgaGVpZ2h0OiAxcHg7XFxyXFxuICBtYXJnaW46IC0xcHg7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxcHg7XFxufVxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlPi5jbG9zZVtkYXRhLXYtZTUxNGRiYzZdIHsgbWFyZ2luLWxlZnQ6IDVweDtcXG59XFxuLm5vdGlmeS5vdXRbZGF0YS12LWU1MTRkYmM2XSB7IHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLm5vdGlmeS5pbltkYXRhLXYtZTUxNGRiYzZdLFxcclxcbi5ub3RpZnk+ZGl2W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDk2JTtcXHJcXG4gIG1hcmdpbjogMCAyJTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDI2cHg7XFxyXFxuICBwYWRkaW5nOiAzcHggNXB4O1xcclxcbiAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNlM2UzZTM7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcbi5ub3RpZnk+ZGl2W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgdG9wOiA1cHg7XFxyXFxuICB6LWluZGV4OiAxO1xcbn1cXG4ubm90aWZ5LmluW2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgb3BhY2l0eTogLjk7XFxyXFxuICBib3R0b206IDVweDtcXG59XFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLXRvZ2dsZT5zcGFuW2RhdGEtdi1lNTE0ZGJjNl06bm90KC5jbG9zZSkge1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDE4cHgpO1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG4gIG1hcmdpbi1ib3R0b206IC00cHg7XFxufVxcbi5idG4tZ3JvdXAtanVzdGlmaWVkIC5kcm9wZG93bi1tZW51W2RhdGEtdi1lNTE0ZGJjNl0geyB3aWR0aDogMTAwJTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9TZWxlY3QudnVlPzY4Mjk4YzEzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF1UUE7RUFDQSxhQUFBO0VBQ0Esb0JBQUE7Q0FDQTtBQUNBO0VBQ0EsYUFBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLFNBQUE7RUFDQSxpQkFBQTtFQUNBLHVCQUFBO0VBQ0EseUJBQUE7RUFDQSxvQ0FBQTtFQUNBLG1DQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTs7RUFFQSxXQUFBO0VBQ0EsaUNBQUE7RUFDQSwwRUFBQTtDQUNBO0FBQ0E7RUFDQSxVQUFBO0VBQ0Esb0JBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGlCQUFBO0VBQ0EsV0FBQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtDQUNBO0FBQ0Esd0RBQUEsaUJBQUE7Q0FBQTtBQUNBLCtCQUFBLG1CQUFBO0NBQUE7QUFDQTs7RUFFQSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxhQUFBO0VBQ0EsaUJBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0EsMEJBQUE7RUFDQSw0Q0FBQTtFQUNBLHFCQUFBO0NBQ0E7QUFDQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0Esd0JBQUE7RUFDQSxvQkFBQTtDQUNBO0FBQ0EsdURBQUEsWUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJTZWxlY3QudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgcmVmPVxcXCJzZWxlY3RcXFwiIDpjbGFzcz1cXFwiY2xhc3Nlc1xcXCIgdi1jbGljay1vdXRzaWRlPVxcXCJjbG9zZVxcXCI+XFxyXFxuICAgIDxkaXYgcmVmPVxcXCJidG5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZHJvcGRvd24tdG9nZ2xlXFxcIiB0YWJpbmRleD1cXFwiMVxcXCIgOmRpc2FibGVkPVxcXCJkaXNhYmxlZCB8fCAhaGFzUGFyZW50XFxcIiA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgIEBibHVyPVxcXCJjYW5TZWFyY2ggPyBudWxsIDogY2xvc2UoKVxcXCJcXHJcXG4gICAgICBAY2xpY2s9XFxcInRvZ2dsZSgpXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVzYy5zdG9wLnByZXZlbnQ9XFxcImNsb3NlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLnNwYWNlLnN0b3AucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVudGVyLnN0b3AucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICA+XFxyXFxuICAgICAgPHNwYW4gY2xhc3M9XFxcImJ0bi1jb250ZW50XFxcIiB2LWh0bWw9XFxcImxvYWRpbmcgPyB0ZXh0LmxvYWRpbmcgOiBzaG93UGxhY2Vob2xkZXIgfHwgKG11bHRpcGxlICYmIHNob3dDb3VudCA/IHNlbGVjdGVkVGV4dCA6IHNlbGVjdGVkKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWx1ZXMubGVuZ3RoXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwiY2xlYXIoKVxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDxzZWxlY3QgcmVmPVxcXCJzZWxcXFwiIHYtbW9kZWw9XFxcInZhbFxcXCIgOm5hbWU9XFxcIm5hbWVcXFwiIGNsYXNzPVxcXCJzZWNyZXRcXFwiIDptdWx0aXBsZT1cXFwibXVsdGlwbGVcXFwiIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1pZj1cXFwicmVxdWlyZWRcXFwiIHZhbHVlPVxcXCJcXFwiPjwvb3B0aW9uPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wdGlvbiBpbiBsaXN0XFxcIiA6dmFsdWU9XFxcIm9wdGlvbltvcHRpb25zVmFsdWVdXFxcIj57eyBvcHRpb25bb3B0aW9uc0xhYmVsXSB9fTwvb3B0aW9uPlxcclxcbiAgICA8L3NlbGVjdD5cXHJcXG4gICAgPHVsIGNsYXNzPVxcXCJkcm9wZG93bi1tZW51XFxcIj5cXHJcXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cXFwibGlzdC5sZW5ndGhcXFwiPlxcclxcbiAgICAgICAgPGxpIHYtaWY9XFxcImNhblNlYXJjaFxcXCIgY2xhc3M9XFxcImJzLXNlYXJjaGJveFxcXCI+XFxyXFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiA6cGxhY2Vob2xkZXI9XFxcInNlYXJjaFRleHR8fHRleHQuc2VhcmNoXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJzZWFyY2hcXFwiXFxyXFxuICAgICAgICAgICAgdi1tb2RlbD1cXFwic2VhcmNoVmFsdWVcXFwiXFxyXFxuICAgICAgICAgICAgQGtleXVwLmVzYz1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgICAgIC8+XFxyXFxuICAgICAgICAgIDxzcGFuIHYtc2hvdz1cXFwic2VhcmNoVmFsdWVcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJjbGVhclNlYXJjaFxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDwvbGk+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwicmVxdWlyZWQmJiFjbGVhckJ1dHRvblxcXCI+PGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJjbGVhcigpICYmIGNsb3NlKClcXFwiPnt7IHBsYWNlaG9sZGVyIHx8IHRleHQubm90U2VsZWN0ZWQgfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDxsaSB2LWZvcj1cXFwib3B0aW9uIGluIGZpbHRlcmVkT3B0aW9uc1xcXCIgOmlkPVxcXCJvcHRpb25bb3B0aW9uc1ZhbHVlXVxcXCI+XFxyXFxuICAgICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwic2VsZWN0KG9wdGlvbltvcHRpb25zVmFsdWVdKVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1odG1sPVxcXCJvcHRpb25bb3B0aW9uc0xhYmVsXVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcXFwiIHYtc2hvdz1cXFwiaXNTZWxlY3RlZChvcHRpb25bb3B0aW9uc1ZhbHVlXSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9hPlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgIWNsb3NlT25TZWxlY3RcXFwiIG5hbWU9XFxcImZhZGVpblxcXCI+PGRpdiBjbGFzcz1cXFwibm90aWZ5IGluXFxcIj57e2xpbWl0VGV4dH19PC9kaXY+PC90cmFuc2l0aW9uPlxcclxcbiAgICA8L3VsPlxcclxcbiAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgY2xvc2VPblNlbGVjdFxcXCIgbmFtZT1cXFwiZmFkZWluXFxcIj48ZGl2IGNsYXNzPVxcXCJub3RpZnkgb3V0XFxcIj48ZGl2Pnt7bGltaXRUZXh0fX08L2Rpdj48L2Rpdj48L3RyYW5zaXRpb24+XFxyXFxuICAgIDwhLS0gPHByZT5PcHRpb25zOiB7e2xpc3R9fTwvcHJlPiAtLT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge3RyYW5zbGF0aW9uc30gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgQ2xpY2tPdXRzaWRlIGZyb20gJy4vZGlyZWN0aXZlcy9DbGlja091dHNpZGUuanMnXFxyXFxuXFxyXFxudmFyIHRpbWVvdXQgPSB7fVxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIGRpcmVjdGl2ZXM6IHtcXHJcXG4gICAgQ2xpY2tPdXRzaWRlXFxyXFxuICB9LFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNsb3NlT25TZWxlY3Q6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBsaW1pdDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNH0sXFxyXFxuICAgIG1pblNlYXJjaDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG11bHRpcGxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgb3B0aW9uczoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICBvcHRpb25zTGFiZWw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCd9LFxcclxcbiAgICBvcHRpb25zVmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZSd9LFxcclxcbiAgICBwYXJlbnQ6IHtkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgcGxhY2Vob2xkZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzZWFyY2g6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHNlYXJjaFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBjb3VudFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzaG93Q291bnQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHVybDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiBudWxsXFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgbGlzdDogW10sXFxyXFxuICAgICAgbG9hZGluZzogbnVsbCxcXHJcXG4gICAgICBzZWFyY2hWYWx1ZTogbnVsbCxcXHJcXG4gICAgICBzaG93OiBmYWxzZSxcXHJcXG4gICAgICBub3RpZnk6IGZhbHNlLFxcclxcbiAgICAgIHZhbDogbnVsbCxcXHJcXG4gICAgICB2YWxpZDogbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgY2FuU2VhcmNoICgpIHsgcmV0dXJuIHRoaXMubWluU2VhcmNoID8gdGhpcy5saXN0Lmxlbmd0aCA+PSB0aGlzLm1pblNlYXJjaCA6IHRoaXMuc2VhcmNoIH0sXFxyXFxuICAgIGNsYXNzZXMgKCkgeyByZXR1cm4gW3tvcGVuOiB0aGlzLnNob3csIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkfSwgdGhpcy5jbGFzcywgdGhpcy5pc0xpID8gJ2Ryb3Bkb3duJyA6IHRoaXMuaW5JbnB1dCA/ICdpbnB1dC1ncm91cC1idG4nIDogJ2J0bi1ncm91cCddIH0sXFxyXFxuICAgIGZpbHRlcmVkT3B0aW9ucyAoKSB7XFxyXFxuICAgICAgdmFyIHNlYXJjaCA9ICh0aGlzLnNlYXJjaFZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgcmV0dXJuICFzZWFyY2ggPyB0aGlzLmxpc3QgOiB0aGlzLmxpc3QuZmlsdGVyKGVsID0+IHtcXHJcXG4gICAgICAgIHJldHVybiB+ZWxbdGhpcy5vcHRpb25zTGFiZWxdLnRvTG93ZXJDYXNlKCkuc2VhcmNoKHNlYXJjaClcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LFxcclxcbiAgICBoYXNQYXJlbnQgKCkgeyByZXR1cm4gdGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBBcnJheSA/IHRoaXMucGFyZW50Lmxlbmd0aCA6IHRoaXMucGFyZW50IH0sXFxyXFxuICAgIGluSW5wdXQgKCkgeyByZXR1cm4gdGhpcy4kcGFyZW50Ll9pbnB1dCB9LFxcclxcbiAgICBpc0xpICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0IH0sXFxyXFxuICAgIGxpbWl0VGV4dCAoKSB7IHJldHVybiB0aGlzLnRleHQubGltaXQucmVwbGFjZSgne3tsaW1pdH19JywgdGhpcy5saW1pdCkgfSxcXHJcXG4gICAgc2VsZWN0ZWQgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmxpc3QubGVuZ3RoID09PSAwKSB7IHJldHVybiAnJyB9XFxyXFxuICAgICAgdmFyIHNlbCA9IHRoaXMudmFsdWVzLm1hcCh2YWwgPT4gKHRoaXMubGlzdC5maW5kKG8gPT4gb1t0aGlzLm9wdGlvbnNWYWx1ZV0gPT09IHZhbCkgfHwge30pW3RoaXMub3B0aW9uc0xhYmVsXSkuZmlsdGVyKHZhbCA9PiB2YWwgIT09IHVuZGVmaW5lZClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdzZWxlY3RlZCcsIHNlbClcXHJcXG4gICAgICByZXR1cm4gc2VsLmpvaW4oJywgJylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ZWRUZXh0ICgpIHsgcmV0dXJuIHRoaXMuY291bnRUZXh0IHx8IHRoaXMudGV4dC5zZWxlY3RlZC5yZXBsYWNlKCd7e2NvdW50fX0nLCB0aGlzLnZhbHVlcy5sZW5ndGgpIH0sXFxyXFxuICAgIHNob3dQbGFjZWhvbGRlciAoKSB7IHJldHVybiAodGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCkgPyAodGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQpIDogbnVsbCB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHZhbHVlcyAoKSB7IHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF0gfSxcXHJcXG4gICAgdmFsT3B0aW9ucyAoKSB7IHJldHVybiB0aGlzLmxpc3QubWFwKGVsID0+IGVsW3RoaXMub3B0aW9uc1ZhbHVlXSkgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIG9wdGlvbnMgKG9wdGlvbnMpIHtcXHJcXG4gICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLnNldE9wdGlvbnMob3B0aW9ucylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAodmFsKSB7XFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAoKSB7XFxyXFxuICAgICAgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdGhpcy52YWwgPSB2YWwgPSBudWxsIH1cXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgdmFsLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcXHJcXG4gICAgICAgIHRoaXMudmFsID0gdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWVcXHJcXG4gICAgICAgIGlmICh0aW1lb3V0LmxpbWl0KSBjbGVhclRpbWVvdXQodGltZW91dC5saW1pdClcXHJcXG4gICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGltZW91dC5saW1pdCA9IGZhbHNlXFxyXFxuICAgICAgICAgIHRoaXMubm90aWZ5ID0gZmFsc2VcXHJcXG4gICAgICAgIH0sIDE1MDApXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIGNoZWNrRGF0YSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcXHJcXG4gICAgICAgIGlmICh0aGlzLmxpbWl0IDwgMSkgeyB0aGlzLmxpbWl0ID0gMSB9XFxyXFxuICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xcclxcbiAgICAgICAgICB0aGlzLnZhbCA9ICh0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkKSA/IFtdIDogW3RoaXMudmFsXVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9uc1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbC5maWx0ZXIoZWwgPT4gfnZhbHVlcy5pbmRleE9mKGVsKSlcXHJcXG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgaWYgKCF+dGhpcy52YWxPcHRpb25zLmluZGV4T2YodGhpcy52YWwpKSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBjbGVhciAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDogbnVsbFxcclxcbiAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgY2xlYXJTZWFyY2ggKCkge1xcclxcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgaXNTZWxlY3RlZCAodikge1xcclxcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTFcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ICh2KSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKVxcclxcbiAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xcclxcbiAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgbmV3VmFsLnB1c2godilcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMudmFsID0gbmV3VmFsXFxyXFxuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2XFxyXFxuICAgICAgICB0aGlzLnRvZ2dsZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzZXRPcHRpb25zIChvcHRpb25zKSB7XFxyXFxuICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZWwgPT4ge1xcclxcbiAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7IHJldHVybiBlbCB9XFxyXFxuICAgICAgICBsZXQgb2JqID0ge31cXHJcXG4gICAgICAgIG9ialt0aGlzLm9wdGlvbnNMYWJlbF0gPSBlbFxcclxcbiAgICAgICAgb2JqW3RoaXMub3B0aW9uc1ZhbHVlXSA9IGVsXFxyXFxuICAgICAgICByZXR1cm4gb2JqXFxyXFxuICAgICAgfSlcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdvcHRpb25zJywgdGhpcy5saXN0KVxcclxcbiAgICB9LFxcclxcbiAgICB0b2dnbGUgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkICYmICF0aGlzLnNob3cpIHJldHVybjtcXHJcXG4gICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93XFxyXFxuICAgICAgaWYgKCF0aGlzLnNob3cpIHRoaXMuJHJlZnMuYnRuLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdXJsQ2hhbmdlZCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihyZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXVxcclxcbiAgICAgICAgdHJ5IHsgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSkgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyhkYXRhKVxcclxcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gICAgICB9LCByZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIH0pXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbGlkYXRlICgpIHtcXHJcXG4gICAgICByZXR1cm4gIXRoaXMucmVxdWlyZWQgPyB0cnVlIDogdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IHRoaXMudmFsLmxlbmd0aCA+IDAgOiB0aGlzLnZhbCAhPT0gbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpXFxyXFxuICAgIHRoaXMudmFsID0gdGhpcy52YWx1ZVxcclxcbiAgICB0aGlzLl9zZWxlY3QgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLnZhbCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLnBhcmVudCkgeyB0aGlzLnZhbCA9IG51bGwgfVxcclxcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWxbMF1cXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLmNoZWNrRGF0YSgpXFxyXFxuICAgIGlmICh0aGlzLnVybCkgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgbGV0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHsgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQgfVxcclxcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcylcXHJcXG4gICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucylcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gIH0sXFxyXFxuICBiZWZvcmVEZXN0cm95ICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkge1xcclxcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xle1xcclxcbiAgaGVpZ2h0OiBhdXRvO1xcclxcbiAgcGFkZGluZy1yaWdodDogMjRweDtcXHJcXG59XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU6YWZ0ZXJ7XFxyXFxuICBjb250ZW50OiAnICc7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICByaWdodDogMTNweDtcXHJcXG4gIHRvcDogNTAlO1xcclxcbiAgbWFyZ2luOiAtMXB4IDAgMDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBkYXNoZWQ7XFxyXFxuICBib3JkZXItdG9wOiA0cHggc29saWQgXFxcXDk7XFxyXFxuICBib3JkZXItcmlnaHQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG4gIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3gge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgbWFyZ2luOiA0cHggOHB4O1xcclxcbn1cXHJcXG4uYnMtc2VhcmNoYm94IC5jbG9zZSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3ggaW5wdXQ6Zm9jdXMsXFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlci1jb2xvcjogIzY2YWZlOSAhaW1wb3J0YW50O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXHJcXG59XFxyXFxuLnNlY3JldCB7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBjbGlwOiByZWN0KDAgMCAwIDApO1xcclxcbiAgaGVpZ2h0OiAxcHg7XFxyXFxuICBtYXJnaW46IC0xcHg7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxcHg7XFxyXFxufVxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlPi5jbG9zZSB7IG1hcmdpbi1sZWZ0OiA1cHg7fVxcclxcbi5ub3RpZnkub3V0IHsgcG9zaXRpb246IHJlbGF0aXZlOyB9XFxyXFxuLm5vdGlmeS5pbixcXHJcXG4ubm90aWZ5PmRpdiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB3aWR0aDogOTYlO1xcclxcbiAgbWFyZ2luOiAwIDIlO1xcclxcbiAgbWluLWhlaWdodDogMjZweDtcXHJcXG4gIHBhZGRpbmc6IDNweCA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2UzZTNlMztcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuLm5vdGlmeT5kaXYge1xcclxcbiAgdG9wOiA1cHg7XFxyXFxuICB6LWluZGV4OiAxO1xcclxcbn1cXHJcXG4ubm90aWZ5LmluIHtcXHJcXG4gIG9wYWNpdHk6IC45O1xcclxcbiAgYm90dG9tOiA1cHg7XFxyXFxufVxcclxcbi5idG4tZ3JvdXAtanVzdGlmaWVkIC5kcm9wZG93bi10b2dnbGU+c3Bhbjpub3QoLmNsb3NlKSB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gMThweCk7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogLTRweDtcXHJcXG59XFxyXFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLW1lbnUgeyB3aWR0aDogMTAwJTsgfVxcclxcbjwvc3R5bGU+XFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdHZhciB0aW1lb3V0ID0ge307XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBDbGlja091dHNpZGU6IF9DbGlja091dHNpZGUyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgY2xvc2VPblNlbGVjdDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNCB9LFxuXHQgICAgbWluU2VhcmNoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuXHQgICAgbXVsdGlwbGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcblx0ICAgICAgICByZXR1cm4gW107XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBvcHRpb25zTGFiZWw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbGFiZWwnIH0sXG5cdCAgICBvcHRpb25zVmFsdWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndmFsdWUnIH0sXG5cdCAgICBwYXJlbnQ6IHsgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZXF1aXJlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBzZWFyY2g6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHNlYXJjaFRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjb3VudFRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBzaG93Q291bnQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHVybDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgbGlzdDogW10sXG5cdCAgICAgIGxvYWRpbmc6IG51bGwsXG5cdCAgICAgIHNlYXJjaFZhbHVlOiBudWxsLFxuXHQgICAgICBzaG93OiBmYWxzZSxcblx0ICAgICAgbm90aWZ5OiBmYWxzZSxcblx0ICAgICAgdmFsOiBudWxsLFxuXHQgICAgICB2YWxpZDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgY2FuU2VhcmNoOiBmdW5jdGlvbiBjYW5TZWFyY2goKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaDtcblx0ICAgIH0sXG5cdCAgICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gW3sgb3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCB0aGlzLmNsYXNzLCB0aGlzLmlzTGkgPyAnZHJvcGRvd24nIDogdGhpcy5pbklucHV0ID8gJ2lucHV0LWdyb3VwLWJ0bicgOiAnYnRuLWdyb3VwJ107XG5cdCAgICB9LFxuXHQgICAgZmlsdGVyZWRPcHRpb25zOiBmdW5jdGlvbiBmaWx0ZXJlZE9wdGlvbnMoKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgc2VhcmNoID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cdCAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gfmVsW190aGlzLm9wdGlvbnNMYWJlbF0udG9Mb3dlckNhc2UoKS5zZWFyY2goc2VhcmNoKTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgaGFzUGFyZW50OiBmdW5jdGlvbiBoYXNQYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5wYXJlbnQubGVuZ3RoIDogdGhpcy5wYXJlbnQ7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0O1xuXHQgICAgfSxcblx0ICAgIGxpbWl0VGV4dDogZnVuY3Rpb24gbGltaXRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkOiBmdW5jdGlvbiBzZWxlY3RlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgc2VsID0gdGhpcy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICByZXR1cm4gKF90aGlzMi5saXN0LmZpbmQoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICAgIHJldHVybiBvW190aGlzMi5vcHRpb25zVmFsdWVdID09PSB2YWw7XG5cdCAgICAgICAgfSkgfHwge30pW190aGlzMi5vcHRpb25zTGFiZWxdO1xuXHQgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdGVkJywgc2VsKTtcblx0ICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkVGV4dDogZnVuY3Rpb24gc2VsZWN0ZWRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5jb3VudFRleHQgfHwgdGhpcy50ZXh0LnNlbGVjdGVkLnJlcGxhY2UoJ3t7Y291bnR9fScsIHRoaXMudmFsdWVzLmxlbmd0aCk7XG5cdCAgICB9LFxuXHQgICAgc2hvd1BsYWNlaG9sZGVyOiBmdW5jdGlvbiBzaG93UGxhY2Vob2xkZXIoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggPT09IDAgfHwgIXRoaXMuaGFzUGFyZW50ID8gdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQgOiBudWxsO1xuXHQgICAgfSxcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnZhbCA6IH5bbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKHRoaXMudmFsKSA/IFtdIDogW3RoaXMudmFsXTtcblx0ICAgIH0sXG5cdCAgICB2YWxPcHRpb25zOiBmdW5jdGlvbiB2YWxPcHRpb25zKCkge1xuXHQgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICAgIHJldHVybiB0aGlzLmxpc3QubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbFtfdGhpczMub3B0aW9uc1ZhbHVlXTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgb3B0aW9uczogZnVuY3Rpb24gb3B0aW9ucyhfb3B0aW9ucykge1xuXHQgICAgICBpZiAoX29wdGlvbnMgaW5zdGFuY2VvZiBBcnJheSkgdGhpcy5zZXRPcHRpb25zKF9vcHRpb25zKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCkge1xuXHQgICAgICBpZiAodmFsKSB7XG5cdCAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKTtcblx0ICAgICAgICAvLyBvbkJsdXIodGhpcy4kcmVmcy5zZWxlY3QsIGUgPT4geyB0aGlzLnNob3cgPSBmYWxzZSB9KVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcblx0ICAgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdXJsOiBmdW5jdGlvbiB1cmwoKSB7XG5cdCAgICAgIHRoaXMudXJsQ2hhbmdlZCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbGlkOiBmdW5jdGlvbiB2YWxpZCh2YWwsIG9sZCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IHZhbDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblx0XG5cdCAgICAgIGlmIChfdmFsID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IF92YWwgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChfdmFsICE9PSBvbGQpIHtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBfdmFsKTtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIF92YWwpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChfdmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgX3ZhbC5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSBfdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICAgIHRoaXMubm90aWZ5ID0gdHJ1ZTtcblx0ICAgICAgICBpZiAodGltZW91dC5saW1pdCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQubGltaXQpO1xuXHQgICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHRpbWVvdXQubGltaXQgPSBmYWxzZTtcblx0ICAgICAgICAgIF90aGlzNC5ub3RpZnkgPSBmYWxzZTtcblx0ICAgICAgICB9LCAxNTAwKTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBjaGVja0RhdGE6IGZ1bmN0aW9uIGNoZWNrRGF0YSgpIHtcblx0ICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcblx0ICAgICAgICBpZiAodGhpcy5saW1pdCA8IDEpIHtcblx0ICAgICAgICAgIHRoaXMubGltaXQgPSAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHQgICAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkID8gW10gOiBbdGhpcy52YWxdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy52YWxPcHRpb25zO1xuXHQgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgcmV0dXJuIH52YWx1ZXMuaW5kZXhPZihlbCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgaWYgKHRoaXMudmFsdWVzLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGlmICghfnRoaXMudmFsT3B0aW9ucy5pbmRleE9mKHRoaXMudmFsKSkge1xuXHQgICAgICAgICAgdGhpcy52YWwgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcblx0ICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyBbXSA6IG51bGw7XG5cdCAgICAgIHRoaXMudG9nZ2xlKCk7XG5cdCAgICB9LFxuXHQgICAgY2xlYXJTZWFyY2g6IGZ1bmN0aW9uIGNsZWFyU2VhcmNoKCkge1xuXHQgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG5cdCAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgaXNTZWxlY3RlZDogZnVuY3Rpb24gaXNTZWxlY3RlZCh2KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTE7XG5cdCAgICB9LFxuXHQgICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3Qodikge1xuXHQgICAgICBpZiAodGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKTtcblx0ICAgICAgICBpZiAofm5ld1ZhbC5pbmRleE9mKHYpKSB7XG5cdCAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgbmV3VmFsLnB1c2godik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMudmFsID0gbmV3VmFsO1xuXHQgICAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QpIHtcblx0ICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMudmFsID0gdjtcblx0ICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG5cdCAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7XG5cdCAgICAgICAgICByZXR1cm4gZWw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBvYmogPSB7fTtcblx0ICAgICAgICBvYmpbX3RoaXM1Lm9wdGlvbnNMYWJlbF0gPSBlbDtcblx0ICAgICAgICBvYmpbX3RoaXM1Lm9wdGlvbnNWYWx1ZV0gPSBlbDtcblx0ICAgICAgICByZXR1cm4gb2JqO1xuXHQgICAgICB9KTtcblx0ICAgICAgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHRoaXMubGlzdCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkICYmICF0aGlzLnNob3cpIHJldHVybjtcblx0ICAgICAgdGhpcy5zaG93ID0gIXRoaXMuc2hvdztcblx0ICAgICAgaWYgKCF0aGlzLnNob3cpIHRoaXMuJHJlZnMuYnRuLmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdXJsQ2hhbmdlZDogZnVuY3Rpb24gdXJsQ2hhbmdlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMudXJsIHx8ICF0aGlzLiRodHRwKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuJGh0dHAuZ2V0KHRoaXMudXJsKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHQgICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5ID8gcmVzcG9uc2UuZGF0YSA6IFtdO1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblx0ICAgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgICAgIF90aGlzNi5zZXRPcHRpb25zKGRhdGEpO1xuXHQgICAgICAgIF90aGlzNi5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgICAgX3RoaXM2LmNoZWNrRGF0YSgpO1xuXHQgICAgICB9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICBfdGhpczYubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgICB9KTtcblx0ICAgIH0sXG5cdCAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCA/IHRydWUgOiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwubGVuZ3RoID4gMCA6IHRoaXMudmFsICE9PSBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5fc2VsZWN0ID0gdHJ1ZTtcblx0ICAgIGlmICh0aGlzLnZhbCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLnBhcmVudCkge1xuXHQgICAgICB0aGlzLnZhbCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsWzBdO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jaGVja0RhdGEoKTtcblx0ICAgIGlmICh0aGlzLnVybCkgdGhpcy51cmxDaGFuZ2VkKCk7XG5cdCAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5jaGVja0RhdGEoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJjbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1jbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNsb3NlKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjbG9zZVwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJzZWxlY3RcIixcblx0ICAgIGNsYXNzOiBfdm0uY2xhc3Nlc1xuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJidG5cIixcblx0ICAgIHN0YXRpY0NsYXNzOiBcImZvcm0tY29udHJvbCBkcm9wZG93bi10b2dnbGVcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFiaW5kZXhcIjogXCIxXCIsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkIHx8ICFfdm0uaGFzUGFyZW50LFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uY2FuU2VhcmNoID8gbnVsbCA6IF92bS5jbG9zZSgpXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgpXG5cdCAgICAgIH0sXG5cdCAgICAgIFwia2V5ZG93blwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uY2xvc2UoJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInNwYWNlXCIsIDMyKSkgeyByZXR1cm47IH1cblx0ICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfV1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYnRuLWNvbnRlbnRcIixcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhfdm0ubG9hZGluZyA/IF92bS50ZXh0LmxvYWRpbmcgOiBfdm0uc2hvd1BsYWNlaG9sZGVyIHx8IChfdm0ubXVsdGlwbGUgJiYgX3ZtLnNob3dDb3VudCA/IF92bS5zZWxlY3RlZFRleHQgOiBfdm0uc2VsZWN0ZWQpKVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWx1ZXMubGVuZ3RoKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jbGVhcigpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc2VsZWN0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VsXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJzZWNyZXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJtdWx0aXBsZVwiOiBfdm0ubXVsdGlwbGUsXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNoYW5nZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucywgZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgcmV0dXJuIG8uc2VsZWN0ZWRcblx0ICAgICAgICB9KS5tYXAoZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgdmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTtcblx0ICAgICAgICAgIHJldHVybiB2YWxcblx0ICAgICAgICB9KVswXVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ucmVxdWlyZWQpID8gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInZhbHVlXCI6IFwiXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2woKF92bS5saXN0KSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJ2YWx1ZVwiOiBvcHRpb25bX3ZtLm9wdGlvbnNWYWx1ZV1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3Mob3B0aW9uW192bS5vcHRpb25zTGFiZWxdKSldKVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbKF92bS5saXN0Lmxlbmd0aCkgPyBbKF92bS5jYW5TZWFyY2gpID8gX3ZtLl9jKCdsaScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLXNlYXJjaGJveFwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VhcmNoXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0uc2VhcmNoVGV4dCB8fCBfdm0udGV4dC5zZWFyY2gsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0uc2VhcmNoVmFsdWUpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmNsb3NlKCRldmVudClcblx0ICAgICAgfSxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNlYXJjaFZhbHVlID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xlYXJTZWFyY2hcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0ucmVxdWlyZWQgJiYgIV92bS5jbGVhckJ1dHRvbikgPyBfdm0uX2MoJ2xpJywgW192bS5fYygnYScsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbGVhcigpICYmIF92bS5jbG9zZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ucGxhY2Vob2xkZXIgfHwgX3ZtLnRleHQubm90U2VsZWN0ZWQpKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9sKChfdm0uZmlsdGVyZWRPcHRpb25zKSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcImlkXCI6IG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uc2VsZWN0KG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKG9wdGlvbltfdm0ub3B0aW9uc0xhYmVsXSlcblx0ICAgICAgfVxuXHQgICAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICAgIHZhbHVlOiAoX3ZtLmlzU2VsZWN0ZWQob3B0aW9uW192bS5vcHRpb25zVmFsdWVdKSksXG5cdCAgICAgICAgZXhwcmVzc2lvbjogXCJpc1NlbGVjdGVkKG9wdGlvbltvcHRpb25zVmFsdWVdKVwiXG5cdCAgICAgIH1dLFxuXHQgICAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcIlxuXHQgICAgfSldKV0pXG5cdCAgfSldIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmICFfdm0uY2xvc2VPblNlbGVjdCkgPyBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogXCJmYWRlaW5cIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5vdGlmeSBpblwiXG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKSA6IF92bS5fZSgpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmIF92bS5jbG9zZU9uU2VsZWN0KSA/IF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVpblwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibm90aWZ5IG91dFwiXG5cdCAgfSwgW192bS5fYygnZGl2JywgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKV0pIDogX3ZtLl9lKCldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1lNTE0ZGJjNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNsaWRlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIxODViODJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMTg1YjgyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gU2xpZGVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC4kY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LmluZGV4ID09PSB0aGlzLmluZGV4O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuaW5kaWNhdG9yX2xpc3QpIHtcblx0ICAgICAgdGhpcy4kcGFyZW50LmluZGljYXRvcl9saXN0LnB1c2godGhpcy5pbmRleCk7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKHRoaXMuaW5kZXggPT09IDApIHtcblx0ICAgICAgdGhpcy4kZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIml0ZW1cIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIxODViODJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTYyKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTY0KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxTcGlubmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi04YjI5OGU3MFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtOGIyOThlNzBcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTcGlubmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYzKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi04YjI5OGU3MCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU3Bpbm5lci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LThiMjk4ZTcwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TcGlubmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE2MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5Aa2V5ZnJhbWVzIHNwaW4ge1xcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbn1cXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXG59XFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvU3Bpbm5lci52dWU/NjVmYzVhOGZcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJGQTtBQUNBO0lBQ0EsMEJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLGlDQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLDRCQUFBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLDRCQUFBO0VBQ0Esb0NBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsNklBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGFBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtDQUNBXCIsXCJmaWxlXCI6XCJTcGlubmVyLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLHNwaW5uZXJTaXplLHsnc3Bpbm5lci1maXhlZCc6Zml4ZWR9XVxcXCIgdi1zaG93PVxcXCJhY3RpdmV8fGxvY2tlZFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItd3JhcHBlclxcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3Bpbm5lci1jaXJjbGVcXFwiPjwvZGl2PlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItdGV4dFxcXCI+e3t0ZXh0fX08L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuY29uc3QgTUlOX1dBSVQgPSA1MDAgLy8gaW4gbXNcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBmaXhlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZ2xvYmFsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBzaXplOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbWQnfSxcXHJcXG4gICAgdGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcXHJcXG4gICAgICBsb2NrZWQ6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBzcGlubmVyU2l6ZSAoKSB7IHJldHVybiAnc3Bpbm5lci0nICsgKHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZSA6ICdzbScpIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBhY3RpdmUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7IHRoaXNbdmFsID8gJ3Nob3cnIDogJ2hpZGUnXSgpIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaGlkZSAoKSB7XFxyXFxuICAgICAgdmFyIGRlbGF5ID0gMFxcclxcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAob3B0aW9ucykge1xcclxcbiAgICAgIGlmIChvcHRpb25zKSB7XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy50ZXh0KSB7IHRoaXMudGV4dCA9IG9wdGlvbnMudGV4dCB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7IHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZSB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5maXhlZCkgeyB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZCB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIC8vIGJsb2NrIHNjcm9sbGluZyB3aGVuIHNwaW5uZXIgaXMgb25cXHJcXG4gICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nXFxyXFxuICAgICAgLy8gYWN0aXZhdGUgc3Bpbm5lclxcclxcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpXFxyXFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5fdW5sb2NrKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9ib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WVxcclxcbiAgICB0aGlzLl91bmxvY2sgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gICAgfSwgTUlOX1dBSVQpXFxyXFxuICAgIGlmICh0aGlzLmdsb2JhbCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lcikge1xcclxcbiAgICAgICAgdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lciA9IHRydWVcXHJcXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xcclxcbiAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xcclxcbiAgICAgICAgICBoaWRlICgpIHsgc2VsZi5oaWRlKCkgfSxcXHJcXG4gICAgICAgICAgc2hvdyAoKSB7IHNlbGYuc2hvdygpIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuJHJvb3QuJG9uKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fZ2xvYmFsKSB7XFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpoaWRlJywgdGhpcy5fZ2xvYmFsLmhpZGUpXFxyXFxuICAgICAgZGVsZXRlIHRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXJcXHJcXG4gICAgfVxcclxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc3Bpbm5lckFuaW1hdGlvbilcXHJcXG4gICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbkBrZXlmcmFtZXMgc3BpbiB7XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXHJcXG59XFxyXFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIE1JTl9XQUlUID0gNTAwOyAvLyBpbiBtc1xuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZml4ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGdsb2JhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdtZCcgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcblx0ICAgICAgbG9ja2VkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgc3Bpbm5lclNpemU6IGZ1bmN0aW9uIHNwaW5uZXJTaXplKCkge1xuXHQgICAgICByZXR1cm4gJ3NwaW5uZXItJyArICh0aGlzLnNpemUgPyB0aGlzLnNpemUgOiAnc20nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpc1t2YWwgPyAnc2hvdycgOiAnaGlkZSddKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG5cdCAgICAgIHZhciBkZWxheSA9IDA7XG5cdCAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyhvcHRpb25zKSB7XG5cdCAgICAgIGlmIChvcHRpb25zKSB7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGV4dCkge1xuXHQgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG5cdCAgICAgICAgICB0aGlzLnNpemUgPSBvcHRpb25zLnNpemU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChvcHRpb25zLmZpeGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgLy8gYmxvY2sgc2Nyb2xsaW5nIHdoZW4gc3Bpbm5lciBpcyBvblxuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuXHQgICAgICAvLyBhY3RpdmF0ZSBzcGlubmVyXG5cdCAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdCAgICAgIHRoaXMubG9ja2VkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fdW5sb2NrKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WTtcblx0ICAgIHRoaXMuX3VubG9jayA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9IHRoaXMuX2JvZHlPdmVyZmxvdztcblx0ICAgIH0sIE1JTl9XQUlUKTtcblx0ICAgIGlmICh0aGlzLmdsb2JhbCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXIpIHtcblx0ICAgICAgICB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xuXHQgICAgICAgICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcblx0ICAgICAgICAgICAgc2VsZi5oaWRlKCk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgICAgICAgc2VsZi5zaG93KCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6c2hvdycsIHRoaXMuX2dsb2JhbC5zaG93KTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9nbG9iYWwpIHtcblx0ICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpO1xuXHQgICAgICB0aGlzLiRyb290LiRvZmYoJ3NwaW5uZXI6OmhpZGUnLCB0aGlzLl9nbG9iYWwuaGlkZSk7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyO1xuXHQgICAgfVxuXHQgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NwaW5uZXJBbmltYXRpb24pO1xuXHQgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3c7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5hY3RpdmUgfHwgX3ZtLmxvY2tlZCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiYWN0aXZlfHxsb2NrZWRcIlxuXHQgICAgfV0sXG5cdCAgICBjbGFzczogWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLCBfdm0uc3Bpbm5lclNpemUsIHtcblx0ICAgICAgJ3NwaW5uZXItZml4ZWQnOiBfdm0uZml4ZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci13cmFwcGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzcGlubmVyLWNpcmNsZVwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci10ZXh0XCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LThiMjk4ZTcwXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFiLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0wOTg1ZTg3OFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMDk4NWU4NzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBUYWIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGZhZGVpbjogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIGFjdGl2ZSA9ICF0aGlzLl90YWJzIHx8IHRoaXMuX3RhYnMuc2hvdyA9PT0gdGhpcztcblx0ICAgICAgdGhpcy5mYWRlaW4gPSBmYWxzZTtcblx0ICAgICAgaWYgKGFjdGl2ZSkge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMuZmFkZWluID0gdHJ1ZTtcblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYWN0aXZlO1xuXHQgICAgfSxcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3RhYnMudGFicy5pbmRleE9mKHRoaXMpO1xuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl90YWJzID8gdGhpcy5fdGFicy5lZmZlY3QgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiID0gdHJ1ZTtcblx0ICAgIHZhciB0YWJzID0gdGhpcztcblx0ICAgIHdoaWxlICghdGhpcy5fdGFicyAmJiB0YWJzLiRwYXJlbnQpIHtcblx0ICAgICAgaWYgKHRhYnMuX2lzVGFiR3JvdXApIHtcblx0ICAgICAgICB0YWJzLnRhYnMucHVzaCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl90YWJHcm91cCA9IHRhYnM7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRhYnMuX2lzVGFicykge1xuXHQgICAgICAgIHRhYnMudGFicy5wdXNoKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3RhYnMgPSB0YWJzO1xuXHQgICAgICAgIGlmICghdGhpcy5fdGFiR3JvdXApIHRhYnMuaGVhZGVycy5wdXNoKHRoaXMpO1xuXHQgICAgICB9XG5cdCAgICAgIHRhYnMgPSB0YWJzLiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuX3RhYnMpIHRocm93IEVycm9yKCd0YWIgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgaWYgKHRoaXMuX3RhYkdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX3RhYkdyb3VwLnRhYnMgPSB0aGlzLl90YWJHcm91cC50YWJzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwgIT09IF90aGlzMjtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB0aGlzLl90YWJzLnRhYnMgPSB0aGlzLl90YWJzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbCAhPT0gX3RoaXMyO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl90YWJzKSB7XG5cdCAgICAgIGlmICh0aGlzLl90YWJzLmFjdGl2ZSA9PT0gdGhpcy5pbmRleCkge1xuXHQgICAgICAgIHRoaXMuX3RhYnMuaW5kZXggPSAwO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbmdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy4kcGFyZW50LnRhYnMuaW5kZXhPZih0aGlzKTtcblx0ICAgICAgICBpZiAofmlkKSB0aGlzLiRwYXJlbnQudGFicy5zcGxpY2UoaWQsIDEpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB2YXIgX2lkID0gdGhpcy5fdGFicy50YWJzLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIGlmICh+X2lkKSB0aGlzLl90YWJzLnRhYnMuc3BsaWNlKF9pZCwgMSk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwYW5lbFwiLFxuXHQgICAgY2xhc3M6IFsndGFiLXBhbmUnLCB7XG5cdCAgICAgICdhY3RpdmUgZmFkZSc6IF92bS5hY3RpdmUsXG5cdCAgICAgICdpbic6IF92bS5mYWRlaW5cblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwidGFicGFuZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMDk4NWU4NzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTcwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTcyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Mylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUYWJHcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNTVmYWYzY2JcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTU1ZmFmM2NiXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFiR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnRhYi1jb250ZW50IC50YWItcGFuZSB7IGRpc3BsYXk6IG5vbmU7XFxufVxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVGFiR3JvdXAudnVlPzIyYWUxYzA4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrQ0EseUJBQUEsY0FBQTtDQUFBO0FBQ0EsZ0NBQUEsZUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJUYWJHcm91cC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPjxzcGFuPjxzbG90Pjwvc2xvdD48L3NwYW4+PC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgdGFiczogW11cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGFjdGl2ZSAoKSB7IHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KSB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBibHVyICgpIHsgdGhpcy5zaG93ID0gZmFsc2UgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHsgdGhpcy5zaG93ID0gIXRoaXMuc2hvdyB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLiRwYXJlbnQpIHtcXHJcXG4gICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFxcXCd0IG5lc3QgdGFiLWdyb3Vwcy4nKVxcclxcbiAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJylcXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHRoaXMuX3RhYnMuaGVhZGVycy5wdXNoKHRoaXMpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4udGFiLWNvbnRlbnQgLnRhYi1wYW5lIHsgZGlzcGxheTogbm9uZTsgfVxcclxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7IH1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTcyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHNob3c6IGZhbHNlLFxuXHQgICAgICB0YWJzOiBbXVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUoKSB7XG5cdCAgICAgIHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuJHBhcmVudCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFwndCBuZXN0IHRhYi1ncm91cHMuJyk7XG5cdCAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50O1xuXHQgICAgdGhpcy5fdGFicy5oZWFkZXJzLnB1c2godGhpcyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTU1ZmFmM2NiXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFicy52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzAxMDBkZGZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTcwMTAwZGRmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFicy52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzAxMDBkZGYhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1RhYnMudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi03MDEwMGRkZiEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vVGFicy52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1RhYnMudnVlPzQzMTdiOWFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUEwRUE7RUFDQSxlQUFBO0NBQ0FcIixcImZpbGVcIjpcIlRhYnMudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgdGFicz5cXHJcXG4gICAgPHVsIDpjbGFzcz1cXFwibmF2U3R5bGVDbGFzc1xcXCIgcm9sZT1cXFwidGFibGlzdFxcXCI+XFxyXFxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCJoZWFkZXIgaW4gaGVhZGVyc1xcXCI+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwiaGVhZGVyLl9pc1RhYlxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmhlYWRlci5hY3RpdmUsIGRpc2FibGVkOmhlYWRlci5kaXNhYmxlZH1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QoaGVhZGVyKVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGEgaHJlZj1cXFwiI1xcXCIgdi1odG1sPVxcXCJoZWFkZXIuaGVhZGVyXFxcIj48L2E+PC9zbG90PlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICAgIDxkcm9wZG93biB2LWlmPVxcXCJoZWFkZXIuX2lzVGFiR3JvdXBcXFwiIDp0ZXh0PVxcXCJoZWFkZXIuaGVhZGVyXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aGVhZGVyLmFjdGl2ZX1cXFwiIDpkaXNhYmxlZD1cXFwiaGVhZGVyLmRpc2FibGVkXFxcIj5cXHJcXG4gICAgICAgICAgPGxpIHYtZm9yPVxcXCJ0YWIgaW4gaGVhZGVyLnRhYnNcXFwiIDpjbGFzcz1cXFwie2Rpc2FibGVkOnRhYi5kaXNhYmxlZH1cXFwiPjxhIGhyZWY9XFxcIiNcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QodGFiKVxcXCI+e3t0YWIuaGVhZGVyfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDwvZHJvcGRvd24+XFxyXFxuICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPC91bD5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwidGFiLWNvbnRlbnRcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZX0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnLi9Ecm9wZG93bi52dWUnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgY29tcG9uZW50czoge1xcclxcbiAgICBkcm9wZG93blxcclxcbiAgfSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIC8vIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2ZhZGVpbid9LFxcclxcbiAgICBqdXN0aWZpZWQ6IGZhbHNlLFxcclxcbiAgICBuYXZTdHlsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgaW5kZXggPSB0aGlzLnZhbHVlIHx8IDBcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRleCxcXHJcXG4gICAgICBoZWFkZXJzOiBbXSxcXHJcXG4gICAgICB0YWJzOiBbXVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKHZhbCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2FjdGl2ZScsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMuaW5kZXggPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG5hdlN0eWxlQ2xhc3MgKCkge1xcclxcbiAgICAgIHJldHVybiBbXFxyXFxuICAgICAgICAnbmF2JyxcXHJcXG4gICAgICAgIH5bJ3BpbGxzJywgJ3N0YWNrZWQnXS5pbmRleE9mKHRoaXMubmF2U3R5bGUpID8gJ25hdi0nICsgdGhpcy5uYXZTdHlsZSA6ICduYXYtdGFicycsXFxyXFxuICAgICAgICB7XFxyXFxuICAgICAgICAgICduYXYtanVzdGlmaWVkJzogY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxcclxcbiAgICAgICAgICAnbmF2LXBpbGxzJzogdGhpcy5uYXZTdHlsZSA9PT0gJ3N0YWNrZWQnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgXVxcclxcbiAgICB9LFxcclxcbiAgICBzaG93ICgpIHsgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF0gfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2VsZWN0ICh0YWIpIHtcXHJcXG4gICAgICBpZiAoIXRhYi5kaXNhYmxlZCkge1xcclxcbiAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHRhYilcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5faXNUYWJzID0gdHJ1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTc3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfRHJvcGRvd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNSk7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGNvbXBvbmVudHM6IHtcblx0ICAgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICAvLyBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlaW4nfSxcblx0ICAgIGp1c3RpZmllZDogZmFsc2UsXG5cdCAgICBuYXZTdHlsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIGluZGV4ID0gdGhpcy52YWx1ZSB8fCAwO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kZXg6IGluZGV4LFxuXHQgICAgICBoZWFkZXJzOiBbXSxcblx0ICAgICAgdGFiczogW11cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCh2YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnYWN0aXZlJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy5pbmRleCA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBuYXZTdHlsZUNsYXNzOiBmdW5jdGlvbiBuYXZTdHlsZUNsYXNzKCkge1xuXHQgICAgICByZXR1cm4gWyduYXYnLCB+WydwaWxscycsICdzdGFja2VkJ10uaW5kZXhPZih0aGlzLm5hdlN0eWxlKSA/ICduYXYtJyArIHRoaXMubmF2U3R5bGUgOiAnbmF2LXRhYnMnLCB7XG5cdCAgICAgICAgJ25hdi1qdXN0aWZpZWQnOiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxuXHQgICAgICAgICduYXYtcGlsbHMnOiB0aGlzLm5hdlN0eWxlID09PSAnc3RhY2tlZCdcblx0ICAgICAgfV07XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF07XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdCh0YWIpIHtcblx0ICAgICAgaWYgKCF0YWIuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFicyA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFic1wiOiBcIlwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBjbGFzczogX3ZtLm5hdlN0eWxlQ2xhc3MsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJ0YWJsaXN0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9sKChfdm0uaGVhZGVycyksIGZ1bmN0aW9uKGhlYWRlcikge1xuXHQgICAgcmV0dXJuIFsoaGVhZGVyLl9pc1RhYikgPyBfdm0uX2MoJ2xpJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZSwgZGlzYWJsZWQ6IGhlYWRlci5kaXNhYmxlZFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIF92bS5zZWxlY3QoaGVhZGVyKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhoZWFkZXIuaGVhZGVyKVxuXHQgICAgICB9XG5cdCAgICB9KV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKGhlYWRlci5faXNUYWJHcm91cCkgPyBfdm0uX2MoJ2Ryb3Bkb3duJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZVxuXHQgICAgICB9LFxuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwidGV4dFwiOiBoZWFkZXIuaGVhZGVyLFxuXHQgICAgICAgIFwiZGlzYWJsZWRcIjogaGVhZGVyLmRpc2FibGVkXG5cdCAgICAgIH1cblx0ICAgIH0sIF92bS5fbCgoaGVhZGVyLnRhYnMpLCBmdW5jdGlvbih0YWIpIHtcblx0ICAgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAgIGRpc2FibGVkOiB0YWIuZGlzYWJsZWRcblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICAgICAgYXR0cnM6IHtcblx0ICAgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb246IHtcblx0ICAgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICBfdm0uc2VsZWN0KHRhYilcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX3YoX3ZtLl9zKHRhYi5oZWFkZXIpKV0pXSlcblx0ICAgIH0pKSA6IF92bS5fZSgpXVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwidGFiLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03MDEwMGRkZlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE3OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvZ2dsZUJ1dHRvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZjAzNGE1ZjJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWYwMzRhNWYyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVG9nZ2xlQnV0dG9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGZhbHNlVHlwZTogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBuYW1lOiBudWxsLFxuXHQgICAgcmVhZG9ubHk6IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHJ1ZVR5cGU6IHsgZGVmYXVsdDogJ3ByaW1hcnknIH0sXG5cdCAgICB2YWx1ZTogZmFsc2Vcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhY3RpdmU6IF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLnZhbHVlKSxcblx0ICAgICAgdHlwZXM6IHtcblx0ICAgICAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcblx0ICAgICAgICBpbmZvOiAnYnRuLWluZm8nLFxuXHQgICAgICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG5cdCAgICAgICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcblx0ICAgICAgICB3YXJuaW5nOiAnYnRuLXdhcm5pbmcnXG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZWQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQodmFsID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJyk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuYWN0aXZlID0gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMudmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYm9vbERpc2FibGVkOiBmdW5jdGlvbiBib29sRGlzYWJsZWQoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5kaXNhYmxlZCk7XG5cdCAgICB9LFxuXHQgICAgYm9vbFJlYWRvbmx5OiBmdW5jdGlvbiBib29sUmVhZG9ubHkoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5yZWFkb25seSk7XG5cdCAgICB9LFxuXHQgICAgdHlwZTogZnVuY3Rpb24gdHlwZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZXNbdGhpcy52YWx1ZSA/IHRoaXMudHJ1ZVR5cGUgOiB0aGlzLmZhbHNlVHlwZV0gfHwgJ2J0bi1kZWZhdWx0Jztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5ib29sRGlzYWJsZWQgfHwgdGhpcy5ib29sUmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG5cdCAgICB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTgxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2EnLCB7XG5cdCAgICBjbGFzczogWydidG4nLCBfdm0udHlwZSwge1xuXHQgICAgICByZWFkb25seTogX3ZtLmJvb2xSZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImhyZWZcIjogXCJqYXZhc2NyaXB0OnZvaWQoMClcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uYm9vbERpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2dseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsdWUgPyAnb2snIDogJ3JlbW92ZScpXVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5hY3RpdmUgPyAxIDogMFxuXHQgICAgfVxuXHQgIH0pIDogX3ZtLl9lKCldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mMDM0YTVmMlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxODMpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvb2x0aXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQ4ZmI1MWIyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00OGZiNTFiMlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFRvb2x0aXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ4ZmI1MWIyIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Ub29sdGlwLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDhmYjUxYjIhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1Rvb2x0aXAudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXG59XFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXG59XFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXG59XFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcbjAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG59XFxuQGtleWZyYW1lcyBmYWRlaW4tb3V0IHtcXG4wJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVG9vbHRpcC52dWU/MzdkMTgzZWNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJCQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlRvb2x0aXAudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWyd0b29sdGlwJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInRvb2x0aXAtYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1pbm5lclxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImNvbnRlbnRcXFwiPjxkaXYgdi1odG1sPVxcXCJjb250ZW50XFxcIj48L2Rpdj48L3Nsb3Q+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC90cmFuc2l0aW9uPlxcclxcbiAgPC9zcGFuPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgUG9wb3Zlck1peGluIGZyb20gJy4vdXRpbHMvcG9wb3Zlck1peGlucy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBtaXhpbnM6IFtQb3BvdmVyTWl4aW5dLFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgZWZmZWN0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnfSxcXHJcXG4gICAgdHJpZ2dlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJ31cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG59XFxyXFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXHJcXG59XFxyXFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIGZhZGVpbi1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAuOTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTg1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGlucyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQzKTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3BvdmVyTWl4aW5zKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgbWl4aW5zOiBbX3BvcG92ZXJNaXhpbnMyLmRlZmF1bHRdLFxuXHQgIHByb3BzOiB7XG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJyB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWyd0b29sdGlwJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWlubmVyXCJcblx0ICB9LCBbX3ZtLl90KFwiY29udGVudFwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDhmYjUxYjJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTg4KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNilcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUeXBlYWhlYWQudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTViNWY1ZTk0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01YjVmNWU5NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFR5cGVhaGVhZC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4OSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNWI1ZjVlOTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1R5cGVhaGVhZC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTViNWY1ZTk0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UeXBlYWhlYWQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9UeXBlYWhlYWQudnVlPzczZmNkNGJlXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrSUE7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJUeXBlYWhlYWQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgc3R5bGU9XFxcInBvc2l0aW9uOiByZWxhdGl2ZVxcXCIgOmNsYXNzPVxcXCJ7b3BlbjpzaG93RHJvcGRvd259XFxcIj5cXHJcXG4gICAgPGlucHV0IGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIlxcclxcbiAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICA6cGxhY2Vob2xkZXI9XFxcInBsYWNlaG9sZGVyXFxcIlxcclxcbiAgICAgIDp0eXBlLm9uY2U9XFxcInR5cGVcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcInNob3dEcm9wZG93biA9IGZhbHNlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmRvd24ucHJldmVudD1cXFwiZG93blxcXCJcXHJcXG4gICAgICBAa2V5ZG93bi5lbnRlcj1cXFwiaGl0XFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVzYz1cXFwicmVzZXRcXFwiXFxyXFxuICAgICAgQGtleWRvd24udXAucHJldmVudD1cXFwidXBcXFwiXFxyXFxuICAgIC8+XFxyXFxuICAgIDx1bCBjbGFzcz1cXFwiZHJvcGRvd24tbWVudVxcXCIgcmVmPVxcXCJkcm9wZG93blxcXCI+XFxyXFxuICAgICAgPGxpIHYtZm9yPVxcXCIoaXRlbSwgaSkgaW4gaXRlbXNcXFwiIDpjbGFzcz1cXFwie2FjdGl2ZTogaXNBY3RpdmUoaSl9XFxcIj5cXHJcXG4gICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwiaGl0XFxcIiBAbW91c2Vtb3ZlPVxcXCJzZXRBY3RpdmUoaSlcXFwiPlxcclxcbiAgICAgICAgICA8Y29tcG9uZW50IDppcz1cXFwidGVtcGxhdGVDb21wXFxcIiA6aXRlbT1cXFwiaXRlbVxcXCI+PC9jb21wb25lbnQ+XFxyXFxuICAgICAgICA8L2E+XFxyXFxuICAgICAgPC9saT5cXHJcXG4gICAgPC91bD5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2RlbGF5ZXIsIGdldEpTT059IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYXN5bmM6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBkYXRhOiB7dHlwZTogQXJyYXl9LFxcclxcbiAgICBkZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogREVMQVl9LFxcclxcbiAgICBhc3luY0tleToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxpbWl0OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiA4fSxcXHJcXG4gICAgbWF0Y2hDYXNlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBtYXRjaFN0YXJ0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBvbkhpdDoge1xcclxcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxcclxcbiAgICAgIGRlZmF1bHQgKGl0ZW0pIHsgcmV0dXJuIGl0ZW0gfVxcclxcbiAgICB9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHRlbXBsYXRlOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnfSxcXHJcXG4gICAgdmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFzaWduOiAnJyxcXHJcXG4gICAgICBzaG93RHJvcGRvd246IGZhbHNlLFxcclxcbiAgICAgIG5vUmVzdWx0czogdHJ1ZSxcXHJcXG4gICAgICBjdXJyZW50OiAwLFxcclxcbiAgICAgIGl0ZW1zOiBbXSxcXHJcXG4gICAgICB2YWw6IHRoaXMudmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIHRlbXBsYXRlQ29tcCAoKSB7XFxyXFxuICAgICAgcmV0dXJuIHtcXHJcXG4gICAgICAgIHRlbXBsYXRlOiB0eXBlb2YgdGhpcy50ZW1wbGF0ZSA9PT0gJ3N0cmluZycgPyAnPHNwYW4+JyArIHRoaXMudGVtcGxhdGUgKyAnPC9zcGFuPicgOiAnPHN0cm9uZyB2LWh0bWw9XFxcIml0ZW1cXFwiPjwvc3Ryb25nPicsXFxyXFxuICAgICAgICBwcm9wczogeyBpdGVtOiB7ZGVmYXVsdDogbnVsbH0gfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQgJiYgdmFsICE9PSB0aGlzLmFzaWduKSB0aGlzLl9fdXBkYXRlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7IHRoaXMudmFsID0gdmFsIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2V0SXRlbXMgKGRhdGEpIHtcXHJcXG4gICAgICBpZiAodGhpcy5hc3luYykge1xcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuYXN5bmNLZXkgPyBkYXRhW3RoaXMuYXN5bmNLZXldIDogZGF0YVxcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IChkYXRhIHx8IFtdKS5maWx0ZXIodmFsdWUgPT4ge1xcclxcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgeyByZXR1cm4gdHJ1ZSB9XFxyXFxuICAgICAgICAgIHZhbHVlID0gdGhpcy5tYXRjaENhc2UgPyB2YWx1ZSA6IHZhbHVlLnRvTG93ZXJDYXNlKClcXHJcXG4gICAgICAgICAgdmFyIHF1ZXJ5ID0gdGhpcy5tYXRjaENhc2UgPyB0aGlzLnZhbCA6IHRoaXMudmFsLnRvTG93ZXJDYXNlKClcXHJcXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hTdGFydCA/IHZhbHVlLmluZGV4T2YocXVlcnkpID09PSAwIDogdmFsdWUuaW5kZXhPZihxdWVyeSkgIT09IC0xXFxyXFxuICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KVxcclxcbiAgICAgIH1cXHJcXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMFxcclxcbiAgICB9LFxcclxcbiAgICBzZXRWYWx1ZSAodmFsdWUpIHtcXHJcXG4gICAgICB0aGlzLmFzaWduID0gdmFsdWVcXHJcXG4gICAgICB0aGlzLnZhbCA9IHZhbHVlXFxyXFxuICAgICAgdGhpcy5pdGVtcyA9IFtdXFxyXFxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIHJlc2V0ICgpIHsgdGhpcy5zZXRWYWx1ZShudWxsKSB9LFxcclxcbiAgICBzZXRBY3RpdmUgKGluZGV4KSB7IHRoaXMuY3VycmVudCA9IGluZGV4IH0sXFxyXFxuICAgIGlzQWN0aXZlIChpbmRleCkgeyByZXR1cm4gdGhpcy5jdXJyZW50ID09PSBpbmRleCB9LFxcclxcbiAgICBoaXQgKGUpIHtcXHJcXG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcXHJcXG4gICAgICB0aGlzLnNldFZhbHVlKHRoaXMub25IaXQodGhpcy5pdGVtc1t0aGlzLmN1cnJlbnRdLCB0aGlzKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdXAgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQgPiAwKSB7IHRoaXMuY3VycmVudC0tIH1cXHJcXG4gICAgICBlbHNlIHsgdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgZG93biAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkgeyB0aGlzLmN1cnJlbnQrKyB9XFxyXFxuICAgICAgZWxzZSB7IHRoaXMuY3VycmVudCA9IDAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX191cGRhdGUgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMudmFsKSB7XFxyXFxuICAgICAgICB0aGlzLnJlc2V0KClcXHJcXG4gICAgICAgIHJldHVyblxcclxcbiAgICAgIH1cXHJcXG4gICAgICB0aGlzLmFzaWduID0gJydcXHJcXG4gICAgICBpZiAodGhpcy5hc3luYykge1xcclxcbiAgICAgICAgZ2V0SlNPTih0aGlzLmFzeW5jICsgdGhpcy52YWwpLnRoZW4oZGF0YSA9PiB7XFxyXFxuICAgICAgICAgIHRoaXMuc2V0SXRlbXMoZGF0YSlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEpIHtcXHJcXG4gICAgICAgIHRoaXMuc2V0SXRlbXModGhpcy5kYXRhKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSwgJ2RlbGF5JywgREVMQVkpXFxyXFxuICAgIHRoaXMuX191cGRhdGUoKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTkwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdHlwZW9mMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTkxKTtcblx0XG5cdHZhciBfdHlwZW9mMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3R5cGVvZjIpO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdHZhciBERUxBWSA9IDMwMDsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYXN5bmM6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBkYXRhOiB7IHR5cGU6IEFycmF5IH0sXG5cdCAgICBkZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IERFTEFZIH0sXG5cdCAgICBhc3luY0tleTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogOCB9LFxuXHQgICAgbWF0Y2hDYXNlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBtYXRjaFN0YXJ0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBvbkhpdDoge1xuXHQgICAgICB0eXBlOiBGdW5jdGlvbixcblx0ICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoaXRlbSkge1xuXHQgICAgICAgIHJldHVybiBpdGVtO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0ZW1wbGF0ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCcgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFzaWduOiAnJyxcblx0ICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcblx0ICAgICAgbm9SZXN1bHRzOiB0cnVlLFxuXHQgICAgICBjdXJyZW50OiAwLFxuXHQgICAgICBpdGVtczogW10sXG5cdCAgICAgIHZhbDogdGhpcy52YWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdGVtcGxhdGVDb21wOiBmdW5jdGlvbiB0ZW1wbGF0ZUNvbXAoKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdGVtcGxhdGU6IHR5cGVvZiB0aGlzLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/ICc8c3Bhbj4nICsgdGhpcy50ZW1wbGF0ZSArICc8L3NwYW4+JyA6ICc8c3Ryb25nIHYtaHRtbD1cIml0ZW1cIj48L3N0cm9uZz4nLFxuXHQgICAgICAgIHByb3BzOiB7IGl0ZW06IHsgZGVmYXVsdDogbnVsbCB9IH1cblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCAmJiBfdmFsICE9PSB0aGlzLmFzaWduKSB0aGlzLl9fdXBkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZXRJdGVtczogZnVuY3Rpb24gc2V0SXRlbXMoZGF0YSkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcblx0ICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5hc3luY0tleSA/IGRhdGFbdGhpcy5hc3luY0tleV0gOiBkYXRhO1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkodmFsdWUpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB2YWx1ZSA9IF90aGlzLm1hdGNoQ2FzZSA/IHZhbHVlIDogdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICAgIHZhciBxdWVyeSA9IF90aGlzLm1hdGNoQ2FzZSA/IF90aGlzLnZhbCA6IF90aGlzLnZhbC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMTtcblx0ICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMDtcblx0ICAgIH0sXG5cdCAgICBzZXRWYWx1ZTogZnVuY3Rpb24gc2V0VmFsdWUodmFsdWUpIHtcblx0ICAgICAgdGhpcy5hc2lnbiA9IHZhbHVlO1xuXHQgICAgICB0aGlzLnZhbCA9IHZhbHVlO1xuXHQgICAgICB0aGlzLml0ZW1zID0gW107XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy5zZXRWYWx1ZShudWxsKTtcblx0ICAgIH0sXG5cdCAgICBzZXRBY3RpdmU6IGZ1bmN0aW9uIHNldEFjdGl2ZShpbmRleCkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQgPSBpbmRleDtcblx0ICAgIH0sXG5cdCAgICBpc0FjdGl2ZTogZnVuY3Rpb24gaXNBY3RpdmUoaW5kZXgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY3VycmVudCA9PT0gaW5kZXg7XG5cdCAgICB9LFxuXHQgICAgaGl0OiBmdW5jdGlvbiBoaXQoZSkge1xuXHQgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5vbkhpdCh0aGlzLml0ZW1zW3RoaXMuY3VycmVudF0sIHRoaXMpKTtcblx0ICAgIH0sXG5cdCAgICB1cDogZnVuY3Rpb24gdXAoKSB7XG5cdCAgICAgIGlmICh0aGlzLmN1cnJlbnQgPiAwKSB7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50LS07XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZG93bjogZnVuY3Rpb24gZG93bigpIHtcblx0ICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkge1xuXHQgICAgICAgIHRoaXMuY3VycmVudCsrO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuY3VycmVudCA9IDA7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9fdXBkYXRlID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnZhbCkge1xuXHQgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hc2lnbiA9ICcnO1xuXHQgICAgICBpZiAodGhpcy5hc3luYykge1xuXHQgICAgICAgICgwLCBfdXRpbHMuZ2V0SlNPTikodGhpcy5hc3luYyArIHRoaXMudmFsKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICBfdGhpczIuc2V0SXRlbXMoZGF0YSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG5cdCAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpO1xuXHQgICAgICB9XG5cdCAgICB9LCAnZGVsYXknLCBERUxBWSk7XG5cdCAgICB0aGlzLl9fdXBkYXRlKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHR2YXIgX2l0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cdFxuXHR2YXIgX2l0ZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2l0ZXJhdG9yKTtcblx0XG5cdHZhciBfc3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTIpO1xuXHRcblx0dmFyIF9zeW1ib2wyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltYm9sKTtcblx0XG5cdHZhciBfdHlwZW9mID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgX2l0ZXJhdG9yMi5kZWZhdWx0ID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mKF9pdGVyYXRvcjIuZGVmYXVsdCkgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG5cdCAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xuXHR9IDogZnVuY3Rpb24gKG9iaikge1xuXHQgIHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5MyksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDE5MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxOTQpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjA0KTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMDUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNykuU3ltYm9sO1xuXG4vKioqLyB9LFxuLyogMTk0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdC8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cblx0dmFyIGdsb2JhbCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuXHQgICwgaGFzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgREVTQ1JJUFRPUlMgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KVxuXHQgICwgJGV4cG9ydCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCByZWRlZmluZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpXG5cdCAgLCBNRVRBICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk1KS5LRVlcblx0ICAsICRmYWlscyAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNilcblx0ICAsIHNoYXJlZCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Mylcblx0ICAsIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Nylcblx0ICAsIHVpZCAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NClcblx0ICAsIHdrcyAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OClcblx0ICAsIHdrc0V4dCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSlcblx0ICAsIHdrc0RlZmluZSAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTYpXG5cdCAgLCBrZXlPZiAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk3KVxuXHQgICwgZW51bUtleXMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OClcblx0ICAsIGlzQXJyYXkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDEpXG5cdCAgLCBhbk9iamVjdCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCB0b0lPYmplY3QgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b1ByaW1pdGl2ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG5cdCAgLCBjcmVhdGVEZXNjICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCBfY3JlYXRlICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpXG5cdCAgLCBnT1BORXh0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNjApXG5cdCAgLCAkR09QRCAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjAyKVxuXHQgICwgJERQICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuXHQgICwgJGtleXMgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgZ09QRCAgICAgICAgICAgPSAkR09QRC5mXG5cdCAgLCBkUCAgICAgICAgICAgICA9ICREUC5mXG5cdCAgLCBnT1BOICAgICAgICAgICA9IGdPUE5FeHQuZlxuXHQgICwgJFN5bWJvbCAgICAgICAgPSBnbG9iYWwuU3ltYm9sXG5cdCAgLCAkSlNPTiAgICAgICAgICA9IGdsb2JhbC5KU09OXG5cdCAgLCBfc3RyaW5naWZ5ICAgICA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeVxuXHQgICwgUFJPVE9UWVBFICAgICAgPSAncHJvdG90eXBlJ1xuXHQgICwgSElEREVOICAgICAgICAgPSB3a3MoJ19oaWRkZW4nKVxuXHQgICwgVE9fUFJJTUlUSVZFICAgPSB3a3MoJ3RvUHJpbWl0aXZlJylcblx0ICAsIGlzRW51bSAgICAgICAgID0ge30ucHJvcGVydHlJc0VudW1lcmFibGVcblx0ICAsIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKVxuXHQgICwgQWxsU3ltYm9scyAgICAgPSBzaGFyZWQoJ3N5bWJvbHMnKVxuXHQgICwgT1BTeW1ib2xzICAgICAgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKVxuXHQgICwgT2JqZWN0UHJvdG8gICAgPSBPYmplY3RbUFJPVE9UWVBFXVxuXHQgICwgVVNFX05BVElWRSAgICAgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nXG5cdCAgLCBRT2JqZWN0ICAgICAgICA9IGdsb2JhbC5RT2JqZWN0O1xuXHQvLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcblx0dmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cdFxuXHQvLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcblx0dmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG5cdCAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBkUCh0aGlzLCAnYScsIHt2YWx1ZTogN30pLmE7IH1cblx0ICB9KSkuYSAhPSA3O1xuXHR9KSA/IGZ1bmN0aW9uKGl0LCBrZXksIEQpe1xuXHQgIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuXHQgIGlmKHByb3RvRGVzYylkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcblx0ICBkUChpdCwga2V5LCBEKTtcblx0ICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKWRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG5cdH0gOiBkUDtcblx0XG5cdHZhciB3cmFwID0gZnVuY3Rpb24odGFnKXtcblx0ICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuXHQgIHN5bS5fayA9IHRhZztcblx0ICByZXR1cm4gc3ltO1xuXHR9O1xuXHRcblx0dmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xuXHR9IDogZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG5cdH07XG5cdFxuXHR2YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCl7XG5cdCAgaWYoaXQgPT09IE9iamVjdFByb3RvKSRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG5cdCAgYW5PYmplY3QoaXQpO1xuXHQgIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG5cdCAgYW5PYmplY3QoRCk7XG5cdCAgaWYoaGFzKEFsbFN5bWJvbHMsIGtleSkpe1xuXHQgICAgaWYoIUQuZW51bWVyYWJsZSl7XG5cdCAgICAgIGlmKCFoYXMoaXQsIEhJRERFTikpZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuXHQgICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSlpdFtISURERU5dW2tleV0gPSBmYWxzZTtcblx0ICAgICAgRCA9IF9jcmVhdGUoRCwge2VudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpfSk7XG5cdCAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuXHQgIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xuXHR9O1xuXHR2YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKXtcblx0ICBhbk9iamVjdChpdCk7XG5cdCAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKVxuXHQgICAgLCBpICAgID0gMFxuXHQgICAgLCBsID0ga2V5cy5sZW5ndGhcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKGwgPiBpKSRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblx0dmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApe1xuXHQgIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcblx0fTtcblx0dmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSl7XG5cdCAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcblx0ICBpZih0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSlyZXR1cm4gZmFsc2U7XG5cdCAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xuXHR9O1xuXHR2YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcblx0ICBpdCAgPSB0b0lPYmplY3QoaXQpO1xuXHQgIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG5cdCAgaWYoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybjtcblx0ICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG5cdCAgaWYoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKUQuZW51bWVyYWJsZSA9IHRydWU7XG5cdCAgcmV0dXJuIEQ7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuXHQgIHZhciBuYW1lcyAgPSBnT1BOKHRvSU9iamVjdChpdCkpXG5cdCAgICAsIHJlc3VsdCA9IFtdXG5cdCAgICAsIGkgICAgICA9IDBcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpe1xuXHQgICAgaWYoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKXJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfSByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXHR2YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCl7XG5cdCAgdmFyIElTX09QICA9IGl0ID09PSBPYmplY3RQcm90b1xuXHQgICAgLCBuYW1lcyAgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSlcblx0ICAgICwgcmVzdWx0ID0gW11cblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG5cdCAgICBpZihoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcblx0ICB9IHJldHVybiByZXN1bHQ7XG5cdH07XG5cdFxuXHQvLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcblx0aWYoIVVTRV9OQVRJVkUpe1xuXHQgICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKXtcblx0ICAgIGlmKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKXRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuXHQgICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG5cdCAgICB2YXIgJHNldCA9IGZ1bmN0aW9uKHZhbHVlKXtcblx0ICAgICAgaWYodGhpcyA9PT0gT2JqZWN0UHJvdG8pJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuXHQgICAgICBpZihoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKXRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG5cdCAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG5cdCAgICB9O1xuXHQgICAgaWYoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKXNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8sIHRhZywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0fSk7XG5cdCAgICByZXR1cm4gd3JhcCh0YWcpO1xuXHQgIH07XG5cdCAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuXHQgICAgcmV0dXJuIHRoaXMuX2s7XG5cdCAgfSk7XG5cdFxuXHQgICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXHQgICREUC5mICAgPSAkZGVmaW5lUHJvcGVydHk7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXyg2MSkuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oMjAwKS5mICA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0ICBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OSkuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cdFxuXHQgIGlmKERFU0NSSVBUT1JTICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KSl7XG5cdCAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcblx0ICB9XG5cdFxuXHQgIHdrc0V4dC5mID0gZnVuY3Rpb24obmFtZSl7XG5cdCAgICByZXR1cm4gd3JhcCh3a3MobmFtZSkpO1xuXHQgIH1cblx0fVxuXHRcblx0JGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1N5bWJvbDogJFN5bWJvbH0pO1xuXHRcblx0Zm9yKHZhciBzeW1ib2xzID0gKFxuXHQgIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG5cdCAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuXHQpLnNwbGl0KCcsJyksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3Moc3ltYm9sc1tpKytdKTtcblx0XG5cdGZvcih2YXIgc3ltYm9scyA9ICRrZXlzKHdrcy5zdG9yZSksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3NEZWZpbmUoc3ltYm9sc1tpKytdKTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG5cdCAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG5cdCAgJ2Zvcic6IGZ1bmN0aW9uKGtleSl7XG5cdCAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG5cdCAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuXHQgICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG5cdCAgfSxcblx0ICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcblx0ICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihrZXkpe1xuXHQgICAgaWYoaXNTeW1ib2woa2V5KSlyZXR1cm4ga2V5T2YoU3ltYm9sUmVnaXN0cnksIGtleSk7XG5cdCAgICB0aHJvdyBUeXBlRXJyb3Ioa2V5ICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG5cdCAgfSxcblx0ICB1c2VTZXR0ZXI6IGZ1bmN0aW9uKCl7IHNldHRlciA9IHRydWU7IH0sXG5cdCAgdXNlU2ltcGxlOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSBmYWxzZTsgfVxuXHR9KTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG5cdCAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuXHQgIGNyZWF0ZTogJGNyZWF0ZSxcblx0ICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcblx0ICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuXHQgIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG5cdCAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG5cdCAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuXHQgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcblx0ICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuXHQgIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuXHQgIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcblx0ICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcblx0fSk7XG5cdFxuXHQvLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcblx0JEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uKCl7XG5cdCAgdmFyIFMgPSAkU3ltYm9sKCk7XG5cdCAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cblx0ICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcblx0ICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuXHQgIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7YTogU30pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG5cdH0pKSwgJ0pTT04nLCB7XG5cdCAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpe1xuXHQgICAgaWYoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG5cdCAgICB2YXIgYXJncyA9IFtpdF1cblx0ICAgICAgLCBpICAgID0gMVxuXHQgICAgICAsIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG5cdCAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuXHQgICAgcmVwbGFjZXIgPSBhcmdzWzFdO1xuXHQgICAgaWYodHlwZW9mIHJlcGxhY2VyID09ICdmdW5jdGlvbicpJHJlcGxhY2VyID0gcmVwbGFjZXI7XG5cdCAgICBpZigkcmVwbGFjZXIgfHwgIWlzQXJyYXkocmVwbGFjZXIpKXJlcGxhY2VyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG5cdCAgICAgIGlmKCRyZXBsYWNlcil2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuXHQgICAgICBpZighaXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTtcblx0ICAgIH07XG5cdCAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG5cdCAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG5cdCAgfVxuXHR9KTtcblx0XG5cdC8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcblx0JFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgX193ZWJwYWNrX3JlcXVpcmVfXygxMCkoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcblx0Ly8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG5cdC8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cblx0c2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcblx0Ly8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cblx0c2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG5cbi8qKiovIH0sXG4vKiAxOTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBNRVRBICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDQpKCdtZXRhJylcblx0ICAsIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMylcblx0ICAsIGhhcyAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHNldERlc2MgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZlxuXHQgICwgaWQgICAgICAgPSAwO1xuXHR2YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbigpe1xuXHQgIHJldHVybiB0cnVlO1xuXHR9O1xuXHR2YXIgRlJFRVpFID0gIV9fd2VicGFja19yZXF1aXJlX18oMTYpKGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcblx0fSk7XG5cdHZhciBzZXRNZXRhID0gZnVuY3Rpb24oaXQpe1xuXHQgIHNldERlc2MoaXQsIE1FVEEsIHt2YWx1ZToge1xuXHQgICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG5cdCAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuXHQgIH19KTtcblx0fTtcblx0dmFyIGZhc3RLZXkgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcblx0ICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG5cdCAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuXHQgIGlmKCFoYXMoaXQsIE1FVEEpKXtcblx0ICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG5cdCAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuXHQgICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcblx0ICAgIGlmKCFjcmVhdGUpcmV0dXJuICdFJztcblx0ICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG5cdCAgICBzZXRNZXRhKGl0KTtcblx0ICAvLyByZXR1cm4gb2JqZWN0IElEXG5cdCAgfSByZXR1cm4gaXRbTUVUQV0uaTtcblx0fTtcblx0dmFyIGdldFdlYWsgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcblx0ICBpZighaGFzKGl0LCBNRVRBKSl7XG5cdCAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuXHQgICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuIHRydWU7XG5cdCAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuXHQgICAgaWYoIWNyZWF0ZSlyZXR1cm4gZmFsc2U7XG5cdCAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuXHQgICAgc2V0TWV0YShpdCk7XG5cdCAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcblx0ICB9IHJldHVybiBpdFtNRVRBXS53O1xuXHR9O1xuXHQvLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcblx0dmFyIG9uRnJlZXplID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSlzZXRNZXRhKGl0KTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cdHZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdCAgS0VZOiAgICAgIE1FVEEsXG5cdCAgTkVFRDogICAgIGZhbHNlLFxuXHQgIGZhc3RLZXk6ICBmYXN0S2V5LFxuXHQgIGdldFdlYWs6ICBnZXRXZWFrLFxuXHQgIG9uRnJlZXplOiBvbkZyZWV6ZVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZ2xvYmFsICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBjb3JlICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIExJQlJBUlkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNylcblx0ICAsIHdrc0V4dCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSlcblx0ICAsIGRlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZjtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcblx0ICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuXHQgIGlmKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwge3ZhbHVlOiB3a3NFeHQuZihuYW1lKX0pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZ2V0S2V5cyAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNClcblx0ICAsIHRvSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgZWwpe1xuXHQgIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuXHQgICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG5cdCAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG5cdCAgICAsIGluZGV4ICA9IDBcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKGxlbmd0aCA+IGluZGV4KWlmKE9ba2V5ID0ga2V5c1tpbmRleCsrXV0gPT09IGVsKXJldHVybiBrZXk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG5cdHZhciBnZXRLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNClcblx0ICAsIGdPUFMgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OSlcblx0ICAsIHBJRSAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHZhciByZXN1bHQgICAgID0gZ2V0S2V5cyhpdClcblx0ICAgICwgZ2V0U3ltYm9scyA9IGdPUFMuZjtcblx0ICBpZihnZXRTeW1ib2xzKXtcblx0ICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdClcblx0ICAgICAgLCBpc0VudW0gID0gcElFLmZcblx0ICAgICAgLCBpICAgICAgID0gMFxuXHQgICAgICAsIGtleTtcblx0ICAgIHdoaWxlKHN5bWJvbHMubGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSlyZXN1bHQucHVzaChrZXkpO1xuXHQgIH0gcmV0dXJuIHJlc3VsdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0ZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqKi8gfSxcbi8qIDIwMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0ZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKiovIH0sXG4vKiAyMDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG5cdHZhciBjb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKXtcblx0ICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDIwMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIHBJRSAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDApXG5cdCAgLCBjcmVhdGVEZXNjICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCB0b0lPYmplY3QgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b1ByaW1pdGl2ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBJRThfRE9NX0RFRklORSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpXG5cdCAgLCBnT1BEICAgICAgICAgICA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdFxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCl7XG5cdCAgTyA9IHRvSU9iamVjdChPKTtcblx0ICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG5cdCAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcblx0ICAgIHJldHVybiBnT1BEKE8sIFApO1xuXHQgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblx0ICBpZihoYXMoTywgUCkpcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXG5cbi8qKiovIH0sXG4vKiAyMDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTk2KSgnYXN5bmNJdGVyYXRvcicpO1xuXG4vKioqLyB9LFxuLyogMjA1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE5NikoJ29ic2VydmFibGUnKTtcblxuLyoqKi8gfSxcbi8qIDIwNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICBvcGVuOiBfdm0uc2hvd0Ryb3Bkb3duXG5cdCAgICB9LFxuXHQgICAgc3RhdGljU3R5bGU6IHtcblx0ICAgICAgXCJwb3NpdGlvblwiOiBcInJlbGF0aXZlXCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwibW9kZWxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLnZhbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwidmFsXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uX3MoX3ZtLnZhbClcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImJsdXJcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnNob3dEcm9wZG93biA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwia2V5ZG93blwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJkb3duXCIsIDQwKSkgeyByZXR1cm47IH1cblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uZG93bigkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5oaXQoJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnJlc2V0KCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJ1cFwiLCAzOCkpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnVwKCRldmVudClcblx0ICAgICAgfV0sXG5cdCAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHJlZjogXCJkcm9wZG93blwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZHJvcGRvd24tbWVudVwiXG5cdCAgfSwgX3ZtLl9sKChfdm0uaXRlbXMpLCBmdW5jdGlvbihpdGVtLCBpKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICBhY3RpdmU6IF92bS5pc0FjdGl2ZShpKVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgICB9LFxuXHQgICAgICAgIFwibW91c2Vtb3ZlXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLnNldEFjdGl2ZShpKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fYyhfdm0udGVtcGxhdGVDb21wLCB7XG5cdCAgICAgIHRhZzogXCJjb21wb25lbnRcIixcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcIml0ZW1cIjogaXRlbVxuXHQgICAgICB9XG5cdCAgICB9KV0sIDEpXSlcblx0ICB9KSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi01YjVmNWU5NFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfVxuLyoqKioqKi8gXSlcbn0pO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dnVlLXN0cmFwLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi92dWUtc3RyYXAvZGlzdC92dWUtc3RyYXAuanNcbi8vIG1vZHVsZSBpZCA9IDQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 43 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"// style-loader: Adds some css to the DOM by adding a \" ).appendTo( body );\n\t\t}\n\n\t\tif ( o.opacity ) { // opacity option\n\t\t\tif ( this.helper.css( \"opacity\" ) ) {\n\t\t\t\tthis._storedOpacity = this.helper.css( \"opacity\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"opacity\", o.opacity );\n\t\t}\n\n\t\tif ( o.zIndex ) { // zIndex option\n\t\t\tif ( this.helper.css( \"zIndex\" ) ) {\n\t\t\t\tthis._storedZIndex = this.helper.css( \"zIndex\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"zIndex\", o.zIndex );\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"start\", event, this._uiHash() );\n\n\t\t//Recache the helper size\n\t\tif ( !this._preserveHelperProportions ) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif ( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis._addClass( this.helper, \"ui-sortable-helper\" );\n\n\t\t// Execute the drag once - this causes the helper not to be visiblebefore getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event );\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\tif ( !this.lastPositionAbs ) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif ( this.options.scroll ) {\n\t\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\n\t\t\t\tif ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -\n\t\t\t\t\t\tevent.pageY < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -\n\t\t\t\t\t\tevent.pageX < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Set the helper position\n\t\tif ( !this.options.axis || this.options.axis !== \"y\" ) {\n\t\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( !this.options.axis || this.options.axis !== \"x\" ) {\n\t\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[ i ];\n\t\t\titemElement = item.item[ 0 ];\n\t\t\tintersection = this._intersectsWithPointer( item );\n\t\t\tif ( !intersection ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif ( item.instance !== this.currentContainer ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif ( itemElement !== this.currentItem[ 0 ] &&\n\t\t\t\tthis.placeholder[ intersection === 1 ? \"next\" : \"prev\" ]()[ 0 ] !== itemElement &&\n\t\t\t\t!$.contains( this.placeholder[ 0 ], itemElement ) &&\n\t\t\t\t( this.options.type === \"semi-dynamic\" ?\n\t\t\t\t\t!$.contains( this.element[ 0 ], itemElement ) :\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif ( this.options.tolerance === \"pointer\" || this._intersectsWithSides( item ) ) {\n\t\t\t\t\tthis._rearrange( event, item );\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers( event );\n\n\t\t//Interconnect with droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"sort\", event, this._uiHash() );\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function( event, noPropagation ) {\n\n\t\tif ( !event ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\tif ( this.options.revert ) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollLeft\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollTop\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$( this.helper ).animate(\n\t\t\t\tanimation,\n\t\t\t\tparseInt( this.options.revert, 10 ) || 500,\n\t\t\t\tfunction() {\n\t\t\t\t\tthat._clear( event );\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tthis._clear( event, noPropagation );\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: null } ) );\n\n\t\t\tif ( this.options.helper === \"original\" ) {\n\t\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor ( var i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"deactivate\", null, this._uiHash( this ) );\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", null, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.placeholder ) {\n\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t\t// it unbinds ALL events from the original node!\n\t\t\tif ( this.placeholder[ 0 ].parentNode ) {\n\t\t\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\t\t\t}\n\t\t\tif ( this.options.helper !== \"original\" && this.helper &&\n\t\t\t\t\tthis.helper[ 0 ].parentNode ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t} );\n\n\t\t\tif ( this.domPosition.prev ) {\n\t\t\t\t$( this.domPosition.prev ).after( this.currentItem );\n\t\t\t} else {\n\t\t\t\t$( this.domPosition.parent ).prepend( this.currentItem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$( items ).each( function() {\n\t\t\tvar res = ( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" )\n\t\t\t\t.match( o.expression || ( /(.+)[\\-=_](.+)/ ) );\n\t\t\tif ( res ) {\n\t\t\t\tstr.push(\n\t\t\t\t\t( o.key || res[ 1 ] + \"[]\" ) +\n\t\t\t\t\t\"=\" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );\n\t\t\t}\n\t\t} );\n\n\t\tif ( !str.length && o.key ) {\n\t\t\tstr.push( o.key + \"=\" );\n\t\t}\n\n\t\treturn str.join( \"&\" );\n\n\t},\n\n\ttoArray: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each( function() {\n\t\t\tret.push( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" );\n\t\t} );\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function( item ) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t &&\n\t\t\t\t( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l &&\n\t\t\t\t( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t( this.options.tolerance !== \"pointer\" &&\n\t\t\t\tthis.helperProportions[ this.floating ? \"width\" : \"height\" ] >\n\t\t\t\titem[ this.floating ? \"width\" : \"height\" ] )\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( this.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( this.helperProportions.height / 2 ) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function( item ) {\n\t\tvar verticalDirection, horizontalDirection,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.top + this.offset.click.top, item.top, item.height ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.left + this.offset.click.left, item.left, item.width ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( !isOverElement ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tverticalDirection = this._getDragVerticalDirection();\n\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\treturn this.floating ?\n\t\t\t( ( horizontalDirection === \"right\" || verticalDirection === \"down\" ) ? 2 : 1 )\n\t\t\t: ( verticalDirection && ( verticalDirection === \"down\" ? 2 : 1 ) );\n\n\t},\n\n\t_intersectsWithSides: function( item ) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis( this.positionAbs.top +\n\t\t\t\tthis.offset.click.top, item.top + ( item.height / 2 ), item.height ),\n\t\t\tisOverRightHalf = this._isOverAxis( this.positionAbs.left +\n\t\t\t\tthis.offset.click.left, item.left + ( item.width / 2 ), item.width ),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif ( this.floating && horizontalDirection ) {\n\t\t\treturn ( ( horizontalDirection === \"right\" && isOverRightHalf ) ||\n\t\t\t\t( horizontalDirection === \"left\" && !isOverRightHalf ) );\n\t\t} else {\n\t\t\treturn verticalDirection && ( ( verticalDirection === \"down\" && isOverBottomHalf ) ||\n\t\t\t\t( verticalDirection === \"up\" && !isOverBottomHalf ) );\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && ( delta > 0 ? \"down\" : \"up\" );\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && ( delta > 0 ? \"right\" : \"left\" );\n\t},\n\n\trefresh: function( event ) {\n\t\tthis._refreshItems( event );\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ?\n\t\t\t[ options.connectWith ] :\n\t\t\toptions.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function( connected ) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif ( connectWith && connected ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items.call( inst.element ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-placeholder\" ), inst ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push( [ $.isFunction( this.options.items ) ?\n\t\t\tthis.options.items\n\t\t\t\t.call( this.element, null, { options: this.options, item: this.currentItem } ) :\n\t\t\t$( this.options.items, this.element )\n\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t.not( \".ui-sortable-placeholder\" ), this ] );\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\tqueries[ i ][ 0 ].each( addItems );\n\t\t}\n\n\t\treturn $( items );\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find( \":data(\" + this.widgetName + \"-item)\" );\n\n\t\tthis.items = $.grep( this.items, function( item ) {\n\t\t\tfor ( var j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === item.item[ 0 ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t},\n\n\t_refreshItems: function( event ) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [ this ];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [ [ $.isFunction( this.options.items ) ?\n\t\t\t\tthis.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t$( this.options.items, this.element ), this ] ],\n\t\t\tconnectWith = this._connectWith();\n\n\t\t//Shouldn't be run the first time through due to massive slow-down\n\t\tif ( connectWith && this.ready ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items\n\t\t\t\t\t\t\t\t.call( inst.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element ), inst ] );\n\t\t\t\t\t\tthis.containers.push( inst );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\ttargetData = queries[ i ][ 1 ];\n\t\t\t_queries = queries[ i ][ 0 ];\n\n\t\t\tfor ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {\n\t\t\t\titem = $( _queries[ j ] );\n\n\t\t\t\t// Data for target checking (mouse manager)\n\t\t\t\titem.data( this.widgetName + \"-item\", targetData );\n\n\t\t\t\titems.push( {\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function( fast ) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent,\n\t\t// the offsetParent's position will change\n\t\tif ( this.offsetParent && this.helper ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif ( item.instance !== this.currentContainer && this.currentContainer &&\n\t\t\t\t\titem.item[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ?\n\t\t\t\t$( this.options.toleranceElement, item.item ) :\n\t\t\t\titem.item;\n\n\t\t\tif ( !fast ) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif ( this.options.custom && this.options.custom.refreshContainers ) {\n\t\t\tthis.options.custom.refreshContainers.call( this );\n\t\t} else {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tp = this.containers[ i ].element.offset();\n\t\t\t\tthis.containers[ i ].containerCache.left = p.left;\n\t\t\t\tthis.containers[ i ].containerCache.top = p.top;\n\t\t\t\tthis.containers[ i ].containerCache.width =\n\t\t\t\t\tthis.containers[ i ].element.outerWidth();\n\t\t\t\tthis.containers[ i ].containerCache.height =\n\t\t\t\t\tthis.containers[ i ].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function( that ) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif ( !o.placeholder || o.placeholder.constructor === String ) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[ 0 ] );\n\n\t\t\t\t\t\tthat._addClass( element, \"ui-sortable-placeholder\",\n\t\t\t\t\t\t\t\tclassName || that.currentItem[ 0 ].className )\n\t\t\t\t\t\t\t._removeClass( element, \"ui-sortable-helper\" );\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function( container, p ) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes -\n\t\t\t\t\t// the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n\t\t\t\t\t// class name is specified\n\t\t\t\t\tif ( className && !o.forcePlaceholderSize ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming\n\t\t\t\t\t// from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif ( !p.height() ) {\n\t\t\t\t\t\tp.height(\n\t\t\t\t\t\t\tthat.currentItem.innerHeight() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingTop\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingBottom\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( !p.width() ) {\n\t\t\t\t\t\tp.width(\n\t\t\t\t\t\t\tthat.currentItem.innerWidth() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingLeft\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingRight\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after( that.placeholder );\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update( that, that.placeholder );\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each( function() {\n\t\t\t$( \" \", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t} );\n\t},\n\n\t_contactContainers: function( event ) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,\n\t\t\tfloating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// Get innermost container that intersects with item\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\n\t\t\t// Never consider a container that's located within the item itself\n\t\t\tif ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this._intersectsWith( this.containers[ i ].containerCache ) ) {\n\n\t\t\t\t// If we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif ( innermostContainer &&\n\t\t\t\t\t\t$.contains(\n\t\t\t\t\t\t\tthis.containers[ i ].element[ 0 ],\n\t\t\t\t\t\t\tinnermostContainer.element[ 0 ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[ i ];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", event, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// If no intersecting containers found, return\n\t\tif ( !innermostContainer ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the item into the container if it's not there already\n\t\tif ( this.containers.length === 1 ) {\n\t\t\tif ( !this.containers[ innermostIndex ].containerCache.over ) {\n\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// When entering a new container, we will find the item with the least distance and\n\t\t\t// append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating( this.currentItem );\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"pageX\" : \"pageY\";\n\n\t\t\tfor ( j = this.items.length - 1; j >= 0; j-- ) {\n\t\t\t\tif ( !$.contains(\n\t\t\t\t\t\tthis.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[ j ].item.offset()[ posProperty ];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\" : \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.currentContainer === this.containers[ innermostIndex ] ) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ?\n\t\t\t\tthis._rearrange( event, itemWithLeastDistance, null, true ) :\n\t\t\t\tthis._rearrange( event, null, this.containers[ innermostIndex ].element, true );\n\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"change\", event, this._uiHash( this ) );\n\t\t\tthis.currentContainer = this.containers[ innermostIndex ];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update( this.currentContainer, this.placeholder );\n\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t}\n\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction( o.helper ) ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem );\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\t$( o.appendTo !== \"parent\" ?\n\t\t\t\to.appendTo :\n\t\t\t\tthis.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );\n\t\t}\n\n\t\tif ( helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tthis._storedCSS = {\n\t\t\t\twidth: this.currentItem[ 0 ].style.width,\n\t\t\t\theight: this.currentItem[ 0 ].style.height,\n\t\t\t\tposition: this.currentItem.css( \"position\" ),\n\t\t\t\ttop: this.currentItem.css( \"top\" ),\n\t\t\t\tleft: this.currentItem.css( \"left\" )\n\t\t\t};\n\t\t}\n\n\t\tif ( !helper[ 0 ].style.width || o.forceHelperSize ) {\n\t\t\thelper.width( this.currentItem.width() );\n\t\t}\n\t\tif ( !helper[ 0 ].style.height || o.forceHelperSize ) {\n\t\t\thelper.height( this.currentItem.height() );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( $.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this\n\t\t// information with an ugly IE fix\n\t\tif ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||\n\t\t\t\t( this.offsetParent[ 0 ].tagName &&\n\t\t\t\tthis.offsetParent[ 0 ].tagName.toLowerCase() === \"html\" && $.ui.ie ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif ( this.cssPosition === \"relative\" ) {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.currentItem.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.currentItem.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\t\tif ( o.containment === \"document\" || o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ?\n\t\t\t\t\tthis.document.width() :\n\t\t\t\t\tthis.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( o.containment === \"document\" ?\n\t\t\t\t\t( this.document.height() || document.body.parentNode.scrollHeight ) :\n\t\t\t\t\tthis.window.height() || this.document[ 0 ].body.parentNode.scrollHeight\n\t\t\t\t) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {\n\t\t\tce = $( o.containment )[ 0 ];\n\t\t\tco = $( o.containment ).offset();\n\t\t\tover = ( $( ce ).css( \"overflow\" ) !== \"hidden\" );\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + ( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingLeft\" ), 10 ) || 0 ) - this.margins.left,\n\t\t\t\tco.top + ( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingTop\" ), 10 ) || 0 ) - this.margins.top,\n\t\t\t\tco.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\tco.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :\n\t\t\t\t\tscroll.scrollLeft() ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event ) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif ( this.cssPosition === \"relative\" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif ( this.originalPosition ) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {\n\t\t\t\t\tpageX = this.containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {\n\t\t\t\t\tpageY = this.containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {\n\t\t\t\t\tpageX = this.containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {\n\t\t\t\t\tpageY = this.containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\t\t\t\ttop = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /\n\t\t\t\t\to.grid[ 1 ] ) * o.grid[ 1 ];\n\t\t\t\tpageY = this.containment ?\n\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] &&\n\t\t\t\t\t\ttop - this.offset.click.top <= this.containment[ 3 ] ) ?\n\t\t\t\t\t\t\ttop :\n\t\t\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?\n\t\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :\n\t\t\t\t\t\t\t\ttop;\n\n\t\t\t\tleft = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /\n\t\t\t\t\to.grid[ 0 ] ) * o.grid[ 0 ];\n\t\t\t\tpageX = this.containment ?\n\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] &&\n\t\t\t\t\t\tleft - this.offset.click.left <= this.containment[ 2 ] ) ?\n\t\t\t\t\t\t\tleft :\n\t\t\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?\n\t\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :\n\t\t\t\t\t\t\t\tleft;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() :\n\t\t\t\t\tscrollIsRootNode ? 0 : scroll.scrollLeft() ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function( event, i, a, hardRefresh ) {\n\n\t\ta ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :\n\t\t\ti.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],\n\t\t\t\t( this.direction === \"down\" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout,\n\t\t// if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay( function() {\n\t\t\tif ( counter === this.counter ) {\n\n\t\t\t\t//Precompute after each DOM insertion, NOT on mousemove\n\t\t\t\tthis.refreshPositions( !hardRefresh );\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_clear: function( event, noPropagation ) {\n\n\t\tthis.reverting = false;\n\n\t\t// We delay all events that have to be triggered to after the point where the placeholder\n\t\t// has been removed and everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets\n\t\t// reappended (see #4088)\n\t\tif ( !this._noFinalSort && this.currentItem.parent().length ) {\n\t\t\tthis.placeholder.before( this.currentItem );\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tfor ( i in this._storedCSS ) {\n\t\t\t\tif ( this._storedCSS[ i ] === \"auto\" || this._storedCSS[ i ] === \"static\" ) {\n\t\t\t\t\tthis._storedCSS[ i ] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif ( this.fromOutside && !noPropagation ) {\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"receive\", event, this._uiHash( this.fromOutside ) );\n\t\t\t} );\n\t\t}\n\t\tif ( ( this.fromOutside ||\n\t\t\t\tthis.domPosition.prev !==\n\t\t\t\tthis.currentItem.prev().not( \".ui-sortable-helper\" )[ 0 ] ||\n\t\t\t\tthis.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {\n\n\t\t\t// Trigger update callback if the DOM position has changed\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"update\", event, this._uiHash() );\n\t\t\t} );\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif ( this !== this.currentContainer ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\t\tthis._trigger( \"remove\", event, this._uiHash() );\n\t\t\t\t} );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"receive\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"update\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif ( this._storedOpacity ) {\n\t\t\tthis.helper.css( \"opacity\", this._storedOpacity );\n\t\t}\n\t\tif ( this._storedZIndex ) {\n\t\t\tthis.helper.css( \"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex );\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif ( !noPropagation ) {\n\t\t\tthis._trigger( \"beforeStop\", event, this._uiHash() );\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t// it unbinds ALL events from the original node!\n\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif ( !noPropagation ) {\n\t\t\tfor ( i = 0; i < delayedTriggers.length; i++ ) {\n\n\t\t\t\t// Trigger all delayed events\n\t\t\t\tdelayedTriggers[ i ].call( this, event );\n\t\t\t}\n\t\t\tthis._trigger( \"stop\", event, this._uiHash() );\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function( _inst ) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $( [] ),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n} );\n\n\n/*!\n * jQuery UI Spinner 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Spinner\n//>>group: Widgets\n//>>description: Displays buttons to easily input numbers via the keyboard or mouse.\n//>>docs: http://api.jqueryui.com/spinner/\n//>>demos: http://jqueryui.com/spinner/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/spinner.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nfunction spinnerModifer( fn ) {\n\treturn function() {\n\t\tvar previous = this.element.val();\n\t\tfn.apply( this, arguments );\n\t\tthis._refresh();\n\t\tif ( previous !== this.element.val() ) {\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t};\n}\n\n$.widget( \"ui.spinner\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"\",\n\twidgetEventPrefix: \"spin\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-spinner\": \"ui-corner-all\",\n\t\t\t\"ui-spinner-down\": \"ui-corner-br\",\n\t\t\t\"ui-spinner-up\": \"ui-corner-tr\"\n\t\t},\n\t\tculture: null,\n\t\ticons: {\n\t\t\tdown: \"ui-icon-triangle-1-s\",\n\t\t\tup: \"ui-icon-triangle-1-n\"\n\t\t},\n\t\tincremental: true,\n\t\tmax: null,\n\t\tmin: null,\n\t\tnumberFormat: null,\n\t\tpage: 10,\n\t\tstep: 1,\n\n\t\tchange: null,\n\t\tspin: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\n\t\t// handle string values that need to be parsed\n\t\tthis._setOption( \"max\", this.options.max );\n\t\tthis._setOption( \"min\", this.options.min );\n\t\tthis._setOption( \"step\", this.options.step );\n\n\t\t// Only format if there is a value, prevents the field from being marked\n\t\t// as invalid in Firefox, see #9573.\n\t\tif ( this.value() !== \"\" ) {\n\n\t\t\t// Format the value, but don't constrain.\n\t\t\tthis._value( this.element.val(), true );\n\t\t}\n\n\t\tthis._draw();\n\t\tthis._on( this._events );\n\t\tthis._refresh();\n\n\t\t// Turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = this._super();\n\t\tvar element = this.element;\n\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\n\t\t\tvar value = element.attr( option );\n\t\t\tif ( value != null && value.length ) {\n\t\t\t\toptions[ option ] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn options;\n\t},\n\n\t_events: {\n\t\tkeydown: function( event ) {\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\tkeyup: \"_stop\",\n\t\tfocus: function() {\n\t\t\tthis.previous = this.element.val();\n\t\t},\n\t\tblur: function( event ) {\n\t\t\tif ( this.cancelBlur ) {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._stop();\n\t\t\tthis._refresh();\n\t\t\tif ( this.previous !== this.element.val() ) {\n\t\t\t\tthis._trigger( \"change\", event );\n\t\t\t}\n\t\t},\n\t\tmousewheel: function( event, delta ) {\n\t\t\tif ( !delta ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );\n\t\t\tclearTimeout( this.mousewheelTimer );\n\t\t\tthis.mousewheelTimer = this._delay( function() {\n\t\t\t\tif ( this.spinning ) {\n\t\t\t\t\tthis._stop( event );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t\tevent.preventDefault();\n\t\t},\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\n\t\t\tvar previous;\n\n\t\t\t// We never want the buttons to have focus; whenever the user is\n\t\t\t// interacting with the spinner, the focus should be on the input.\n\t\t\t// If the input is focused then this.previous is properly set from\n\t\t\t// when the input first received focus. If the input is not focused\n\t\t\t// then we need to set this.previous based on the value before spinning.\n\t\t\tprevious = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?\n\t\t\t\tthis.previous : this.element.val();\n\t\t\tfunction checkFocus() {\n\t\t\t\tvar isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );\n\t\t\t\tif ( !isActive ) {\n\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\tthis.previous = previous;\n\n\t\t\t\t\t// support: IE\n\t\t\t\t\t// IE sets focus asynchronously, so we need to check if focus\n\t\t\t\t\t// moved off of the input because the user clicked on the button.\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure focus is on (or stays on) the text field\n\t\t\tevent.preventDefault();\n\t\t\tcheckFocus.call( this );\n\n\t\t\t// Support: IE\n\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t// and check (again) if focus moved off of the input.\n\t\t\tthis.cancelBlur = true;\n\t\t\tthis._delay( function() {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\tcheckFocus.call( this );\n\t\t\t} );\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\n\n\t\t\t// button will add ui-state-active if mouse was down while mouseleave and kept down\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\n\t\t// TODO: do we really want to consider this a stop?\n\t\t// shouldn't we just stop the repeater and wait until mouseup before\n\t\t// we trigger the stop event?\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\n\t},\n\n\t// Support mobile enhanced option and make backcompat more sane\n\t_enhance: function() {\n\t\tthis.uiSpinner = this.element\n\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t.wrap( \"\" )\n\t\t\t.parent()\n\n\t\t\t\t// Add buttons\n\t\t\t\t.append(\n\t\t\t\t\t\"
\"\n\t\t\t\t);\n\t},\n\n\t_draw: function() {\n\t\tthis._enhance();\n\n\t\tthis._addClass( this.uiSpinner, \"ui-spinner\", \"ui-widget ui-widget-content\" );\n\t\tthis._addClass( \"ui-spinner-input\" );\n\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\n\n\t\t// Button bindings\n\t\tthis.buttons = this.uiSpinner.children( \"a\" )\n\t\t\t.attr( \"tabIndex\", -1 )\n\t\t\t.attr( \"aria-hidden\", true )\n\t\t\t.button( {\n\t\t\t\tclasses: {\n\t\t\t\t\t\"ui-button\": \"\"\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// TODO: Right now button does not support classes this is already updated in button PR\n\t\tthis._removeClass( this.buttons, \"ui-corner-all\" );\n\n\t\tthis._addClass( this.buttons.first(), \"ui-spinner-button ui-spinner-up\" );\n\t\tthis._addClass( this.buttons.last(), \"ui-spinner-button ui-spinner-down\" );\n\t\tthis.buttons.first().button( {\n\t\t\t\"icon\": this.options.icons.up,\n\t\t\t\"showLabel\": false\n\t\t} );\n\t\tthis.buttons.last().button( {\n\t\t\t\"icon\": this.options.icons.down,\n\t\t\t\"showLabel\": false\n\t\t} );\n\n\t\t// IE 6 doesn't understand height: 50% for the buttons\n\t\t// unless the wrapper has an explicit height\n\t\tif ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&\n\t\t\t\tthis.uiSpinner.height() > 0 ) {\n\t\t\tthis.uiSpinner.height( this.uiSpinner.height() );\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar options = this.options,\n\t\t\tkeyCode = $.ui.keyCode;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.UP:\n\t\t\tthis._repeat( null, 1, event );\n\t\t\treturn true;\n\t\tcase keyCode.DOWN:\n\t\t\tthis._repeat( null, -1, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_UP:\n\t\t\tthis._repeat( null, options.page, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_DOWN:\n\t\t\tthis._repeat( null, -options.page, event );\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_start: function( event ) {\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\t\tthis.spinning = true;\n\t\treturn true;\n\t},\n\n\t_repeat: function( i, steps, event ) {\n\t\ti = i || 500;\n\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay( function() {\n\t\t\tthis._repeat( 40, steps, event );\n\t\t}, i );\n\n\t\tthis._spin( steps * this.options.step, event );\n\t},\n\n\t_spin: function( step, event ) {\n\t\tvar value = this.value() || 0;\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\n\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false ) {\n\t\t\tthis._value( value );\n\t\t\tthis.counter++;\n\t\t}\n\t},\n\n\t_increment: function( i ) {\n\t\tvar incremental = this.options.incremental;\n\n\t\tif ( incremental ) {\n\t\t\treturn $.isFunction( incremental ) ?\n\t\t\t\tincremental( i ) :\n\t\t\t\tMath.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_adjustValue: function( value ) {\n\t\tvar base, aboveMin,\n\t\t\toptions = this.options;\n\n\t\t// Make sure we're at a valid step\n\t\t// - find out where we are relative to the base (min or 0)\n\t\tbase = options.min !== null ? options.min : 0;\n\t\taboveMin = value - base;\n\n\t\t// - round to the nearest step\n\t\taboveMin = Math.round( aboveMin / options.step ) * options.step;\n\n\t\t// - rounding is based on 0, so adjust back to our base\n\t\tvalue = base + aboveMin;\n\n\t\t// Fix precision from bad JS floating point math\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\n\n\t\t// Clamp the value\n\t\tif ( options.max !== null && value > options.max ) {\n\t\t\treturn options.max;\n\t\t}\n\t\tif ( options.min !== null && value < options.min ) {\n\t\t\treturn options.min;\n\t\t}\n\n\t\treturn value;\n\t},\n\n\t_stop: function( event ) {\n\t\tif ( !this.spinning ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( this.timer );\n\t\tclearTimeout( this.mousewheelTimer );\n\t\tthis.counter = 0;\n\t\tthis.spinning = false;\n\t\tthis._trigger( \"stop\", event );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar prevValue, first, last;\n\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\n\t\t\tprevValue = this._parse( this.element.val() );\n\t\t\tthis.options[ key ] = value;\n\t\t\tthis.element.val( this._format( prevValue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\n\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\tvalue = this._parse( value );\n\t\t\t}\n\t\t}\n\t\tif ( key === \"icons\" ) {\n\t\t\tfirst = this.buttons.first().find( \".ui-icon\" );\n\t\t\tthis._removeClass( first, null, this.options.icons.up );\n\t\t\tthis._addClass( first, null, value.up );\n\t\t\tlast = this.buttons.last().find( \".ui-icon\" );\n\t\t\tthis._removeClass( last, null, this.options.icons.down );\n\t\t\tthis._addClass( last, null, value.down );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis._toggleClass( this.uiSpinner, null, \"ui-state-disabled\", !!value );\n\t\tthis.element.prop( \"disabled\", !!value );\n\t\tthis.buttons.button( value ? \"disable\" : \"enable\" );\n\t},\n\n\t_setOptions: spinnerModifer( function( options ) {\n\t\tthis._super( options );\n\t} ),\n\n\t_parse: function( val ) {\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\n\t\t\tval = window.Globalize && this.options.numberFormat ?\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\n\t\t}\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\n\t},\n\n\t_format: function( value ) {\n\t\tif ( value === \"\" ) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn window.Globalize && this.options.numberFormat ?\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\n\t\t\tvalue;\n\t},\n\n\t_refresh: function() {\n\t\tthis.element.attr( {\n\t\t\t\"aria-valuemin\": this.options.min,\n\t\t\t\"aria-valuemax\": this.options.max,\n\n\t\t\t// TODO: what should we do with values that can't be parsed?\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\n\t\t} );\n\t},\n\n\tisValid: function() {\n\t\tvar value = this.value();\n\n\t\t// Null is invalid\n\t\tif ( value === null ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If value gets adjusted, it's invalid\n\t\treturn value === this._adjustValue( value );\n\t},\n\n\t// Update the value without triggering change\n\t_value: function( value, allowAny ) {\n\t\tvar parsed;\n\t\tif ( value !== \"\" ) {\n\t\t\tparsed = this._parse( value );\n\t\t\tif ( parsed !== null ) {\n\t\t\t\tif ( !allowAny ) {\n\t\t\t\t\tparsed = this._adjustValue( parsed );\n\t\t\t\t}\n\t\t\t\tvalue = this._format( parsed );\n\t\t\t}\n\t\t}\n\t\tthis.element.val( value );\n\t\tthis._refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.prop( \"disabled\", false )\n\t\t\t.removeAttr( \"autocomplete role aria-valuemin aria-valuemax aria-valuenow\" );\n\n\t\tthis.uiSpinner.replaceWith( this.element );\n\t},\n\n\tstepUp: spinnerModifer( function( steps ) {\n\t\tthis._stepUp( steps );\n\t} ),\n\t_stepUp: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tstepDown: spinnerModifer( function( steps ) {\n\t\tthis._stepDown( steps );\n\t} ),\n\t_stepDown: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * -this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tpageUp: spinnerModifer( function( pages ) {\n\t\tthis._stepUp( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tpageDown: spinnerModifer( function( pages ) {\n\t\tthis._stepDown( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tvalue: function( newVal ) {\n\t\tif ( !arguments.length ) {\n\t\t\treturn this._parse( this.element.val() );\n\t\t}\n\t\tspinnerModifer( this._value ).call( this, newVal );\n\t},\n\n\twidget: function() {\n\t\treturn this.uiSpinner;\n\t}\n} );\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for spinner html extension points\n\t$.widget( \"ui.spinner\", $.ui.spinner, {\n\t\t_enhance: function() {\n\t\t\tthis.uiSpinner = this.element\n\t\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t\t.wrap( this._uiSpinnerHtml() )\n\t\t\t\t.parent()\n\n\t\t\t\t\t// Add buttons\n\t\t\t\t\t.append( this._buttonHtml() );\n\t\t},\n\t\t_uiSpinnerHtml: function() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t_buttonHtml: function() {\n\t\t\treturn \"\";\n\t\t}\n\t} );\n}\n\nvar widgetsSpinner = $.ui.spinner;\n\n\n/*!\n * jQuery UI Tabs 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tabs\n//>>group: Widgets\n//>>description: Transforms a set of container elements into a tab structure.\n//>>docs: http://api.jqueryui.com/tabs/\n//>>demos: http://jqueryui.com/tabs/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tabs.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tabs\", {\n\tversion: \"1.12.1\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tclasses: {\n\t\t\t\"ui-tabs\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-nav\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-panel\": \"ui-corner-bottom\",\n\t\t\t\"ui-tabs-tab\": \"ui-corner-top\"\n\t\t},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_isLocal: ( function() {\n\t\tvar rhash = /#.*$/;\n\n\t\treturn function( anchor ) {\n\t\t\tvar anchorUrl, locationUrl;\n\n\t\t\tanchorUrl = anchor.href.replace( rhash, \"\" );\n\t\t\tlocationUrl = location.href.replace( rhash, \"\" );\n\n\t\t\t// Decoding may throw an error if the URL isn't UTF-8 (#9518)\n\t\t\ttry {\n\t\t\t\tanchorUrl = decodeURIComponent( anchorUrl );\n\t\t\t} catch ( error ) {}\n\t\t\ttry {\n\t\t\t\tlocationUrl = decodeURIComponent( locationUrl );\n\t\t\t} catch ( error ) {}\n\n\t\t\treturn anchor.hash.length > 1 && anchorUrl === locationUrl;\n\t\t};\n\t} )(),\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis._addClass( \"ui-tabs\", \"ui-widget ui-widget-content\" );\n\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, options.collapsible );\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t// Take disabling tabs via class attribute from HTML\n\t\t// into account and update option properly.\n\t\tif ( $.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t} )\n\t\t\t) ).sort();\n\t\t}\n\n\t\t// Check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\n\t\t\t// check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each( function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t// No active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t// Handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t// Don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\tvar focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.RIGHT:\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tselectedIndex++;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tgoingForward = false;\n\t\t\tselectedIndex--;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tselectedIndex = 0;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.SPACE:\n\n\t\t\t// Activate only, no collapsing\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\t\t\tthis._activate( selectedIndex );\n\t\t\treturn;\n\t\tcase $.ui.keyCode.ENTER:\n\n\t\t\t// Toggle (cancel delayed activation, allow collapsing)\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\n\t\t\t// Determine if we should collapse or activate\n\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\treturn;\n\t\tdefault:\n\t\t\treturn;\n\t\t}\n\n\t\t// Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t// Navigating with control/command key will prevent automatic activation\n\t\tif ( !event.ctrlKey && !event.metaKey ) {\n\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay( function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.trigger( \"focus\" );\n\t\t}\n\t},\n\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).trigger( \"focus\" );\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, value );\n\n\t\t\t// Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t// Get disabled tabs from class attribute from HTML\n\t\t// this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t} );\n\n\t\tthis._processTabs();\n\n\t\t// Was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\n\t\t// was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\n\t\t\t// all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\n\t\t\t// activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\n\t\t// was active, active tab still exists\n\t\t} else {\n\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setOptionDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\ttabIndex: -1\n\t\t} );\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr( {\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t} );\n\n\t\t// Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t} );\n\t\t\tthis._addClass( this.active, \"ui-tabs-active\", \"ui-state-active\" );\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this,\n\t\t\tprevTabs = this.tabs,\n\t\t\tprevAnchors = this.anchors,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.tablist = this._getList().attr( \"role\", \"tablist\" );\n\t\tthis._addClass( this.tablist, \"ui-tabs-nav\",\n\t\t\t\"ui-helper-reset ui-helper-clearfix ui-widget-header\" );\n\n\t\t// Prevent users from focusing disabled tabs via click\n\t\tthis.tablist\n\t\t\t.on( \"mousedown\" + this.eventNamespace, \"> li\", function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} )\n\n\t\t\t// Support: IE <9\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\n\t\t\t// We don't have to worry about focusing the previously focused\n\t\t\t// element since clicking on a non-focusable element should focus\n\t\t\t// the body anyway.\n\t\t\t.on( \"focus\" + this.eventNamespace, \".ui-tabs-anchor\", function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.tabs, \"ui-tabs-tab\", \"ui-state-default\" );\n\n\t\tthis.anchors = this.tabs.map( function() {\n\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t} )\n\t\t\t.attr( {\n\t\t\t\trole: \"presentation\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.anchors, \"ui-tabs-anchor\" );\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each( function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t// Inline tab\n\t\t\tif ( that._isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanelId = selector.substring( 1 );\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\n\t\t\t// remote tab\n\t\t\t} else {\n\n\t\t\t\t// If the tab doesn't already have aria-controls,\n\t\t\t\t// generate an id by using a throw-away element\n\t\t\t\tpanelId = tab.attr( \"aria-controls\" ) || $( {} ).uniqueId()[ 0 ].id;\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length ) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr( {\n\t\t\t\t\"aria-controls\": panelId,\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t} );\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t} );\n\n\t\tthis.panels.attr( \"role\", \"tabpanel\" );\n\t\tthis._addClass( this.panels, \"ui-tabs-panel\", \"ui-widget-content\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevTabs ) {\n\t\t\tthis._off( prevTabs.not( this.tabs ) );\n\t\t\tthis._off( prevAnchors.not( this.anchors ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t// Allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.tablist || this.element.find( \"ol, ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"
\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setOptionDisabled: function( disabled ) {\n\t\tvar currentItem, li, i;\n\n\t\tif ( $.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t// Disable tabs\n\t\tfor ( i = 0; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tcurrentItem = $( li );\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\tcurrentItem.attr( \"aria-disabled\", \"true\" );\n\t\t\t\tthis._addClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t} else {\n\t\t\t\tcurrentItem.removeAttr( \"aria-disabled\" );\n\t\t\t\tthis._removeClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null,\n\t\t\tdisabled === true );\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t} );\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\n\t\t// Always prevent the default action, even when disabled\n\t\tthis._on( true, this.anchors, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each( function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.element.children().not( this.panels ).each( function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.panels.each( function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t} )\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each( function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t} ).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\n\t\t\t\t// tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\n\t\t\t\t// can't switch durning an animation\n\t\t\t\tthis.running ||\n\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t// Handles show/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\tthat._addClass( eventData.newTab.closest( \"li\" ), \"ui-tabs-active\", \"ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t// Start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\tthat._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t} );\n\t\t} else {\n\t\t\tthis._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr( \"aria-hidden\", \"true\" );\n\t\teventData.oldTab.attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t} );\n\n\t\t// If we're switching tabs, remove the old tab from the tab order.\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter( function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t} )\n\t\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr( \"aria-hidden\", \"false\" );\n\t\teventData.newTab.attr( {\n\t\t\t\"aria-selected\": \"true\",\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\ttabIndex: 0\n\t\t} );\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t// Trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler( {\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t} );\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" +\n\t\t\t\t$.ui.escapeSelector( index ) + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.tablist\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.off( this.eventNamespace );\n\n\t\tthis.anchors\n\t\t\t.removeAttr( \"role tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tabs.add( this.panels ).each( function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this ).removeAttr( \"role tabIndex \" +\n\t\t\t\t\t\"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.tabs.each( function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t},\n\t\t\tcomplete = function( jqXHR, status ) {\n\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t}\n\n\t\t\t\tthat._removeClass( tab, \"ui-tabs-loading\" );\n\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\tdelete that.xhr;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Not remote\n\t\tif ( this._isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t// Support: jQuery <1.8\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\tthis._addClass( tab, \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.done( function( response, status, jqXHR ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} )\n\t\t\t\t.fail( function( jqXHR, status ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\n\t\t\t// Support: IE <11 only\n\t\t\t// Strip any hash that exists to prevent errors with the Ajax request\n\t\t\turl: anchor.attr( \"href\" ).replace( /#.*$/, \"\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for ui-tab class (now ui-tabs-tab)\n\t$.widget( \"ui.tabs\", $.ui.tabs, {\n\t\t_processTabs: function() {\n\t\t\tthis._superApply( arguments );\n\t\t\tthis._addClass( this.tabs, \"ui-tab\" );\n\t\t}\n\t} );\n}\n\nvar widgetsTabs = $.ui.tabs;\n\n\n/*!\n * jQuery UI Tooltip 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tooltip\n//>>group: Widgets\n//>>description: Shows additional information for any element on hover or focus.\n//>>docs: http://api.jqueryui.com/tooltip/\n//>>demos: http://jqueryui.com/tooltip/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tooltip.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tooltip\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-tooltip\": \"ui-corner-all ui-widget-shadow\"\n\t\t},\n\t\tcontent: function() {\n\n\t\t\t// support: IE<9, Opera in jQuery <1.7\n\t\t\t// .text() can't accept undefined, so coerce to a string\n\t\t\tvar title = $( this ).attr( \"title\" ) || \"\";\n\n\t\t\t// Escape title, since we're going from an attribute to raw HTML\n\t\t\treturn $( \"\" ).text( title ).html();\n\t\t},\n\t\thide: true,\n\n\t\t// Disabled elements have inconsistent behavior across browsers (#8661)\n\t\titems: \"[title]:not([disabled])\",\n\t\tposition: {\n\t\t\tmy: \"left top+15\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"flipfit flip\"\n\t\t},\n\t\tshow: true,\n\t\ttrack: false,\n\n\t\t// Callbacks\n\t\tclose: null,\n\t\topen: null\n\t},\n\n\t_addDescribedBy: function( elem, id ) {\n\t\tvar describedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ );\n\t\tdescribedby.push( id );\n\t\telem\n\t\t\t.data( \"ui-tooltip-id\", id )\n\t\t\t.attr( \"aria-describedby\", $.trim( describedby.join( \" \" ) ) );\n\t},\n\n\t_removeDescribedBy: function( elem ) {\n\t\tvar id = elem.data( \"ui-tooltip-id\" ),\n\t\t\tdescribedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ ),\n\t\t\tindex = $.inArray( id, describedby );\n\n\t\tif ( index !== -1 ) {\n\t\t\tdescribedby.splice( index, 1 );\n\t\t}\n\n\t\telem.removeData( \"ui-tooltip-id\" );\n\t\tdescribedby = $.trim( describedby.join( \" \" ) );\n\t\tif ( describedby ) {\n\t\t\telem.attr( \"aria-describedby\", describedby );\n\t\t} else {\n\t\t\telem.removeAttr( \"aria-describedby\" );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._on( {\n\t\t\tmouseover: \"open\",\n\t\t\tfocusin: \"open\"\n\t\t} );\n\n\t\t// IDs of generated tooltips, needed for destroy\n\t\tthis.tooltips = {};\n\n\t\t// IDs of parent tooltips where we removed the title attribute\n\t\tthis.parents = {};\n\n\t\t// Append the aria-live region so tooltips announce correctly\n\t\tthis.liveRegion = $( \"
\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"log\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t} )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\t\tthis._addClass( this.liveRegion, null, \"ui-helper-hidden-accessible\" );\n\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar that = this;\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"content\" ) {\n\t\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t\tthat._updateContent( tooltipData.element );\n\t\t\t} );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\n\t},\n\n\t_disable: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = tooltipData.element[ 0 ];\n\t\t\tthat.close( event, true );\n\t\t} );\n\n\t\t// Remove title attributes to prevent native tooltips\n\t\tthis.disabledTitles = this.disabledTitles.add(\n\t\t\tthis.element.find( this.options.items ).addBack()\n\t\t\t\t.filter( function() {\n\t\t\t\t\tvar element = $( this );\n\t\t\t\t\tif ( element.is( \"[title]\" ) ) {\n\t\t\t\t\t\treturn element\n\t\t\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\n\t\t\t\t\t\t\t.removeAttr( \"title\" );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t);\n\t},\n\n\t_enable: function() {\n\n\t\t// restore title attributes\n\t\tthis.disabledTitles.each( function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t}\n\t\t} );\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\topen: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.target : this.element )\n\n\t\t\t\t// we need closest here due to mouseover bubbling,\n\t\t\t\t// but always pointing at the same event target\n\t\t\t\t.closest( this.options.items );\n\n\t\t// No element to show a tooltip for or the tooltip is already open\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( target.attr( \"title\" ) ) {\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\n\t\t}\n\n\t\ttarget.data( \"ui-tooltip-open\", true );\n\n\t\t// Kill parent tooltips, custom or native, for hover\n\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\ttarget.parents().each( function() {\n\t\t\t\tvar parent = $( this ),\n\t\t\t\t\tblurEvent;\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\n\t\t\t\t\tthat.close( blurEvent, true );\n\t\t\t\t}\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\n\t\t\t\t\tparent.uniqueId();\n\t\t\t\t\tthat.parents[ this.id ] = {\n\t\t\t\t\t\telement: this,\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\n\t\t\t\t\t};\n\t\t\t\t\tparent.attr( \"title\", \"\" );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis._registerCloseHandlers( event, target );\n\t\tthis._updateContent( target, event );\n\t},\n\n\t_updateContent: function( target, event ) {\n\t\tvar content,\n\t\t\tcontentOption = this.options.content,\n\t\t\tthat = this,\n\t\t\teventType = event ? event.type : null;\n\n\t\tif ( typeof contentOption === \"string\" || contentOption.nodeType ||\n\t\t\t\tcontentOption.jquery ) {\n\t\t\treturn this._open( event, target, contentOption );\n\t\t}\n\n\t\tcontent = contentOption.call( target[ 0 ], function( response ) {\n\n\t\t\t// IE may instantly serve a cached response for ajax requests\n\t\t\t// delay this call to _open so the other call to _open runs first\n\t\t\tthat._delay( function() {\n\n\t\t\t\t// Ignore async response if tooltip was closed already\n\t\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// JQuery creates a special event for focusin when it doesn't\n\t\t\t\t// exist natively. To improve performance, the native event\n\t\t\t\t// object is reused and the type is changed. Therefore, we can't\n\t\t\t\t// rely on the type being correct after the event finished\n\t\t\t\t// bubbling, so we set it back to the previous value. (#8740)\n\t\t\t\tif ( event ) {\n\t\t\t\t\tevent.type = eventType;\n\t\t\t\t}\n\t\t\t\tthis._open( event, target, response );\n\t\t\t} );\n\t\t} );\n\t\tif ( content ) {\n\t\t\tthis._open( event, target, content );\n\t\t}\n\t},\n\n\t_open: function( event, target, content ) {\n\t\tvar tooltipData, tooltip, delayedShow, a11yContent,\n\t\t\tpositionOption = $.extend( {}, this.options.position );\n\n\t\tif ( !content ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Content can be updated multiple times. If the tooltip already\n\t\t// exists, then just update the content and bail.\n\t\ttooltipData = this._find( target );\n\t\tif ( tooltipData ) {\n\t\t\ttooltipData.tooltip.find( \".ui-tooltip-content\" ).html( content );\n\t\t\treturn;\n\t\t}\n\n\t\t// If we have a title, clear it to prevent the native tooltip\n\t\t// we have to check first to avoid defining a title if none exists\n\t\t// (we don't want to cause an element to start matching [title])\n\t\t//\n\t\t// We use removeAttr only for key events, to allow IE to export the correct\n\t\t// accessible attributes. For mouse events, set to empty string to avoid\n\t\t// native tooltip showing up (happens only when removing inside mouseover).\n\t\tif ( target.is( \"[title]\" ) ) {\n\t\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\t\ttarget.attr( \"title\", \"\" );\n\t\t\t} else {\n\t\t\t\ttarget.removeAttr( \"title\" );\n\t\t\t}\n\t\t}\n\n\t\ttooltipData = this._tooltip( target );\n\t\ttooltip = tooltipData.tooltip;\n\t\tthis._addDescribedBy( target, tooltip.attr( \"id\" ) );\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\n\t\t// Support: Voiceover on OS X, JAWS on IE <= 9\n\t\t// JAWS announces deletions even when aria-relevant=\"additions\"\n\t\t// Voiceover will sometimes re-read the entire log region's contents from the beginning\n\t\tthis.liveRegion.children().hide();\n\t\ta11yContent = $( \"
\" ).html( tooltip.find( \".ui-tooltip-content\" ).html() );\n\t\ta11yContent.removeAttr( \"name\" ).find( \"[name]\" ).removeAttr( \"name\" );\n\t\ta11yContent.removeAttr( \"id\" ).find( \"[id]\" ).removeAttr( \"id\" );\n\t\ta11yContent.appendTo( this.liveRegion );\n\n\t\tfunction position( event ) {\n\t\t\tpositionOption.of = event;\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttooltip.position( positionOption );\n\t\t}\n\t\tif ( this.options.track && event && /^mouse/.test( event.type ) ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\tmousemove: position\n\t\t\t} );\n\n\t\t\t// trigger once to override element-relative positioning\n\t\t\tposition( event );\n\t\t} else {\n\t\t\ttooltip.position( $.extend( {\n\t\t\t\tof: target\n\t\t\t}, this.options.position ) );\n\t\t}\n\n\t\ttooltip.hide();\n\n\t\tthis._show( tooltip, this.options.show );\n\n\t\t// Handle tracking tooltips that are shown with a delay (#8644). As soon\n\t\t// as the tooltip is visible, position the tooltip using the most recent\n\t\t// event.\n\t\t// Adds the check to add the timers only when both delay and track options are set (#14682)\n\t\tif ( this.options.track && this.options.show && this.options.show.delay ) {\n\t\t\tdelayedShow = this.delayedShow = setInterval( function() {\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\n\t\t\t\t\tposition( positionOption.of );\n\t\t\t\t\tclearInterval( delayedShow );\n\t\t\t\t}\n\t\t\t}, $.fx.interval );\n\t\t}\n\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\n\t},\n\n\t_registerCloseHandlers: function( event, target ) {\n\t\tvar events = {\n\t\t\tkeyup: function( event ) {\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tvar fakeEvent = $.Event( event );\n\t\t\t\t\tfakeEvent.currentTarget = target[ 0 ];\n\t\t\t\t\tthis.close( fakeEvent, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Only bind remove handler for delegated targets. Non-delegated\n\t\t// tooltips will handle this in destroy.\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tevents.remove = function() {\n\t\t\t\tthis._removeTooltip( this._find( target ).tooltip );\n\t\t\t};\n\t\t}\n\n\t\tif ( !event || event.type === \"mouseover\" ) {\n\t\t\tevents.mouseleave = \"close\";\n\t\t}\n\t\tif ( !event || event.type === \"focusin\" ) {\n\t\t\tevents.focusout = \"close\";\n\t\t}\n\t\tthis._on( true, target, events );\n\t},\n\n\tclose: function( event ) {\n\t\tvar tooltip,\n\t\t\tthat = this,\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\n\t\t\ttooltipData = this._find( target );\n\n\t\t// The tooltip may already be closed\n\t\tif ( !tooltipData ) {\n\n\t\t\t// We set ui-tooltip-open immediately upon open (in open()), but only set the\n\t\t\t// additional data once there's actually content to show (in _open()). So even if the\n\t\t\t// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\n\t\t\t// the period between open() and _open().\n\t\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\t\treturn;\n\t\t}\n\n\t\ttooltip = tooltipData.tooltip;\n\n\t\t// Disabling closes the tooltip, so we need to track when we're closing\n\t\t// to avoid an infinite loop in case the tooltip becomes disabled on close\n\t\tif ( tooltipData.closing ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\t// Only set title if we had one before (see comment in _open())\n\t\t// If the title attribute has changed since open(), don't restore\n\t\tif ( target.data( \"ui-tooltip-title\" ) && !target.attr( \"title\" ) ) {\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\n\t\t}\n\n\t\tthis._removeDescribedBy( target );\n\n\t\ttooltipData.hiding = true;\n\t\ttooltip.stop( true );\n\t\tthis._hide( tooltip, this.options.hide, function() {\n\t\t\tthat._removeTooltip( $( this ) );\n\t\t} );\n\n\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\n\n\t\t// Remove 'remove' binding only on delegated targets\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tthis._off( target, \"remove\" );\n\t\t}\n\t\tthis._off( this.document, \"mousemove\" );\n\n\t\tif ( event && event.type === \"mouseleave\" ) {\n\t\t\t$.each( this.parents, function( id, parent ) {\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\n\t\t\t\tdelete that.parents[ id ];\n\t\t\t} );\n\t\t}\n\n\t\ttooltipData.closing = true;\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\n\t\tif ( !tooltipData.hiding ) {\n\t\t\ttooltipData.closing = false;\n\t\t}\n\t},\n\n\t_tooltip: function( element ) {\n\t\tvar tooltip = $( \"
\" ).attr( \"role\", \"tooltip\" ),\n\t\t\tcontent = $( \"
\" ).appendTo( tooltip ),\n\t\t\tid = tooltip.uniqueId().attr( \"id\" );\n\n\t\tthis._addClass( content, \"ui-tooltip-content\" );\n\t\tthis._addClass( tooltip, \"ui-tooltip\", \"ui-widget ui-widget-content\" );\n\n\t\ttooltip.appendTo( this._appendTo( element ) );\n\n\t\treturn this.tooltips[ id ] = {\n\t\t\telement: element,\n\t\t\ttooltip: tooltip\n\t\t};\n\t},\n\n\t_find: function( target ) {\n\t\tvar id = target.data( \"ui-tooltip-id\" );\n\t\treturn id ? this.tooltips[ id ] : null;\n\t},\n\n\t_removeTooltip: function( tooltip ) {\n\t\ttooltip.remove();\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\n\t},\n\n\t_appendTo: function( target ) {\n\t\tvar element = target.closest( \".ui-front, dialog\" );\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_destroy: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\n\t\t\t// Delegate to close method to handle common cleanup\n\t\t\tvar event = $.Event( \"blur\" ),\n\t\t\t\telement = tooltipData.element;\n\t\t\tevent.target = event.currentTarget = element[ 0 ];\n\t\t\tthat.close( event, true );\n\n\t\t\t// Remove immediately; destroying an open tooltip doesn't use the\n\t\t\t// hide animation\n\t\t\t$( \"#\" + id ).remove();\n\n\t\t\t// Restore the title\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\n\t\t\t\t// If the title attribute has changed since open(), don't restore\n\t\t\t\tif ( !element.attr( \"title\" ) ) {\n\t\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t\t}\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\n\t\t\t}\n\t\t} );\n\t\tthis.liveRegion.remove();\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for tooltipClass option\n\t$.widget( \"ui.tooltip\", $.ui.tooltip, {\n\t\toptions: {\n\t\t\ttooltipClass: null\n\t\t},\n\t\t_tooltip: function() {\n\t\t\tvar tooltipData = this._superApply( arguments );\n\t\t\tif ( this.options.tooltipClass ) {\n\t\t\t\ttooltipData.tooltip.addClass( this.options.tooltipClass );\n\t\t\t}\n\t\t\treturn tooltipData;\n\t\t}\n\t} );\n}\n\nvar widgetsTooltip = $.ui.tooltip;\n\n\n\n\n}));","/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)\n * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)\n * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\n *\n * Version: 1.3.8\n *\n */\n(function($) {\n\n $.fn.extend({\n slimScroll: function(options) {\n\n var defaults = {\n\n // width in pixels of the visible scroll area\n width : 'auto',\n\n // height in pixels of the visible scroll area\n height : '250px',\n\n // width in pixels of the scrollbar and rail\n size : '7px',\n\n // scrollbar color, accepts any hex/color value\n color: '#000',\n\n // scrollbar position - left/right\n position : 'right',\n\n // distance in pixels between the side edge and the scrollbar\n distance : '1px',\n\n // default scroll position on load - top / bottom / $('selector')\n start : 'top',\n\n // sets scrollbar opacity\n opacity : .4,\n\n // enables always-on mode for the scrollbar\n alwaysVisible : false,\n\n // check if we should hide the scrollbar when user is hovering over\n disableFadeOut : false,\n\n // sets visibility of the rail\n railVisible : false,\n\n // sets rail color\n railColor : '#333',\n\n // sets rail opacity\n railOpacity : .2,\n\n // whether we should use jQuery UI Draggable to enable bar dragging\n railDraggable : true,\n\n // defautlt CSS class of the slimscroll rail\n railClass : 'slimScrollRail',\n\n // defautlt CSS class of the slimscroll bar\n barClass : 'slimScrollBar',\n\n // defautlt CSS class of the slimscroll wrapper\n wrapperClass : 'slimScrollDiv',\n\n // check if mousewheel should scroll the window if we reach top/bottom\n allowPageScroll : false,\n\n // scroll amount applied to each mouse wheel step\n wheelStep : 20,\n\n // scroll amount applied when user is using gestures\n touchScrollStep : 200,\n\n // sets border radius\n borderRadius: '7px',\n\n // sets border radius of the rail\n railBorderRadius : '7px'\n };\n\n var o = $.extend(defaults, options);\n\n // do it for every element that matches selector\n this.each(function(){\n\n var isOverPanel, isOverBar, isDragg, queueHide, touchDif,\n barHeight, percentScroll, lastScroll,\n divS = '
',\n minBarHeight = 30,\n releaseScroll = false;\n\n // used in event handlers and for better minification\n var me = $(this);\n\n // ensure we are not binding it again\n if (me.parent().hasClass(o.wrapperClass))\n {\n // start from last bar position\n var offset = me.scrollTop();\n\n // find bar and rail\n bar = me.siblings('.' + o.barClass);\n rail = me.siblings('.' + o.railClass);\n\n getBarHeight();\n\n // check if we should scroll existing instance\n if ($.isPlainObject(options))\n {\n // Pass height: auto to an existing slimscroll object to force a resize after contents have changed\n if ( 'height' in options && options.height == 'auto' ) {\n me.parent().css('height', 'auto');\n me.css('height', 'auto');\n var height = me.parent().parent().height();\n me.parent().css('height', height);\n me.css('height', height);\n } else if ('height' in options) {\n var h = options.height;\n me.parent().css('height', h);\n me.css('height', h);\n }\n\n if ('scrollTo' in options)\n {\n // jump to a static point\n offset = parseInt(o.scrollTo);\n }\n else if ('scrollBy' in options)\n {\n // jump by value pixels\n offset += parseInt(o.scrollBy);\n }\n else if ('destroy' in options)\n {\n // remove slimscroll elements\n bar.remove();\n rail.remove();\n me.unwrap();\n return;\n }\n\n // scroll content by the given offset\n scrollContent(offset, false, true);\n }\n\n return;\n }\n else if ($.isPlainObject(options))\n {\n if ('destroy' in options)\n {\n \treturn;\n }\n }\n\n // optionally set height to the parent's height\n o.height = (o.height == 'auto') ? me.parent().height() : o.height;\n\n // wrap content\n var wrapper = $(divS)\n .addClass(o.wrapperClass)\n .css({\n position: 'relative',\n overflow: 'hidden',\n width: o.width,\n height: o.height\n });\n\n // update style for the div\n me.css({\n overflow: 'hidden',\n width: o.width,\n height: o.height\n });\n\n // create scrollbar rail\n var rail = $(divS)\n .addClass(o.railClass)\n .css({\n width: o.size,\n height: '100%',\n position: 'absolute',\n top: 0,\n display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',\n 'border-radius': o.railBorderRadius,\n background: o.railColor,\n opacity: o.railOpacity,\n zIndex: 90\n });\n\n // create scrollbar\n var bar = $(divS)\n .addClass(o.barClass)\n .css({\n background: o.color,\n width: o.size,\n position: 'absolute',\n top: 0,\n opacity: o.opacity,\n display: o.alwaysVisible ? 'block' : 'none',\n 'border-radius' : o.borderRadius,\n BorderRadius: o.borderRadius,\n MozBorderRadius: o.borderRadius,\n WebkitBorderRadius: o.borderRadius,\n zIndex: 99\n });\n\n // set position\n var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance };\n rail.css(posCss);\n bar.css(posCss);\n\n // wrap it\n me.wrap(wrapper);\n\n // append to parent div\n me.parent().append(bar);\n me.parent().append(rail);\n\n // make it draggable and no longer dependent on the jqueryUI\n if (o.railDraggable){\n bar.bind(\"mousedown\", function(e) {\n var $doc = $(document);\n isDragg = true;\n t = parseFloat(bar.css('top'));\n pageY = e.pageY;\n\n $doc.bind(\"mousemove.slimscroll\", function(e){\n currTop = t + e.pageY - pageY;\n bar.css('top', currTop);\n scrollContent(0, bar.position().top, false);// scroll content\n });\n\n $doc.bind(\"mouseup.slimscroll\", function(e) {\n isDragg = false;hideBar();\n $doc.unbind('.slimscroll');\n });\n return false;\n }).bind(\"selectstart.slimscroll\", function(e){\n e.stopPropagation();\n e.preventDefault();\n return false;\n });\n }\n\n // on rail over\n rail.hover(function(){\n showBar();\n }, function(){\n hideBar();\n });\n\n // on bar over\n bar.hover(function(){\n isOverBar = true;\n }, function(){\n isOverBar = false;\n });\n\n // show on parent mouseover\n me.hover(function(){\n isOverPanel = true;\n showBar();\n hideBar();\n }, function(){\n isOverPanel = false;\n hideBar();\n });\n\n // support for mobile\n me.bind('touchstart', function(e,b){\n if (e.originalEvent.touches.length)\n {\n // record where touch started\n touchDif = e.originalEvent.touches[0].pageY;\n }\n });\n\n me.bind('touchmove', function(e){\n // prevent scrolling the page if necessary\n if(!releaseScroll)\n {\n \t\t e.originalEvent.preventDefault();\n\t\t }\n if (e.originalEvent.touches.length)\n {\n // see how far user swiped\n var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;\n // scroll content\n scrollContent(diff, true);\n touchDif = e.originalEvent.touches[0].pageY;\n }\n });\n\n // set up initial height\n getBarHeight();\n\n // check start position\n if (o.start === 'bottom')\n {\n // scroll content to bottom\n bar.css({ top: me.outerHeight() - bar.outerHeight() });\n scrollContent(0, true);\n }\n else if (o.start !== 'top')\n {\n // assume jQuery selector\n scrollContent($(o.start).position().top, null, true);\n\n // make sure bar stays hidden\n if (!o.alwaysVisible) { bar.hide(); }\n }\n\n // attach scroll events\n attachWheel(this);\n\n function _onWheel(e)\n {\n // use mouse wheel only when mouse is over\n if (!isOverPanel) { return; }\n\n var e = e || window.event;\n\n var delta = 0;\n if (e.wheelDelta) { delta = -e.wheelDelta/120; }\n if (e.detail) { delta = e.detail / 3; }\n\n var target = e.target || e.srcTarget || e.srcElement;\n if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {\n // scroll content\n scrollContent(delta, true);\n }\n\n // stop window scroll\n if (e.preventDefault && !releaseScroll) { e.preventDefault(); }\n if (!releaseScroll) { e.returnValue = false; }\n }\n\n function scrollContent(y, isWheel, isJump)\n {\n releaseScroll = false;\n var delta = y;\n var maxTop = me.outerHeight() - bar.outerHeight();\n\n if (isWheel)\n {\n // move bar with mouse wheel\n delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();\n\n // move bar, make sure it doesn't go out\n delta = Math.min(Math.max(delta, 0), maxTop);\n\n // if scrolling down, make sure a fractional change to the\n // scroll position isn't rounded away when the scrollbar's CSS is set\n // this flooring of delta would happened automatically when\n // bar.css is set below, but we floor here for clarity\n delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);\n\n // scroll the scrollbar\n bar.css({ top: delta + 'px' });\n }\n\n // calculate actual scroll amount\n percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());\n delta = percentScroll * (me[0].scrollHeight - me.outerHeight());\n\n if (isJump)\n {\n delta = y;\n var offsetTop = delta / me[0].scrollHeight * me.outerHeight();\n offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);\n bar.css({ top: offsetTop + 'px' });\n }\n\n // scroll content\n me.scrollTop(delta);\n\n // fire scrolling event\n me.trigger('slimscrolling', ~~delta);\n\n // ensure bar is visible\n showBar();\n\n // trigger hide when scroll is stopped\n hideBar();\n }\n\n function attachWheel(target)\n {\n if (window.addEventListener)\n {\n target.addEventListener('DOMMouseScroll', _onWheel, false );\n target.addEventListener('mousewheel', _onWheel, false );\n }\n else\n {\n document.attachEvent(\"onmousewheel\", _onWheel)\n }\n }\n\n function getBarHeight()\n {\n // calculate scrollbar height and make sure it is not too small\n barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);\n bar.css({ height: barHeight + 'px' });\n\n // hide scrollbar if content is not long enough\n var display = barHeight == me.outerHeight() ? 'none' : 'block';\n bar.css({ display: display });\n }\n\n function showBar()\n {\n // recalculate bar height\n getBarHeight();\n clearTimeout(queueHide);\n\n // when bar reached top or bottom\n if (percentScroll == ~~percentScroll)\n {\n //release wheel\n releaseScroll = o.allowPageScroll;\n\n // publish approporiate event\n if (lastScroll != percentScroll)\n {\n var msg = (~~percentScroll == 0) ? 'top' : 'bottom';\n me.trigger('slimscroll', msg);\n }\n }\n else\n {\n releaseScroll = false;\n }\n lastScroll = percentScroll;\n\n // show only when required\n if(barHeight >= me.outerHeight()) {\n //allow window scroll\n releaseScroll = true;\n return;\n }\n bar.stop(true,true).fadeIn('fast');\n if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); }\n }\n\n function hideBar()\n {\n // only hide when options allow it\n if (!o.alwaysVisible)\n {\n queueHide = setTimeout(function(){\n if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)\n {\n bar.fadeOut('slow');\n rail.fadeOut('slow');\n }\n }, 1000);\n }\n }\n\n });\n\n // maintain chainability\n return this;\n }\n });\n\n $.fn.extend({\n slimscroll: $.fn.slimScroll\n });\n\n})(jQuery);\n","// This [jQuery](https://jquery.com/) plugin implements an `\");\n\n // The first load event gets fired after the iframe has been injected\n // into the DOM, and is used to prepare the actual submission.\n iframe.one(\"load\", function() {\n\n // The second load event gets fired when the response to the form\n // submission is received. The implementation detects whether the\n // actual payload is embedded in a `\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: jQuery.isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( \">tbody\", elem )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tisFunction = jQuery.isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( isFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( isFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rmargin = ( /^margin/ );\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdiv.style.cssText =\n\t\t\t\"box-sizing:border-box;\" +\n\t\t\t\"position:relative;display:block;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"top:1%;width:50%\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocumentElement.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = divStyle.marginLeft === \"2px\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\t// Support: Android 4.0 - 4.3 only\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.marginRight = \"50%\";\n\t\tpixelMarginRightVal = divStyle.marginRight === \"4px\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:8px;height:0;top:0;left:-9999px;\" +\n\t\t\"padding:0;margin-top:1px;position:absolute\";\n\tcontainer.appendChild( div );\n\n\tjQuery.extend( support, {\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelMarginRight: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelMarginRightVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a property mapped along what jQuery.cssProps suggests or to\n// a vendor prefixed property.\nfunction finalPropName( name ) {\n\tvar ret = jQuery.cssProps[ name ];\n\tif ( !ret ) {\n\t\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\n\t}\n\treturn ret;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i,\n\t\tval = 0;\n\n\t// If we already have the right measurement, avoid augmentation\n\tif ( extra === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\ti = 4;\n\n\t// Otherwise initialize for horizontal or vertical properties\n\t} else {\n\t\ti = name === \"width\" ? 1 : 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with computed style\n\tvar valueIsBorderBox,\n\t\tstyles = getStyles( elem ),\n\t\tval = curCSS( elem, name, styles ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Computed unit is not pixels. Stop here and return.\n\tif ( rnumnonpx.test( val ) ) {\n\t\treturn val;\n\t}\n\n\t// Check for style in case a browser which returns unreliable values\n\t// for getComputedStyle silently falls back to the reliable elem.style\n\tvalueIsBorderBox = isBorderBox &&\n\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t// Fall back to offsetWidth/Height when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\tif ( val === \"auto\" ) {\n\t\tval = elem[ \"offset\" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];\n\t}\n\n\t// Normalize \"\", auto, and prepare for extra\n\tval = parseFloat( val ) || 0;\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = extra && getStyles( elem ),\n\t\t\t\tsubtract = extra && augmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ name ] = value;\n\t\t\t\tvalue = jQuery.css( elem, name );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 13\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( jQuery.isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tjQuery.proxy( result.stop, result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnothtmlwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnothtmlwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( type === \"string\" ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = value.match( rnothtmlwhite ) || [];\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = jQuery.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = jQuery.isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 13\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"\\n\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlP2FiYTYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjdGlvbi1saW5rW2RhdGEtdi0yMjU3NzhjMl0ge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5tLWItbm9uZVtkYXRhLXYtMjI1Nzc4YzJdIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIlBlcnNvbmFsQWNjZXNzVG9rZW5zLnZ1ZT81NzM0ZjRlNFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJQZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVxcXCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2Vuc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cXFwiYWN0aW9uLWxpbmtcXFwiIEBjbGljaz1cXFwic2hvd0NyZWF0ZVRva2VuRm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBOZXcgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBUb2tlbnMgTm90aWNlIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XFxcIm0tYi1ub25lXFxcIiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID09PSAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZSBub3QgY3JlYXRlZCBhbnkgcGVyc29uYWwgYWNjZXNzIHRva2Vucy5cXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUGVyc29uYWwgQWNjZXNzIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCIgdi1pZj1cXFwidG9rZW5zLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cXFwidG9rZW4gaW4gdG9rZW5zXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xpZW50IE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b2tlbi5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGUgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gTW9kYWwgLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbCBmYWRlXFxcIiBpZD1cXFwibW9kYWwtY3JlYXRlLXRva2VuXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZm9ybS5lcnJvcnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+V2hvb3BzITwvc3Ryb25nPiBTb21ldGhpbmcgd2VudCB3cm9uZyE8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIHYtZm9yPVxcXCJlcnJvciBpbiBmb3JtLmVycm9yc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXJyb3IgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gRm9ybSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cXFwiZm9ybS1ob3Jpem9udGFsXFxcIiByb2xlPVxcXCJmb3JtXFxcIiBAc3VibWl0LnByZXZlbnQ9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+TmFtZTwvbGFiZWw+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJjcmVhdGUtdG9rZW4tbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwibmFtZVxcXCIgdi1tb2RlbD1cXFwiZm9ybS5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTY29wZXMgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIHYtaWY9XFxcInNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+U2NvcGVzPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC02XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtZm9yPVxcXCJzY29wZSBpbiBzY29wZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjaGVja2JveFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcInRvZ2dsZVNjb3BlKHNjb3BlLmlkKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNoZWNrZWQ9XFxcInNjb3BlSXNBc3NpZ25lZChzY29wZS5pZClcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzY29wZS5pZCB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQWNjZXNzIFRva2VuIE1vZGFsIC0tPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwgZmFkZVxcXCIgaWQ9XFxcIm1vZGFsLWFjY2Vzcy10b2tlblxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2VuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgeW91ciBuZXcgcGVyc29uYWwgYWNjZXNzIHRva2VuLiBUaGlzIGlzIHRoZSBvbmx5IHRpbWUgaXQgd2lsbCBiZSBzaG93biBzbyBkb24ndCBsb3NlIGl0IVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IG5vdyB1c2UgdGhpcyB0b2tlbiB0byBtYWtlIEFQSSByZXF1ZXN0cy5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT57eyBhY2Nlc3NUb2tlbiB9fTwvY29kZT48L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNb2RhbCBBY3Rpb25zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCI+Q2xvc2U8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogbnVsbCxcXG5cXG4gICAgICAgICAgICAgICAgdG9rZW5zOiBbXSxcXG4gICAgICAgICAgICAgICAgc2NvcGVzOiBbXSxcXG5cXG4gICAgICAgICAgICAgICAgZm9ybToge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICBzY29wZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW5zKCk7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2NvcGVzKCk7XFxuXFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5vbignc2hvd24uYnMubW9kYWwnLCAoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAkKCcjY3JlYXRlLXRva2VuLW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zID0gcmVzcG9uc2UuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBzY29wZXMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgZ2V0U2NvcGVzKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmdldCgnL29hdXRoL3Njb3BlcycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlcyA9IHJlc3BvbnNlLmRhdGE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBTaG93IHRoZSBmb3JtIGZvciBjcmVhdGluZyBuZXcgdG9rZW5zLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dDcmVhdGVUb2tlbkZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5tb2RhbCgnc2hvdycpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogQ3JlYXRlIGEgbmV3IHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBzdG9yZSgpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XFxuXFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2VucycsIHRoaXMuZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5uYW1lID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmVycm9ycyA9IFtdO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHJlc3BvbnNlLmRhdGEudG9rZW4pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBY2Nlc3NUb2tlbihyZXNwb25zZS5kYXRhLmFjY2Vzc1Rva2VuKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBfLmZsYXR0ZW4oXy50b0FycmF5KHJlc3BvbnNlLmRhdGEpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kaXIodGhpcy5mb3JtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLiddO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBUb2dnbGUgdGhlIGdpdmVuIHNjb3BlIGluIHRoZSBsaXN0IG9mIGFzc2lnbmVkIHNjb3Blcy5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB0b2dnbGVTY29wZShzY29wZSkge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZUlzQXNzaWduZWQoc2NvcGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2NvcGVzID0gXy5yZWplY3QodGhpcy5mb3JtLnNjb3BlcywgcyA9PiBzID09IHNjb3BlKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMucHVzaChzY29wZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gc2NvcGUgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRva2VuLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNjb3BlSXNBc3NpZ25lZChzY29wZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5pbmRleE9mKHRoaXMuZm9ybS5zY29wZXMsIHNjb3BlKSA+PSAwO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZ2l2ZW4gYWNjZXNzIHRva2VuIHRvIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLXRva2VuJykubW9kYWwoJ2hpZGUnKTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtYWNjZXNzLXRva2VuJykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFJldm9rZSB0aGUgZ2l2ZW4gdG9rZW4uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcmV2b2tlKHRva2VuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZGVsZXRlKCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2Vucy8nICsgdG9rZW4uaWQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXX1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0yMjU3NzhjMiZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9wYXNzcG9ydC9QZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcbi8vIG1vZHVsZSBpZCA9IDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); - -/***/ }, -/* 20 */ -/***/ function(module, exports, __webpack_require__) { - -eval("exports = module.exports = __webpack_require__(0)();\nexports.push([module.i, \"\\n\\n\", \"\", {\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"file\":\"alert.vue\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvYWxlcnQudnVlP2EwMWUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJcIixcImZpbGVcIjpcImFsZXJ0LnZ1ZVwifV0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNlZGVmM2JhJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2FsZXJ0LnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); - -/***/ }, -/* 21 */ -/***/ function(module, exports, __webpack_require__) { - -eval("exports = module.exports = __webpack_require__(0)();\nexports.push([module.i, \"\\ntd[data-v-5301a236] {\\n font-size: 14px;\\n}\\n\", \"\", {\"version\":3,\"sources\":[\"importer.vue?ec28e03c\"],\"names\":[],\"mappings\":\";AACA;IACA,gBAAA;CACA\",\"file\":\"importer.vue\",\"sourcesContent\":[\"\\n\\n\\n\\n\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXIudnVlPzNiMGEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxudGRbZGF0YS12LTUzMDFhMjM2XSB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcImltcG9ydGVyLnZ1ZT9lYzI4ZTAzY1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJpbXBvcnRlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG50ZCB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuPC9zdHlsZT5cXG48dGVtcGxhdGU+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJvd1xcXCI+XFxuICAgICAgICA8YWxlcnQgdi1zaG93PVxcXCJhbGVydC52aXNpYmxlXFxcIiA6YWxlcnRUeXBlPVxcXCJhbGVydC50eXBlXFxcIiB2LW9uOmhpZGU9XFxcImFsZXJ0LnZpc2libGUgPSBmYWxzZVxcXCI+e3sgYWxlcnQubWVzc2FnZSB9fTwvYWxlcnQ+XFxuICAgICAgICA8ZXJyb3JzIDplcnJvcnM9XFxcImltcG9ydEVycm9yc1xcXCI+PC9lcnJvcnM+XFxuICAgICAgICA8bW9kYWwgdi1tb2RlbD1cXFwiZGlzcGxheUltcG9ydE1vZGFsXFxcIiBlZmZlY3Q9XFxcImZhZGVcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgc2xvdD1cXFwibW9kYWwtaGVhZGVyXFxcIiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVxcXCJtb2RhbC10aXRsZVxcXCI+SW1wb3J0IEZpbGU6PC9oND5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IHNsb3Q9XFxcIm1vZGFsLWJvZHlcXFwiIGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZHluYW1pYy1mb3JtLXJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNCBjb2wteHMtMTJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJpbXBvcnQtdHlwZVxcXCI+SW1wb3J0IFR5cGU6PC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTggY29sLXhzLTEyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0MiA6b3B0aW9ucz1cXFwibW9kYWwuaW1wb3J0VHlwZXNcXFwiIHYtbW9kZWw9XFxcIm1vZGFsLmltcG9ydFR5cGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPVxcXCIwXFxcIj48L29wdGlvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdDI+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkeW5hbWljLWZvcm0tcm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC00IGNvbC14cy0xMlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImltcG9ydC11cGRhdGVcXFwiPlVwZGF0ZSBFeGlzdGluZyBWYWx1ZXM/OjwvbGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC04IGNvbC14cy0xMlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBuYW1lPVxcXCJpbXBvcnQtdXBkYXRlXFxcIiB2LW1vZGVsPVxcXCJtb2RhbC51cGRhdGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIiBzbG90PVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1zdWNjZXNzIGNvbC1tZC01IGNvbC1tZC1vZmZzZXQtMVxcXCIgc3R5bGU9XFxcInRleHQtYWxpZ246bGVmdFxcXCIgdi1pZj1cXFwibW9kYWwuc3RhdHVzVGV4dFxcXCI+e3sgdGhpcy5tb2RhbC5zdGF0dXNUZXh0IH19PC9kaXY+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBAY2xpY2s9XFxcImRpc3BsYXlJbXBvcnRNb2RhbCA9IGZhbHNlXFxcIj5DYW5jZWw8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwicG9zdFNhdmVcXFwiPlByb2Nlc3M8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvbW9kYWw+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTJcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBmaWxlaW5wdXQtYnV0dG9uIHNwYW4gaXMgdXNlZCB0byBzdHlsZSB0aGUgZmlsZSBpbnB1dCBmaWVsZCBhcyBidXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJidG4gYnRuLWluZm8gZmlsZWlucHV0LWJ1dHRvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TZWxlY3QgSW1wb3J0IEZpbGUuLi48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBmaWxlIGlucHV0IGZpZWxkIHVzZWQgYXMgdGFyZ2V0IGZvciB0aGUgZmlsZSB1cGxvYWQgd2lkZ2V0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJmaWxldXBsb2FkXFxcIiB0eXBlPVxcXCJmaWxlXFxcIiBuYW1lPVxcXCJmaWxlc1tdXFxcIiBkYXRhLXVybD1cXFwiL2FwaS92MS9pbXBvcnRzXFxcIiBhY2NlcHQ9XFxcInRleHQvY3N2XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC05XFxcIiB2LXNob3c9XFxcInByb2dyZXNzLnZpc2libGVcXFwiIHN0eWxlPVxcXCJwYWRkaW5nLWJvdHRvbToyMHB4XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTExXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInByb2dyZXNzIHByb2dyZXNzLXN0cmlwZWQtYWN0aXZlXFxcIiBzdHlsZT1cXFwibWFyZ2luLXRvcDogOHB4XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwcm9ncmVzcy1iYXJcXFwiIDpjbGFzcz1cXFwicHJvZ3Jlc3MuY3VycmVudENsYXNzXFxcIiByb2xlPVxcXCJwcm9ncmVzc2JhclxcXCIgOnN0eWxlPVxcXCJwcm9ncmVzc1dpZHRoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJvZ3Jlc3Muc3RhdHVzVGV4dCB9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XFxcInRhYmxlIHRhYmxlLXN0cmlwZWRcXFwiIGlkPVxcXCJ1cGxvYWQtdGFibGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5GaWxlPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+Q3JlYXRlZDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNpemU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImZpbGUgaW4gZmlsZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZmlsZS5maWxlX3BhdGggfX08L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZmlsZS5jcmVhdGVkX2F0IH19IDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBmaWxlLmZpbGVzaXplIH19PC90ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiYnRuIGJ0bi1zbSBidG4taW5mb1xcXCIgQGNsaWNrPVxcXCJzaG93TW9kYWwoZmlsZSlcXFwiPjxpIGNsYXNzPVxcXCJmYSBmYS1zcGlubmVyIHByb2Nlc3NcXFwiPjwvaT5Qcm9jZXNzPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJidG4gYnRuLXNtIGJ0bi1kYW5nZXJcXFwiIEBjbGljaz1cXFwiZGVsZXRlRmlsZShmaWxlKVxcXCI+PGkgY2xhc3M9XFxcImZhIGZhLXRyYXNoIGljb24td2hpdGVcXFwiPjwvaT48L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIHJlcXVpcmUoJ2JsdWVpbXAtZmlsZS11cGxvYWQnKTtcXG4gICAgdmFyIG1vZGFsID0gcmVxdWlyZSgndnVlLXN0cmFwJykubW9kYWxcXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGZpbGVzOiBbXSxcXG4gICAgICAgICAgICAgICAgZGlzcGxheUltcG9ydE1vZGFsOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgYWN0aXZlRmlsZTogbnVsbCxcXG4gICAgICAgICAgICAgICAgYWxlcnQ6IHtcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBudWxsLFxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIG1vZGFsOiB7XFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRUeXBlOiAnYXNzZXQnLFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydFR5cGVzOiBbXFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogJ2Fzc2V0JywgdGV4dDogJ0Fzc2V0cycgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAnYWNjZXNzb3J5JywgdGV4dDogJ0FjY2Vzc29yaWVzJyB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdjb25zdW1hYmxlJywgdGV4dDogJ0NvbnN1bWFibGUnIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogJ2NvbXBvbmVudCcsIHRleHQ6ICdDb21wb25lbnRzJyB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdsaWNlbnNlJywgdGV4dDogJ0xpY2Vuc2VzJyB9XFxuICAgICAgICAgICAgICAgICAgICBdLFxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogbnVsbCxcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgaW1wb3J0RXJyb3JzOiBudWxsLFxcbiAgICAgICAgICAgICAgICBwcm9ncmVzczoge1xcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzOiBcXFwicHJvZ3Jlc3MtYmFyLXdhcm5pbmdcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBlcmNlbnQ6IFxcXCIwXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6ICcnLFxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLyoqXFxuICAgICAgICAgKiBQcmVwYXJlIHRoZSBjb21wb25lbnQgKFZ1ZSAyLngpLlxcbiAgICAgICAgICovXFxuICAgICAgICBtb3VudGVkKCkge1xcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hGaWxlcygpO1xcbiAgICAgICAgICAgIGxldCB2bSA9IHRoaXM7XFxuICAgICAgICAgICAgJCgnI2ZpbGV1cGxvYWQnKS5maWxldXBsb2FkKHtcXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcXG4gICAgICAgICAgICAgICAgZG9uZShlLCBkYXRhKSB7XFxuICAgICAgICAgICAgICAgICAgICB2bS5wcm9ncmVzcy5jdXJyZW50Q2xhc3M9XFxcInByb2dyZXNzLWJhci1zdWNjZXNzXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLnN0YXR1c1RleHQgPSBcXFwiU3VjY2VzcyFcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgdm0uZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlcy5jb25jYXQodm0uZmlsZXMpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBhZGQoZSwgZGF0YSkge1xcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5oZWFkZXJzID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJYLVJlcXVlc3RlZC1XaXRoXFxcIjogJ1hNTEh0dHBSZXF1ZXN0JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiWC1DU1JGLVRPS0VOXFxcIjogTGFyYXZlbC5jc3JmVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKCAoKSA9PiB7ZGF0YS5zdWJtaXQoKTt9KTtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLnZpc2libGU9dHJ1ZTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3MoZSwgZGF0YSkge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2dyZXNzID0gcGFyc2VJbnQoKGRhdGEubG9hZGVkIC8gZGF0YS50b3RhbCAqIDEwMCwgMTApKTtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLmN1cnJlbnRQZXJjZW50ID0gcHJvZ3Jlc3M7XFxuICAgICAgICAgICAgICAgICAgICB2bS5wcm9ncmVzcy5zdGF0dXNUZXh0ID0gcHJvZ3Jlc3MrJyUgQ29tcGxldGUnO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBmYWlsKGUsIGRhdGEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzLmN1cnJlbnRDbGFzcyA9IFxcXCJwcm9ncmVzcy1iYXItZGFuZ2VyXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIC8vIERpc3BsYXkgYW55IGVycm9ycyByZXR1cm5lZCBmcm9tIHRoZSAkLmFqYXgoKVxcbiAgICAgICAgICAgICAgICAgICAgdm0ucHJvZ3Jlc3Muc3RhdHVzVGV4dCA9IGRhdGEuanFYSFIucmVzcG9uc2VKU09OLm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgZmV0Y2hGaWxlcygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9hcGkvdjEvaW1wb3J0cycpXFxuICAgICAgICAgICAgICAgIC50aGVuKCAoe2RhdGF9KSA9PiB0aGlzLmZpbGVzID0gZGF0YSwgLy8gU3VjY2Vzc1xcbiAgICAgICAgICAgICAgICAgICAgLy9GYWlsXFxuICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC50eXBlPVxcXCJkYW5nZXJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC52aXNpYmxlPXRydWU7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0Lm1lc3NhZ2U9XFxcIlNvbWV0aGluZyB3ZW50IHdyb25nIGZldGNoaW5nIGZpbGVzLi4uXFxcIjtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBkZWxldGVGaWxlKGZpbGUsIGtleSkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZShcXFwiL2FwaS92MS9pbXBvcnRzL1xcXCIrZmlsZS5pZClcXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB0aGlzLmZpbGVzLnNwbGljZShrZXksIDEpLCAvLyBTdWNjZXNzXFxuICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHsvLyBGYWlsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC50eXBlPVxcXCJkYW5nZXJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQudmlzaWJsZT10cnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQubWVzc2FnZT1yZXNwb25zZS5ib2R5Lm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgc2hvd01vZGFsKGZpbGUpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGaWxlID0gZmlsZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SW1wb3J0TW9kYWwgPSB0cnVlO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgcG9zdFNhdmUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuc3RhdHVzVGV4dCA9IFxcXCJQcm9jZXNzaW5nLi4uXFxcIjtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvYXBpL3YxL2ltcG9ydHMvcHJvY2Vzcy8nK3RoaXMuYWN0aXZlRmlsZS5pZCwge1xcbiAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydC11cGRhdGUnOiB0aGlzLm1vZGFsLnVwZGF0ZSxcXG4gICAgICAgICAgICAgICAgICAgICdpbXBvcnQtdHlwZSc6IHRoaXMubW9kYWwuaW1wb3J0VHlwZVxcbiAgICAgICAgICAgICAgICB9KS50aGVuKCAocmVzcG9uc2UpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3NcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuc3RhdHVzVGV4dCA9IFxcXCJTdWNjZXNzLi4uIFJlZGlyZWN0aW5nLlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlLmJvZHkubWVzc2FnZXMucmVkaXJlY3RfdXJsO1xcbiAgICAgICAgICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vIEZhaWx1cmVcXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmJvZHkuc3RhdHVzID09ICdpbXBvcnQtZXJyb3JzJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0RXJyb3JzID0gcmVzcG9uc2UuYm9keS5tZXNzYWdlcztcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC5tZXNzYWdlPSByZXNwb25zZS5ib2R5Lm1lc3NhZ2VzO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQudHlwZT1cXFwiZGFuZ2VyXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0LnZpc2libGU9dHJ1ZTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUltcG9ydE1vZGFsPWZhbHNlO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICB9LFxcblxcbiAgICAgICAgY29tcHV0ZWQ6IHtcXG4gICAgICAgICAgICBwcm9ncmVzc1dpZHRoKCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcIndpZHRoOiBcXFwiK3RoaXMucHJvZ3Jlc3MuY3VycmVudFBlcmNlbnQqMTArJyUnO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBjb21wb25lbnRzOiB7XFxuICAgICAgICAgICAgbW9kYWwsXFxuICAgICAgICAgICAgZXJyb3JzOiByZXF1aXJlKCcuL2ltcG9ydGVyLWVycm9ycy52dWUnKSxcXG4gICAgICAgICAgICBhbGVydDogcmVxdWlyZSgnLi4vYWxlcnQudnVlJyksXFxuICAgICAgICAgICAgc2VsZWN0MjogcmVxdWlyZSgnLi4vc2VsZWN0Mi52dWUnKVxcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuPC9zY3JpcHQ+XFxuXCJdfV0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTUzMDFhMjM2JnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2ltcG9ydGVyL2ltcG9ydGVyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); - -/***/ }, -/* 22 */ -/***/ function(module, exports, __webpack_require__) { - -eval("exports = module.exports = __webpack_require__(0)();\nexports.push([module.i, \"\\n\\n\", \"\", {\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"file\":\"importer-errors.vue\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZT8zYWQ2Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcblxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiXCIsXCJmaWxlXCI6XCJpbXBvcnRlci1lcnJvcnMudnVlXCJ9XSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNTY2N2MzMTImc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); - -/***/ }, -/* 23 */ -/***/ function(module, exports, __webpack_require__) { - -eval("exports = module.exports = __webpack_require__(0)();\nexports.push([module.i, \"\\n.action-link[data-v-de0d0e4e] {\\n cursor: pointer;\\n}\\n.m-b-none[data-v-de0d0e4e] {\\n margin-bottom: 0;\\n}\\n\", \"\", {\"version\":3,\"sources\":[\"AuthorizedClients.vue?a99076c0\"],\"names\":[],\"mappings\":\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\",\"file\":\"AuthorizedClients.vue\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlPzA2NGIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjdGlvbi1saW5rW2RhdGEtdi1kZTBkMGU0ZV0ge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5tLWItbm9uZVtkYXRhLXYtZGUwZDBlNGVdIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIkF1dGhvcml6ZWRDbGllbnRzLnZ1ZT9hOTkwNzZjMFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBdXRob3JpemVkQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmdcXFwiPkF1dGhvcml6ZWQgQXBwbGljYXRpb25zPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRob3JpemVkIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+U2NvcGVzPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcInRva2VuIGluIHRva2Vuc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudCBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uY2xpZW50Lm5hbWUgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNjb3BlcyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XFxcInRva2VuLnNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uc2NvcGVzLmpvaW4oJywgJykgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXZva2UgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZva2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICB0b2tlbnM6IFtdXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBwcmVwYXJlQ29tcG9uZW50KCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogR2V0IGFsbCBvZiB0aGUgYXV0aG9yaXplZCB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC90b2tlbnMnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbnMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUmV2b2tlIHRoZSBnaXZlbiB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICByZXZva2UodG9rZW4pIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5kZWxldGUoJy9vYXV0aC90b2tlbnMvJyArIHRva2VuLmlkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbnMoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cIl19XSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZGUwZDBlNGUmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlXG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); - -/***/ }, -/* 24 */ -/***/ function(module, exports, __webpack_require__) { - -eval("exports = module.exports = __webpack_require__(0)();\nexports.push([module.i, \"\\n.action-link[data-v-e9c80318] {\\n cursor: pointer;\\n}\\n.m-b-none[data-v-e9c80318] {\\n margin-bottom: 0;\\n}\\n\", \"\", {\"version\":3,\"sources\":[\"Clients.vue?35867ce4\"],\"names\":[],\"mappings\":\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\",\"file\":\"Clients.vue\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\"]}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/ZjE0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LWU5YzgwMzE4XSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi1lOWM4MDMxOF0ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiQ2xpZW50cy52dWU/MzU4NjdjZTRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0EsZ0JBQUE7Q0FDQTtBQUVBO0lBQ0EsaUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XFxcImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgT0F1dGggQ2xpZW50c1xcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcInNob3dDcmVhdGVDbGllbnRGb3JtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IENsaWVudFxcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBDdXJyZW50IENsaWVudHMgLS0+XFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVxcXCJtLWItbm9uZVxcXCIgdi1pZj1cXFwiY2xpZW50cy5sZW5ndGggPT09IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgWW91IGhhdmUgbm90IGNyZWF0ZWQgYW55IE9BdXRoIGNsaWVudHMuXFxuICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVxcXCJ0YWJsZSB0YWJsZS1ib3JkZXJsZXNzIG0tYi1ub25lXFxcIiB2LWlmPVxcXCJjbGllbnRzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkNsaWVudCBJRDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNlY3JldDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImNsaWVudCBpbiBjbGllbnRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJRCAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjbGllbnQuaWQgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNsaWVudC5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VjcmV0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt7IGNsaWVudC5zZWNyZXQgfX08L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRWRpdCBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcImVkaXQoY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZSBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcImRlc3Ryb3koY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgIDwvdGFibGU+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1jcmVhdGUtY2xpZW50XFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgQ2xpZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtIEVycm9ycyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1kYW5nZXJcXFwiIHYtaWY9XFxcImNyZWF0ZUZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gY3JlYXRlRm9ybS5lcnJvcnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVycm9yIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBGb3JtIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVxcXCJmb3JtLWhvcml6b250YWxcXFwiIHJvbGU9XFxcImZvcm1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5OYW1lPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImNyZWF0ZS1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJzdG9yZVxcXCIgdi1tb2RlbD1cXFwiY3JlYXRlRm9ybS5uYW1lXFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aGluZyB5b3VyIHVzZXJzIHdpbGwgcmVjb2duaXplIGFuZCB0cnVzdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVkaXJlY3QgVVJMIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTMgY29udHJvbC1sYWJlbFxcXCI+UmVkaXJlY3QgVVJMPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwicmVkaXJlY3RcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBrZXl1cC5lbnRlcj1cXFwic3RvcmVcXFwiIHYtbW9kZWw9XFxcImNyZWF0ZUZvcm0ucmVkaXJlY3RcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91ciBhcHBsaWNhdGlvbidzIGF1dGhvcml6YXRpb24gY2FsbGJhY2sgVVJMLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTW9kYWwgQWN0aW9ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIGRhdGEtZGlzbWlzcz1cXFwibW9kYWxcXFwiPkNsb3NlPC9idXR0b24+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwic3RvcmVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBFZGl0IENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1lZGl0LWNsaWVudFxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBDbGllbnRcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZWRpdEZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gZWRpdEZvcm0uZXJyb3JzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlcnJvciB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVkaXQgQ2xpZW50IEZvcm0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XFxcImZvcm0taG9yaXpvbnRhbFxcXCIgcm9sZT1cXFwiZm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmFtZSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XFxcImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcXFwiPk5hbWU8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwiZWRpdC1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLm5hbWVcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZXRoaW5nIHlvdXIgdXNlcnMgd2lsbCByZWNvZ25pemUgYW5kIHRydXN0LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWRpcmVjdCBVUkwgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5SZWRpcmVjdCBVUkw8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuYW1lPVxcXCJyZWRpcmVjdFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLnJlZGlyZWN0XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdXIgYXBwbGljYXRpb24ncyBhdXRob3JpemF0aW9uIGNhbGxiYWNrIFVSTC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInVwZGF0ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgQ2hhbmdlc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvdGVtcGxhdGU+XFxuXFxuPHNjcmlwdD5cXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGNsaWVudHM6IFtdLFxcblxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb3JtOiB7XFxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogJydcXG4gICAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAgICAgZWRpdEZvcm06IHtcXG4gICAgICAgICAgICAgICAgICAgIGVycm9yczogW10sXFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyxcXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnJ1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLWNsaWVudCcpLm9uKCdzaG93bi5icy5tb2RhbCcsICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGUtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50Jykub24oJ3Nob3duLmJzLm1vZGFsJywgKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgJCgnI2VkaXQtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIE9BdXRoIGNsaWVudHMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldENsaWVudHMoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZ2V0KCcvb2F1dGgvY2xpZW50cycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZm9ybSBmb3IgY3JlYXRpbmcgbmV3IGNsaWVudHMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgc2hvd0NyZWF0ZUNsaWVudEZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIENyZWF0ZSBhIG5ldyBPQXV0aCBjbGllbnQgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHN0b3JlKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RDbGllbnQoXFxuICAgICAgICAgICAgICAgICAgICAncG9zdCcsICcvb2F1dGgvY2xpZW50cycsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm0sICcjbW9kYWwtY3JlYXRlLWNsaWVudCdcXG4gICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEVkaXQgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBlZGl0KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLmlkID0gY2xpZW50LmlkO1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLm5hbWUgPSBjbGllbnQubmFtZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5yZWRpcmVjdCA9IGNsaWVudC5yZWRpcmVjdDtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgY2xpZW50IGJlaW5nIGVkaXRlZC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB1cGRhdGUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdENsaWVudChcXG4gICAgICAgICAgICAgICAgICAgICdwdXQnLCAnL29hdXRoL2NsaWVudHMvJyArIHRoaXMuZWRpdEZvcm0uaWQsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLCAnI21vZGFsLWVkaXQtY2xpZW50J1xcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUGVyc2lzdCB0aGUgY2xpZW50IHRvIHN0b3JhZ2UgdXNpbmcgdGhlIGdpdmVuIGZvcm0uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcGVyc2lzdENsaWVudChtZXRob2QsIHVyaSwgZm9ybSwgbW9kYWwpIHtcXG4gICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cFttZXRob2RdKHVyaSwgZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsaWVudHMoKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLm5hbWUgPSAnJztcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlZGlyZWN0ID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAkKG1vZGFsKS5tb2RhbCgnaGlkZScpO1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5kYXRhID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmVycm9ycyA9IF8uZmxhdHRlbihfLnRvQXJyYXkocmVzcG9uc2UuZGF0YSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZXJyb3JzID0gWydTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERlc3Ryb3kgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBkZXN0cm95KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZSgnL29hdXRoL2NsaWVudHMvJyArIGNsaWVudC5pZClcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXX1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1lOWM4MDMxOCZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9wYXNzcG9ydC9DbGllbnRzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); - -/***/ }, -/* 25 */ -/***/ function(module, exports, __webpack_require__) { - -eval("exports = module.exports = __webpack_require__(0)();\nexports.push([module.i, \"\\n\\n\", \"\", {\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"file\":\"select2.vue\"}]);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvc2VsZWN0Mi52dWU/MTkwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwic2VsZWN0Mi52dWVcIn1dKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZjU2NGE4NiZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9zZWxlY3QyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); - -/***/ }, -/* 26 */ -/***/ function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {\n\tif ( true ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} ( function( $ ) {\n\n$.ui = $.ui || {};\n\nreturn $.ui.version = \"1.12.1\";\n\n} ) );\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzP2JkNDEiXSwic291cmNlc0NvbnRlbnQiOlsiKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSAoIGZ1bmN0aW9uKCAkICkge1xuXG4kLnVpID0gJC51aSB8fCB7fTtcblxucmV0dXJuICQudWkudmVyc2lvbiA9IFwiMS4xMi4xXCI7XG5cbn0gKSApO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9"); - -/***/ }, -/* 27 */ -/***/ function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery UI Widget 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: http://api.jqueryui.com/jQuery.widget/\n//>>demos: http://jqueryui.com/widget/\n\n( function( factory ) {\n\tif ( true ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3), __webpack_require__(26) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}( function( $ ) {\n\nvar widgetUuid = 0;\nvar widgetSlice = Array.prototype.slice;\n\n$.cleanData = ( function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\ttry {\n\n\t\t\t\t// Only trigger remove when necessary to save time\n\t\t\t\tevents = $._data( elem, \"events\" );\n\t\t\t\tif ( events && events.remove ) {\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t\t}\n\n\t\t\t// Http://bugs.jquery.com/ticket/8235\n\t\t\t} catch ( e ) {}\n\t\t}\n\t\torig( elems );\n\t};\n} )( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar existingConstructor, constructor, basePrototype;\n\n\t// ProxiedPrototype allows the provided prototype to remain unmodified\n\t// so that it can be used as a mixin for multiple widgets (#8876)\n\tvar proxiedPrototype = {};\n\n\tvar namespace = name.split( \".\" )[ 0 ];\n\tname = name.split( \".\" )[ 1 ];\n\tvar fullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\tif ( $.isArray( prototype ) ) {\n\t\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\n\t}\n\n\t// Create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\n\t\t// Allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// Allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\t// Extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\n\t\t// Copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\n\t\t// Track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t} );\n\n\tbasePrototype = new base();\n\n\t// We need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = ( function() {\n\t\t\tfunction _super() {\n\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t}\n\n\t\t\tfunction _superApply( args ) {\n\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t}\n\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super;\n\t\t\t\tvar __superApply = this._superApply;\n\t\t\t\tvar returnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t} )();\n\t} );\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t} );\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// Redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor,\n\t\t\t\tchild._proto );\n\t\t} );\n\n\t\t// Remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widgetSlice.call( arguments, 1 );\n\tvar inputIndex = 0;\n\tvar inputLength = input.length;\n\tvar key;\n\tvar value;\n\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\";\n\t\tvar args = widgetSlice.call( arguments, 1 );\n\t\tvar returnValue = this;\n\n\t\tif ( isMethodCall ) {\n\n\t\t\t// If this is an empty collection, we need to have the instance method\n\t\t\t// return undefined instead of the jQuery instance\n\t\t\tif ( !this.length && options === \"instance\" ) {\n\t\t\t\treturnValue = undefined;\n\t\t\t} else {\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvar methodValue;\n\t\t\t\t\tvar instance = $.data( this, fullName );\n\n\t\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\t\treturnValue = instance;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\treturn $.error( \"cannot call methods on \" + name +\n\t\t\t\t\t\t\t\" prior to initialization; \" +\n\t\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name +\n\t\t\t\t\t\t\t\" widget instance\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\n\t\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\t\tmethodValue;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\n\t\t\t}\n\n\t\t\tthis.each( function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"
\",\n\n\toptions: {\n\t\tclasses: {},\n\t\tdisabled: false,\n\n\t\t// Callbacks\n\t\tcreate: null\n\t},\n\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widgetUuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\t\tthis.classesElementLookup = {};\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.document = $( element.style ?\n\n\t\t\t\t// Element within the document\n\t\t\t\telement.ownerDocument :\n\n\t\t\t\t// Element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._setOptionDisabled( this.options.disabled );\n\t\t}\n\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn {};\n\t},\n\n\t_getCreateEventData: $.noop,\n\n\t_create: $.noop,\n\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tvar that = this;\n\n\t\tthis._destroy();\n\t\t$.each( this.classesElementLookup, function( key, value ) {\n\t\t\tthat._removeClass( value, key );\n\t\t} );\n\n\t\t// We can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName );\n\t\tthis.widget()\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" );\n\n\t\t// Clean up events and states\n\t\tthis.bindings.off( this.eventNamespace );\n\t},\n\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\t\tvar parts;\n\t\tvar curOption;\n\t\tvar i;\n\n\t\tif ( arguments.length === 0 ) {\n\n\t\t\t// Don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\n\t\t\t// Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"classes\" ) {\n\t\t\tthis._setOptionClasses( value );\n\t\t}\n\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._setOptionDisabled( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOptionClasses: function( value ) {\n\t\tvar classKey, elements, currentElements;\n\n\t\tfor ( classKey in value ) {\n\t\t\tcurrentElements = this.classesElementLookup[ classKey ];\n\t\t\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\n\t\t\t\t\t!currentElements ||\n\t\t\t\t\t!currentElements.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We are doing this to create a new jQuery object because the _removeClass() call\n\t\t\t// on the next line is going to destroy the reference to the current elements being\n\t\t\t// tracked. We need to save a copy of this collection so that we can add the new classes\n\t\t\t// below.\n\t\t\telements = $( currentElements.get() );\n\t\t\tthis._removeClass( currentElements, classKey );\n\n\t\t\t// We don't use _addClass() here, because that uses this.options.classes\n\t\t\t// for generating the string of classes. We want to use the value passed in from\n\t\t\t// _setOption(), this is the new value of the classes option which was passed to\n\t\t\t// _setOption(). We pass this value directly to _classes().\n\t\t\telements.addClass( this._classes( {\n\t\t\t\telement: elements,\n\t\t\t\tkeys: classKey,\n\t\t\t\tclasses: value,\n\t\t\t\tadd: true\n\t\t\t} ) );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null, !!value );\n\n\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\tif ( value ) {\n\t\t\tthis._removeClass( this.hoverable, null, \"ui-state-hover\" );\n\t\t\tthis._removeClass( this.focusable, null, \"ui-state-focus\" );\n\t\t}\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions( { disabled: false } );\n\t},\n\n\tdisable: function() {\n\t\treturn this._setOptions( { disabled: true } );\n\t},\n\n\t_classes: function( options ) {\n\t\tvar full = [];\n\t\tvar that = this;\n\n\t\toptions = $.extend( {\n\t\t\telement: this.element,\n\t\t\tclasses: this.options.classes || {}\n\t\t}, options );\n\n\t\tfunction processClassString( classes, checkOption ) {\n\t\t\tvar current, i;\n\t\t\tfor ( i = 0; i < classes.length; i++ ) {\n\t\t\t\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\n\t\t\t\tif ( options.add ) {\n\t\t\t\t\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = $( current.not( options.element ).get() );\n\t\t\t\t}\n\t\t\t\tthat.classesElementLookup[ classes[ i ] ] = current;\n\t\t\t\tfull.push( classes[ i ] );\n\t\t\t\tif ( checkOption && options.classes[ classes[ i ] ] ) {\n\t\t\t\t\tfull.push( options.classes[ classes[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._on( options.element, {\n\t\t\t\"remove\": \"_untrackClassesElement\"\n\t\t} );\n\n\t\tif ( options.keys ) {\n\t\t\tprocessClassString( options.keys.match( /\\S+/g ) || [], true );\n\t\t}\n\t\tif ( options.extra ) {\n\t\t\tprocessClassString( options.extra.match( /\\S+/g ) || [] );\n\t\t}\n\n\t\treturn full.join( \" \" );\n\t},\n\n\t_untrackClassesElement: function( event ) {\n\t\tvar that = this;\n\t\t$.each( that.classesElementLookup, function( key, value ) {\n\t\t\tif ( $.inArray( event.target, value ) !== -1 ) {\n\t\t\t\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_removeClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, false );\n\t},\n\n\t_addClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, true );\n\t},\n\n\t_toggleClass: function( element, keys, extra, add ) {\n\t\tadd = ( typeof add === \"boolean\" ) ? add : extra;\n\t\tvar shift = ( typeof element === \"string\" || element === null ),\n\t\t\toptions = {\n\t\t\t\textra: shift ? keys : extra,\n\t\t\t\tkeys: shift ? element : keys,\n\t\t\t\telement: shift ? this.element : element,\n\t\t\t\tadd: add\n\t\t\t};\n\t\toptions.element.toggleClass( this._classes( options ), add );\n\t\treturn this;\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement;\n\t\tvar instance = this;\n\n\t\t// No suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// No element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\n\t\t\t\t// Allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// Copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ );\n\t\t\tvar eventName = match[ 1 ] + instance.eventNamespace;\n\t\t\tvar selector = match[ 2 ];\n\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.on( eventName, selector, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.on( eventName, handlerProxy );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = ( eventName || \"\" ).split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.off( eventName ).off( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig;\n\t\tvar callback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\n\t\t// The original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// Copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\n\t\tvar hasOptions;\n\t\tvar effectName = !options ?\n\t\t\tmethod :\n\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\tdefaultEffect :\n\t\t\t\toptions.effect || defaultEffect;\n\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue( function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t} );\n\t\t}\n\t};\n} );\n\nreturn $.widget;\n\n} ) );\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS93aWRnZXQuanM/NDliZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMi4xXG4gKiBodHRwOi8vanF1ZXJ5dWkuY29tXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqL1xuXG4vLz4+bGFiZWw6IFdpZGdldFxuLy8+Pmdyb3VwOiBDb3JlXG4vLz4+ZGVzY3JpcHRpb246IFByb3ZpZGVzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgc3RhdGVmdWwgd2lkZ2V0cyB3aXRoIGEgY29tbW9uIEFQSS5cbi8vPj5kb2NzOiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9qUXVlcnkud2lkZ2V0L1xuLy8+PmRlbW9zOiBodHRwOi8vanF1ZXJ5dWkuY29tL3dpZGdldC9cblxuKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiwgXCIuL3ZlcnNpb25cIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSggZnVuY3Rpb24oICQgKSB7XG5cbnZhciB3aWRnZXRVdWlkID0gMDtcbnZhciB3aWRnZXRTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuJC5jbGVhbkRhdGEgPSAoIGZ1bmN0aW9uKCBvcmlnICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBldmVudHMsIGVsZW0sIGk7XG5cdFx0Zm9yICggaSA9IDA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdC8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lXG5cdFx0XHRcdGV2ZW50cyA9ICQuX2RhdGEoIGVsZW0sIFwiZXZlbnRzXCIgKTtcblx0XHRcdFx0aWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHtcblx0XHRcdFx0XHQkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoIFwicmVtb3ZlXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIdHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0fVxuXHRcdG9yaWcoIGVsZW1zICk7XG5cdH07XG59ICkoICQuY2xlYW5EYXRhICk7XG5cbiQud2lkZ2V0ID0gZnVuY3Rpb24oIG5hbWUsIGJhc2UsIHByb3RvdHlwZSApIHtcblx0dmFyIGV4aXN0aW5nQ29uc3RydWN0b3IsIGNvbnN0cnVjdG9yLCBiYXNlUHJvdG90eXBlO1xuXG5cdC8vIFByb3hpZWRQcm90b3R5cGUgYWxsb3dzIHRoZSBwcm92aWRlZCBwcm90b3R5cGUgdG8gcmVtYWluIHVubW9kaWZpZWRcblx0Ly8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3Nilcblx0dmFyIHByb3hpZWRQcm90b3R5cGUgPSB7fTtcblxuXHR2YXIgbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMCBdO1xuXHRuYW1lID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMSBdO1xuXHR2YXIgZnVsbE5hbWUgPSBuYW1lc3BhY2UgKyBcIi1cIiArIG5hbWU7XG5cblx0aWYgKCAhcHJvdG90eXBlICkge1xuXHRcdHByb3RvdHlwZSA9IGJhc2U7XG5cdFx0YmFzZSA9ICQuV2lkZ2V0O1xuXHR9XG5cblx0aWYgKCAkLmlzQXJyYXkoIHByb3RvdHlwZSApICkge1xuXHRcdHByb3RvdHlwZSA9ICQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIHt9IF0uY29uY2F0KCBwcm90b3R5cGUgKSApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW5cblx0JC5leHByWyBcIjpcIiBdWyBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpIF0gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gISEkLmRhdGEoIGVsZW0sIGZ1bGxOYW1lICk7XG5cdH07XG5cblx0JFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTtcblx0ZXhpc3RpbmdDb25zdHJ1Y3RvciA9ICRbIG5hbWVzcGFjZSBdWyBuYW1lIF07XG5cdGNvbnN0cnVjdG9yID0gJFsgbmFtZXNwYWNlIF1bIG5hbWUgXSA9IGZ1bmN0aW9uKCBvcHRpb25zLCBlbGVtZW50ICkge1xuXG5cdFx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IFwibmV3XCIga2V5d29yZFxuXHRcdGlmICggIXRoaXMuX2NyZWF0ZVdpZGdldCApIHtcblx0XHRcdHJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGZvciBzaW1wbGUgaW5oZXJpdGFuY2Vcblx0XHQvLyBtdXN0IHVzZSBcIm5ld1wiIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncylcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLl9jcmVhdGVXaWRnZXQoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cdH07XG5cblx0Ly8gRXh0ZW5kIHdpdGggdGhlIGV4aXN0aW5nIGNvbnN0cnVjdG9yIHRvIGNhcnJ5IG92ZXIgYW55IHN0YXRpYyBwcm9wZXJ0aWVzXG5cdCQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3Rvciwge1xuXHRcdHZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLFxuXG5cdFx0Ly8gQ29weSB0aGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBwcm90b3R5cGUgaW4gY2FzZSB3ZSBuZWVkIHRvXG5cdFx0Ly8gcmVkZWZpbmUgdGhlIHdpZGdldCBsYXRlclxuXHRcdF9wcm90bzogJC5leHRlbmQoIHt9LCBwcm90b3R5cGUgKSxcblxuXHRcdC8vIFRyYWNrIHdpZGdldHMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyB3aWRnZXQgaW4gY2FzZSB0aGlzIHdpZGdldCBpc1xuXHRcdC8vIHJlZGVmaW5lZCBhZnRlciBhIHdpZGdldCBpbmhlcml0cyBmcm9tIGl0XG5cdFx0X2NoaWxkQ29uc3RydWN0b3JzOiBbXVxuXHR9ICk7XG5cblx0YmFzZVByb3RvdHlwZSA9IG5ldyBiYXNlKCk7XG5cblx0Ly8gV2UgbmVlZCB0byBtYWtlIHRoZSBvcHRpb25zIGhhc2ggYSBwcm9wZXJ0eSBkaXJlY3RseSBvbiB0aGUgbmV3IGluc3RhbmNlXG5cdC8vIG90aGVyd2lzZSB3ZSdsbCBtb2RpZnkgdGhlIG9wdGlvbnMgaGFzaCBvbiB0aGUgcHJvdG90eXBlIHRoYXQgd2UncmVcblx0Ly8gaW5oZXJpdGluZyBmcm9tXG5cdGJhc2VQcm90b3R5cGUub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sIGJhc2VQcm90b3R5cGUub3B0aW9ucyApO1xuXHQkLmVhY2goIHByb3RvdHlwZSwgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdGlmICggISQuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHByb3hpZWRQcm90b3R5cGVbIHByb3AgXSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZnVuY3Rpb24gX3N1cGVyKCkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIF9zdXBlckFwcGx5KCBhcmdzICkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBfX3N1cGVyID0gdGhpcy5fc3VwZXI7XG5cdFx0XHRcdHZhciBfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5O1xuXHRcdFx0XHR2YXIgcmV0dXJuVmFsdWU7XG5cblx0XHRcdFx0dGhpcy5fc3VwZXIgPSBfc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfc3VwZXJBcHBseTtcblxuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHZhbHVlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHR0aGlzLl9zdXBlciA9IF9fc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7XG5cblx0XHRcdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHRcdFx0fTtcblx0XHR9ICkoKTtcblx0fSApO1xuXHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSAkLndpZGdldC5leHRlbmQoIGJhc2VQcm90b3R5cGUsIHtcblxuXHRcdC8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeFxuXHRcdC8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydFxuXHRcdC8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWRcblx0XHR3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/ICggYmFzZVByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeCB8fCBuYW1lICkgOiBuYW1lXG5cdH0sIHByb3hpZWRQcm90b3R5cGUsIHtcblx0XHRjb25zdHJ1Y3RvcjogY29uc3RydWN0b3IsXG5cdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2UsXG5cdFx0d2lkZ2V0TmFtZTogbmFtZSxcblx0XHR3aWRnZXRGdWxsTmFtZTogZnVsbE5hbWVcblx0fSApO1xuXG5cdC8vIElmIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lkZ2V0cyB0aGF0XG5cdC8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb21cblx0Ly8gdGhlIG5ldyB2ZXJzaW9uIG9mIHRoaXMgd2lkZ2V0LiBXZSdyZSBlc3NlbnRpYWxseSB0cnlpbmcgdG8gcmVwbGFjZSBvbmVcblx0Ly8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi5cblx0aWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkge1xuXHRcdCQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHtcblx0XHRcdHZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3RvdHlwZTtcblxuXHRcdFx0Ly8gUmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXNcblx0XHRcdC8vIG9yaWdpbmFsbHkgdXNlZCwgYnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2Vcblx0XHRcdCQud2lkZ2V0KCBjaGlsZFByb3RvdHlwZS5uYW1lc3BhY2UgKyBcIi5cIiArIGNoaWxkUHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLFxuXHRcdFx0XHRjaGlsZC5fcHJvdG8gKTtcblx0XHR9ICk7XG5cblx0XHQvLyBSZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQgY29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvclxuXHRcdC8vIHNvIHRoZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZFxuXHRcdGRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9ycztcblx0fSBlbHNlIHtcblx0XHRiYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApO1xuXHR9XG5cblx0JC53aWRnZXQuYnJpZGdlKCBuYW1lLCBjb25zdHJ1Y3RvciApO1xuXG5cdHJldHVybiBjb25zdHJ1Y3Rvcjtcbn07XG5cbiQud2lkZ2V0LmV4dGVuZCA9IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdHZhciBpbnB1dCA9IHdpZGdldFNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApO1xuXHR2YXIgaW5wdXRJbmRleCA9IDA7XG5cdHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0dmFyIGtleTtcblx0dmFyIHZhbHVlO1xuXG5cdGZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7XG5cdFx0Zm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7XG5cdFx0XHR2YWx1ZSA9IGlucHV0WyBpbnB1dEluZGV4IF1bIGtleSBdO1xuXHRcdFx0aWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIENsb25lIG9iamVjdHNcblx0XHRcdFx0aWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID9cblx0XHRcdFx0XHRcdCQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0c1xuXHRcdFx0XHRcdFx0JC53aWRnZXQuZXh0ZW5kKCB7fSwgdmFsdWUgKTtcblxuXHRcdFx0XHQvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0YXJnZXRbIGtleSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7XG5cdHZhciBmdWxsTmFtZSA9IG9iamVjdC5wcm90b3R5cGUud2lkZ2V0RnVsbE5hbWUgfHwgbmFtZTtcblx0JC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiO1xuXHRcdHZhciBhcmdzID0gd2lkZ2V0U2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICk7XG5cdFx0dmFyIHJldHVyblZhbHVlID0gdGhpcztcblxuXHRcdGlmICggaXNNZXRob2RDYWxsICkge1xuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGFuIGVtcHR5IGNvbGxlY3Rpb24sIHdlIG5lZWQgdG8gaGF2ZSB0aGUgaW5zdGFuY2UgbWV0aG9kXG5cdFx0XHQvLyByZXR1cm4gdW5kZWZpbmVkIGluc3RlYWQgb2YgdGhlIGpRdWVyeSBpbnN0YW5jZVxuXHRcdFx0aWYgKCAhdGhpcy5sZW5ndGggJiYgb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdHZhciBpbnN0YW5jZSA9ICQuZGF0YSggdGhpcywgZnVsbE5hbWUgKTtcblxuXHRcdFx0XHRcdGlmICggb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBpbnN0YW5jZTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICFpbnN0YW5jZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiAkLmVycm9yKCBcImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gXCIgKyBuYW1lICtcblx0XHRcdFx0XHRcdFx0XCIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IFwiICtcblx0XHRcdFx0XHRcdFx0XCJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJ1wiICsgb3B0aW9ucyArIFwiJ1wiICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhJC5pc0Z1bmN0aW9uKCBpbnN0YW5jZVsgb3B0aW9ucyBdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gXCJfXCIgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5lcnJvciggXCJubyBzdWNoIG1ldGhvZCAnXCIgKyBvcHRpb25zICsgXCInIGZvciBcIiArIG5hbWUgK1xuXHRcdFx0XHRcdFx0XHRcIiB3aWRnZXQgaW5zdGFuY2VcIiApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1ldGhvZFZhbHVlID0gaW5zdGFuY2VbIG9wdGlvbnMgXS5hcHBseSggaW5zdGFuY2UsIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggbWV0aG9kVmFsdWUgIT09IGluc3RhbmNlICYmIG1ldGhvZFZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IG1ldGhvZFZhbHVlICYmIG1ldGhvZFZhbHVlLmpxdWVyeSA/XG5cdFx0XHRcdFx0XHRcdHJldHVyblZhbHVlLnB1c2hTdGFjayggbWV0aG9kVmFsdWUuZ2V0KCkgKSA6XG5cdFx0XHRcdFx0XHRcdG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEFsbG93IG11bHRpcGxlIGhhc2hlcyB0byBiZSBwYXNzZWQgb24gaW5pdFxuXHRcdFx0aWYgKCBhcmdzLmxlbmd0aCApIHtcblx0XHRcdFx0b3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZC5hcHBseSggbnVsbCwgWyBvcHRpb25zIF0uY29uY2F0KCBhcmdzICkgKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApO1xuXHRcdFx0XHRpZiAoIGluc3RhbmNlICkge1xuXHRcdFx0XHRcdGluc3RhbmNlLm9wdGlvbiggb3B0aW9ucyB8fCB7fSApO1xuXHRcdFx0XHRcdGlmICggaW5zdGFuY2UuX2luaXQgKSB7XG5cdFx0XHRcdFx0XHRpbnN0YW5jZS5faW5pdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lLCBuZXcgb2JqZWN0KCBvcHRpb25zLCB0aGlzICkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0fTtcbn07XG5cbiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTtcbiQuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycyA9IFtdO1xuXG4kLldpZGdldC5wcm90b3R5cGUgPSB7XG5cdHdpZGdldE5hbWU6IFwid2lkZ2V0XCIsXG5cdHdpZGdldEV2ZW50UHJlZml4OiBcIlwiLFxuXHRkZWZhdWx0RWxlbWVudDogXCI8ZGl2PlwiLFxuXG5cdG9wdGlvbnM6IHtcblx0XHRjbGFzc2VzOiB7fSxcblx0XHRkaXNhYmxlZDogZmFsc2UsXG5cblx0XHQvLyBDYWxsYmFja3Ncblx0XHRjcmVhdGU6IG51bGxcblx0fSxcblxuXHRfY3JlYXRlV2lkZ2V0OiBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHtcblx0XHRlbGVtZW50ID0gJCggZWxlbWVudCB8fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdO1xuXHRcdHRoaXMuZWxlbWVudCA9ICQoIGVsZW1lbnQgKTtcblx0XHR0aGlzLnV1aWQgPSB3aWRnZXRVdWlkKys7XG5cdFx0dGhpcy5ldmVudE5hbWVzcGFjZSA9IFwiLlwiICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkO1xuXG5cdFx0dGhpcy5iaW5kaW5ncyA9ICQoKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoKTtcblx0XHR0aGlzLmZvY3VzYWJsZSA9ICQoKTtcblx0XHR0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwID0ge307XG5cblx0XHRpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7XG5cdFx0XHQkLmRhdGEoIGVsZW1lbnQsIHRoaXMud2lkZ2V0RnVsbE5hbWUsIHRoaXMgKTtcblx0XHRcdHRoaXMuX29uKCB0cnVlLCB0aGlzLmVsZW1lbnQsIHtcblx0XHRcdFx0cmVtb3ZlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdFx0aWYgKCBldmVudC50YXJnZXQgPT09IGVsZW1lbnQgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHRcdHRoaXMuZG9jdW1lbnQgPSAkKCBlbGVtZW50LnN0eWxlID9cblxuXHRcdFx0XHQvLyBFbGVtZW50IHdpdGhpbiB0aGUgZG9jdW1lbnRcblx0XHRcdFx0ZWxlbWVudC5vd25lckRvY3VtZW50IDpcblxuXHRcdFx0XHQvLyBFbGVtZW50IGlzIHdpbmRvdyBvciBkb2N1bWVudFxuXHRcdFx0XHRlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQgKTtcblx0XHRcdHRoaXMud2luZG93ID0gJCggdGhpcy5kb2N1bWVudFsgMCBdLmRlZmF1bHRWaWV3IHx8IHRoaXMuZG9jdW1lbnRbIDAgXS5wYXJlbnRXaW5kb3cgKTtcblx0XHR9XG5cblx0XHR0aGlzLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LFxuXHRcdFx0dGhpcy5vcHRpb25zLFxuXHRcdFx0dGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLFxuXHRcdFx0b3B0aW9ucyApO1xuXG5cdFx0dGhpcy5fY3JlYXRlKCk7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHtcblx0XHRcdHRoaXMuX3NldE9wdGlvbkRpc2FibGVkKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKTtcblx0XHR9XG5cblx0XHR0aGlzLl90cmlnZ2VyKCBcImNyZWF0ZVwiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApO1xuXHRcdHRoaXMuX2luaXQoKTtcblx0fSxcblxuXHRfZ2V0Q3JlYXRlT3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9LFxuXG5cdF9nZXRDcmVhdGVFdmVudERhdGE6ICQubm9vcCxcblxuXHRfY3JlYXRlOiAkLm5vb3AsXG5cblx0X2luaXQ6ICQubm9vcCxcblxuXHRkZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cblx0XHR0aGlzLl9kZXN0cm95KCk7XG5cdFx0JC5lYWNoKCB0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdHRoYXQuX3JlbW92ZUNsYXNzKCB2YWx1ZSwga2V5ICk7XG5cdFx0fSApO1xuXG5cdFx0Ly8gV2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMFxuXHRcdC8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpXG5cdFx0dGhpcy5lbGVtZW50XG5cdFx0XHQub2ZmKCB0aGlzLmV2ZW50TmFtZXNwYWNlIClcblx0XHRcdC5yZW1vdmVEYXRhKCB0aGlzLndpZGdldEZ1bGxOYW1lICk7XG5cdFx0dGhpcy53aWRnZXQoKVxuXHRcdFx0Lm9mZiggdGhpcy5ldmVudE5hbWVzcGFjZSApXG5cdFx0XHQucmVtb3ZlQXR0ciggXCJhcmlhLWRpc2FibGVkXCIgKTtcblxuXHRcdC8vIENsZWFuIHVwIGV2ZW50cyBhbmQgc3RhdGVzXG5cdFx0dGhpcy5iaW5kaW5ncy5vZmYoIHRoaXMuZXZlbnROYW1lc3BhY2UgKTtcblx0fSxcblxuXHRfZGVzdHJveTogJC5ub29wLFxuXG5cdHdpZGdldDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudDtcblx0fSxcblxuXHRvcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBvcHRpb25zID0ga2V5O1xuXHRcdHZhciBwYXJ0cztcblx0XHR2YXIgY3VyT3B0aW9uO1xuXHRcdHZhciBpO1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHQvLyBEb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2hcblx0XHRcdHJldHVybiAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vIEhhbmRsZSBuZXN0ZWQga2V5cywgZS5nLiwgXCJmb28uYmFyXCIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9XG5cdFx0XHRvcHRpb25zID0ge307XG5cdFx0XHRwYXJ0cyA9IGtleS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdGtleSA9IHBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRpZiAoIHBhcnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y3VyT3B0aW9uID0gb3B0aW9uc1sga2V5IF0gPSAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnNbIGtleSBdICk7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrICkge1xuXHRcdFx0XHRcdGN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307XG5cdFx0XHRcdFx0Y3VyT3B0aW9uID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07XG5cdFx0XHRcdH1cblx0XHRcdFx0a2V5ID0gcGFydHMucG9wKCk7XG5cdFx0XHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdFx0XHRyZXR1cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9wdGlvblsga2V5IF07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3VyT3B0aW9uWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnNbIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5vcHRpb25zWyBrZXkgXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvcHRpb25zWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuX3NldE9wdGlvbnMoIG9wdGlvbnMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdF9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIga2V5O1xuXG5cdFx0Zm9yICgga2V5IGluIG9wdGlvbnMgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb24oIGtleSwgb3B0aW9uc1sga2V5IF0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRpZiAoIGtleSA9PT0gXCJjbGFzc2VzXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25DbGFzc2VzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdHRoaXMub3B0aW9uc1sga2V5IF0gPSB2YWx1ZTtcblxuXHRcdGlmICgga2V5ID09PSBcImRpc2FibGVkXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25EaXNhYmxlZCggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uQ2xhc3NlczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc0tleSwgZWxlbWVudHMsIGN1cnJlbnRFbGVtZW50cztcblxuXHRcdGZvciAoIGNsYXNzS2V5IGluIHZhbHVlICkge1xuXHRcdFx0Y3VycmVudEVsZW1lbnRzID0gdGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cFsgY2xhc3NLZXkgXTtcblx0XHRcdGlmICggdmFsdWVbIGNsYXNzS2V5IF0gPT09IHRoaXMub3B0aW9ucy5jbGFzc2VzWyBjbGFzc0tleSBdIHx8XG5cdFx0XHRcdFx0IWN1cnJlbnRFbGVtZW50cyB8fFxuXHRcdFx0XHRcdCFjdXJyZW50RWxlbWVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UgYXJlIGRvaW5nIHRoaXMgdG8gY3JlYXRlIGEgbmV3IGpRdWVyeSBvYmplY3QgYmVjYXVzZSB0aGUgX3JlbW92ZUNsYXNzKCkgY2FsbFxuXHRcdFx0Ly8gb24gdGhlIG5leHQgbGluZSBpcyBnb2luZyB0byBkZXN0cm95IHRoZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZWxlbWVudHMgYmVpbmdcblx0XHRcdC8vIHRyYWNrZWQuIFdlIG5lZWQgdG8gc2F2ZSBhIGNvcHkgb2YgdGhpcyBjb2xsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGFkZCB0aGUgbmV3IGNsYXNzZXNcblx0XHRcdC8vIGJlbG93LlxuXHRcdFx0ZWxlbWVudHMgPSAkKCBjdXJyZW50RWxlbWVudHMuZ2V0KCkgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCBjdXJyZW50RWxlbWVudHMsIGNsYXNzS2V5ICk7XG5cblx0XHRcdC8vIFdlIGRvbid0IHVzZSBfYWRkQ2xhc3MoKSBoZXJlLCBiZWNhdXNlIHRoYXQgdXNlcyB0aGlzLm9wdGlvbnMuY2xhc3Nlc1xuXHRcdFx0Ly8gZm9yIGdlbmVyYXRpbmcgdGhlIHN0cmluZyBvZiBjbGFzc2VzLiBXZSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgcGFzc2VkIGluIGZyb21cblx0XHRcdC8vIF9zZXRPcHRpb24oKSwgdGhpcyBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjbGFzc2VzIG9wdGlvbiB3aGljaCB3YXMgcGFzc2VkIHRvXG5cdFx0XHQvLyBfc2V0T3B0aW9uKCkuIFdlIHBhc3MgdGhpcyB2YWx1ZSBkaXJlY3RseSB0byBfY2xhc3NlcygpLlxuXHRcdFx0ZWxlbWVudHMuYWRkQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIHtcblx0XHRcdFx0ZWxlbWVudDogZWxlbWVudHMsXG5cdFx0XHRcdGtleXM6IGNsYXNzS2V5LFxuXHRcdFx0XHRjbGFzc2VzOiB2YWx1ZSxcblx0XHRcdFx0YWRkOiB0cnVlXG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cdH0sXG5cblx0X3NldE9wdGlvbkRpc2FibGVkOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dGhpcy5fdG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0KCksIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyBcIi1kaXNhYmxlZFwiLCBudWxsLCAhIXZhbHVlICk7XG5cblx0XHQvLyBJZiB0aGUgd2lkZ2V0IGlzIGJlY29taW5nIGRpc2FibGVkLCB0aGVuIG5vdGhpbmcgaXMgaW50ZXJhY3RpdmVcblx0XHRpZiAoIHZhbHVlICkge1xuXHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoIHRoaXMuaG92ZXJhYmxlLCBudWxsLCBcInVpLXN0YXRlLWhvdmVyXCIgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCB0aGlzLmZvY3VzYWJsZSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoIHsgZGlzYWJsZWQ6IGZhbHNlIH0gKTtcblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyggeyBkaXNhYmxlZDogdHJ1ZSB9ICk7XG5cdH0sXG5cblx0X2NsYXNzZXM6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBmdWxsID0gW107XG5cdFx0dmFyIHRoYXQgPSB0aGlzO1xuXG5cdFx0b3B0aW9ucyA9ICQuZXh0ZW5kKCB7XG5cdFx0XHRlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG5cdFx0XHRjbGFzc2VzOiB0aGlzLm9wdGlvbnMuY2xhc3NlcyB8fCB7fVxuXHRcdH0sIG9wdGlvbnMgKTtcblxuXHRcdGZ1bmN0aW9uIHByb2Nlc3NDbGFzc1N0cmluZyggY2xhc3NlcywgY2hlY2tPcHRpb24gKSB7XG5cdFx0XHR2YXIgY3VycmVudCwgaTtcblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0Y3VycmVudCA9IHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdIHx8ICQoKTtcblx0XHRcdFx0aWYgKCBvcHRpb25zLmFkZCApIHtcblx0XHRcdFx0XHRjdXJyZW50ID0gJCggJC51bmlxdWUoIGN1cnJlbnQuZ2V0KCkuY29uY2F0KCBvcHRpb25zLmVsZW1lbnQuZ2V0KCkgKSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudCA9ICQoIGN1cnJlbnQubm90KCBvcHRpb25zLmVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdID0gY3VycmVudDtcblx0XHRcdFx0ZnVsbC5wdXNoKCBjbGFzc2VzWyBpIF0gKTtcblx0XHRcdFx0aWYgKCBjaGVja09wdGlvbiAmJiBvcHRpb25zLmNsYXNzZXNbIGNsYXNzZXNbIGkgXSBdICkge1xuXHRcdFx0XHRcdGZ1bGwucHVzaCggb3B0aW9ucy5jbGFzc2VzWyBjbGFzc2VzWyBpIF0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fb24oIG9wdGlvbnMuZWxlbWVudCwge1xuXHRcdFx0XCJyZW1vdmVcIjogXCJfdW50cmFja0NsYXNzZXNFbGVtZW50XCJcblx0XHR9ICk7XG5cblx0XHRpZiAoIG9wdGlvbnMua2V5cyApIHtcblx0XHRcdHByb2Nlc3NDbGFzc1N0cmluZyggb3B0aW9ucy5rZXlzLm1hdGNoKCAvXFxTKy9nICkgfHwgW10sIHRydWUgKTtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmV4dHJhICkge1xuXHRcdFx0cHJvY2Vzc0NsYXNzU3RyaW5nKCBvcHRpb25zLmV4dHJhLm1hdGNoKCAvXFxTKy9nICkgfHwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZnVsbC5qb2luKCBcIiBcIiApO1xuXHR9LFxuXG5cdF91bnRyYWNrQ2xhc3Nlc0VsZW1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cdFx0JC5lYWNoKCB0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdGlmICggJC5pbkFycmF5KCBldmVudC50YXJnZXQsIHZhbHVlICkgIT09IC0xICkge1xuXHRcdFx0XHR0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwWyBrZXkgXSA9ICQoIHZhbHVlLm5vdCggZXZlbnQudGFyZ2V0ICkuZ2V0KCkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X3JlbW92ZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3RvZ2dsZUNsYXNzKCBlbGVtZW50LCBrZXlzLCBleHRyYSwgZmFsc2UgKTtcblx0fSxcblxuXHRfYWRkQ2xhc3M6IGZ1bmN0aW9uKCBlbGVtZW50LCBrZXlzLCBleHRyYSApIHtcblx0XHRyZXR1cm4gdGhpcy5fdG9nZ2xlQ2xhc3MoIGVsZW1lbnQsIGtleXMsIGV4dHJhLCB0cnVlICk7XG5cdH0sXG5cblx0X3RvZ2dsZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEsIGFkZCApIHtcblx0XHRhZGQgPSAoIHR5cGVvZiBhZGQgPT09IFwiYm9vbGVhblwiICkgPyBhZGQgOiBleHRyYTtcblx0XHR2YXIgc2hpZnQgPSAoIHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiIHx8IGVsZW1lbnQgPT09IG51bGwgKSxcblx0XHRcdG9wdGlvbnMgPSB7XG5cdFx0XHRcdGV4dHJhOiBzaGlmdCA/IGtleXMgOiBleHRyYSxcblx0XHRcdFx0a2V5czogc2hpZnQgPyBlbGVtZW50IDoga2V5cyxcblx0XHRcdFx0ZWxlbWVudDogc2hpZnQgPyB0aGlzLmVsZW1lbnQgOiBlbGVtZW50LFxuXHRcdFx0XHRhZGQ6IGFkZFxuXHRcdFx0fTtcblx0XHRvcHRpb25zLmVsZW1lbnQudG9nZ2xlQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIG9wdGlvbnMgKSwgYWRkICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0X29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgZGVsZWdhdGVFbGVtZW50O1xuXHRcdHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cblx0XHQvLyBObyBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgZmxhZywgc2h1ZmZsZSBhcmd1bWVudHNcblx0XHRpZiAoIHR5cGVvZiBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgIT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0aGFuZGxlcnMgPSBlbGVtZW50O1xuXHRcdFx0ZWxlbWVudCA9IHN1cHByZXNzRGlzYWJsZWRDaGVjaztcblx0XHRcdHN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIE5vIGVsZW1lbnQgYXJndW1lbnQsIHNodWZmbGUgYW5kIHVzZSB0aGlzLmVsZW1lbnRcblx0XHRpZiAoICFoYW5kbGVycyApIHtcblx0XHRcdGhhbmRsZXJzID0gZWxlbWVudDtcblx0XHRcdGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XG5cdFx0XHRkZWxlZ2F0ZUVsZW1lbnQgPSB0aGlzLndpZGdldCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50ID0gZGVsZWdhdGVFbGVtZW50ID0gJCggZWxlbWVudCApO1xuXHRcdFx0dGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7XG5cdFx0fVxuXG5cdFx0JC5lYWNoKCBoYW5kbGVycywgZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVyICkge1xuXHRcdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXG5cdFx0XHRcdC8vIEFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZ1xuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGFzIGFuIGFycmF5IGluc3RlYWQgb2YgYm9vbGVhblxuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGNsYXNzIGFzIG1ldGhvZCBmb3IgZGlzYWJsaW5nIGluZGl2aWR1YWwgcGFydHNcblx0XHRcdFx0aWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmXG5cdFx0XHRcdFx0XHQoIGluc3RhbmNlLm9wdGlvbnMuZGlzYWJsZWQgPT09IHRydWUgfHxcblx0XHRcdFx0XHRcdCQoIHRoaXMgKS5oYXNDbGFzcyggXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiICkgKSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdFx0LmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3Jrc1xuXHRcdFx0aWYgKCB0eXBlb2YgaGFuZGxlciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0aGFuZGxlclByb3h5Lmd1aWQgPSBoYW5kbGVyLmd1aWQgPVxuXHRcdFx0XHRcdGhhbmRsZXIuZ3VpZCB8fCBoYW5kbGVyUHJveHkuZ3VpZCB8fCAkLmd1aWQrKztcblx0XHRcdH1cblxuXHRcdFx0dmFyIG1hdGNoID0gZXZlbnQubWF0Y2goIC9eKFtcXHc6LV0qKVxccyooLiopJC8gKTtcblx0XHRcdHZhciBldmVudE5hbWUgPSBtYXRjaFsgMSBdICsgaW5zdGFuY2UuZXZlbnROYW1lc3BhY2U7XG5cdFx0XHR2YXIgc2VsZWN0b3IgPSBtYXRjaFsgMiBdO1xuXG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRkZWxlZ2F0ZUVsZW1lbnQub24oIGV2ZW50TmFtZSwgc2VsZWN0b3IsIGhhbmRsZXJQcm94eSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudC5vbiggZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X29mZjogZnVuY3Rpb24oIGVsZW1lbnQsIGV2ZW50TmFtZSApIHtcblx0XHRldmVudE5hbWUgPSAoIGV2ZW50TmFtZSB8fCBcIlwiICkuc3BsaXQoIFwiIFwiICkuam9pbiggdGhpcy5ldmVudE5hbWVzcGFjZSArIFwiIFwiICkgK1xuXHRcdFx0dGhpcy5ldmVudE5hbWVzcGFjZTtcblx0XHRlbGVtZW50Lm9mZiggZXZlbnROYW1lICkub2ZmKCBldmVudE5hbWUgKTtcblxuXHRcdC8vIENsZWFyIHRoZSBzdGFjayB0byBhdm9pZCBtZW1vcnkgbGVha3MgKCMxMDA1Nilcblx0XHR0aGlzLmJpbmRpbmdzID0gJCggdGhpcy5iaW5kaW5ncy5ub3QoIGVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gJCggdGhpcy5mb2N1c2FibGUubm90KCBlbGVtZW50ICkuZ2V0KCkgKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoIHRoaXMuaG92ZXJhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7XG5cdH0sXG5cblx0X2RlbGF5OiBmdW5jdGlvbiggaGFuZGxlciwgZGVsYXkgKSB7XG5cdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdC5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0XHR2YXIgaW5zdGFuY2UgPSB0aGlzO1xuXHRcdHJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTtcblx0fSxcblxuXHRfaG92ZXJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHtcblx0XHR0aGlzLmhvdmVyYWJsZSA9IHRoaXMuaG92ZXJhYmxlLmFkZCggZWxlbWVudCApO1xuXHRcdHRoaXMuX29uKCBlbGVtZW50LCB7XG5cdFx0XHRtb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHRoaXMuX2FkZENsYXNzKCAkKCBldmVudC5jdXJyZW50VGFyZ2V0ICksIG51bGwsIFwidWktc3RhdGUtaG92ZXJcIiApO1xuXHRcdFx0fSxcblx0XHRcdG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1ob3ZlclwiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF9mb2N1c2FibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGUuYWRkKCBlbGVtZW50ICk7XG5cdFx0dGhpcy5fb24oIGVsZW1lbnQsIHtcblx0XHRcdGZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9LFxuXHRcdFx0Zm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7XG5cdFx0dmFyIHByb3AsIG9yaWc7XG5cdFx0dmFyIGNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07XG5cblx0XHRkYXRhID0gZGF0YSB8fCB7fTtcblx0XHRldmVudCA9ICQuRXZlbnQoIGV2ZW50ICk7XG5cdFx0ZXZlbnQudHlwZSA9ICggdHlwZSA9PT0gdGhpcy53aWRnZXRFdmVudFByZWZpeCA/XG5cdFx0XHR0eXBlIDpcblx0XHRcdHRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTtcblxuXHRcdC8vIFRoZSBvcmlnaW5hbCBldmVudCBtYXkgY29tZSBmcm9tIGFueSBlbGVtZW50XG5cdFx0Ly8gc28gd2UgbmVlZCB0byByZXNldCB0aGUgdGFyZ2V0IG9uIHRoZSBuZXcgZXZlbnRcblx0XHRldmVudC50YXJnZXQgPSB0aGlzLmVsZW1lbnRbIDAgXTtcblxuXHRcdC8vIENvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnRcblx0XHRvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDtcblx0XHRpZiAoIG9yaWcgKSB7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGlmICggISggcHJvcCBpbiBldmVudCApICkge1xuXHRcdFx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmVsZW1lbnQudHJpZ2dlciggZXZlbnQsIGRhdGEgKTtcblx0XHRyZXR1cm4gISggJC5pc0Z1bmN0aW9uKCBjYWxsYmFjayApICYmXG5cdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcy5lbGVtZW50WyAwIF0sIFsgZXZlbnQgXS5jb25jYXQoIGRhdGEgKSApID09PSBmYWxzZSB8fFxuXHRcdFx0ZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKTtcblx0fVxufTtcblxuJC5lYWNoKCB7IHNob3c6IFwiZmFkZUluXCIsIGhpZGU6IFwiZmFkZU91dFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIGRlZmF1bHRFZmZlY3QgKSB7XG5cdCQuV2lkZ2V0LnByb3RvdHlwZVsgXCJfXCIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0dmFyIGhhc09wdGlvbnM7XG5cdFx0dmFyIGVmZmVjdE5hbWUgPSAhb3B0aW9ucyA/XG5cdFx0XHRtZXRob2QgOlxuXHRcdFx0b3B0aW9ucyA9PT0gdHJ1ZSB8fCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiA/XG5cdFx0XHRcdGRlZmF1bHRFZmZlY3QgOlxuXHRcdFx0XHRvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0O1xuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0aWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB7IGR1cmF0aW9uOiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0aGFzT3B0aW9ucyA9ICEkLmlzRW1wdHlPYmplY3QoIG9wdGlvbnMgKTtcblx0XHRvcHRpb25zLmNvbXBsZXRlID0gY2FsbGJhY2s7XG5cblx0XHRpZiAoIG9wdGlvbnMuZGVsYXkgKSB7XG5cdFx0XHRlbGVtZW50LmRlbGF5KCBvcHRpb25zLmRlbGF5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBtZXRob2QgXSggb3B0aW9ucyApO1xuXHRcdH0gZWxzZSBpZiAoIGVmZmVjdE5hbWUgIT09IG1ldGhvZCAmJiBlbGVtZW50WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBlZmZlY3ROYW1lIF0oIG9wdGlvbnMuZHVyYXRpb24sIG9wdGlvbnMuZWFzaW5nLCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50LnF1ZXVlKCBmdW5jdGlvbiggbmV4dCApIHtcblx0XHRcdFx0JCggdGhpcyApWyBtZXRob2QgXSgpO1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGVsZW1lbnRbIDAgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbnJldHVybiAkLndpZGdldDtcblxufSApICk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vanF1ZXJ5LXVpL3VpL3dpZGdldC5qc1xuLy8gbW9kdWxlIGlkID0gMjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0="); - -/***/ }, -/* 28 */ -/***/ function(module, exports) { - -eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tconfigurable: false,\r\n\t\t\tget: function() { return module.l; }\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tconfigurable: false,\r\n\t\t\tget: function() { return module.i; }\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0aWYoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGUubDsgfVxyXG5cdFx0fSk7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZS5pOyB9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); - -/***/ }, -/* 29 */ -/***/ function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * Lodash \n * Copyright JS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '4.17.4';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Error message constants. */\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n FUNC_ERROR_TEXT = 'Expected a function';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /** Used to compose bitmasks for cloning. */\n var CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n /** Used to compose bitmasks for value comparisons. */\n var COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n /** Used to compose bitmasks for function metadata. */\n var WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n /** Used as default options for `_.truncate`. */\n var DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2,\n LAZY_WHILE_FLAG = 3;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /** Used to associate wrap methods with their bit flags. */\n var wrapFlags = [\n ['ary', WRAP_ARY_FLAG],\n ['bind', WRAP_BIND_FLAG],\n ['bindKey', WRAP_BIND_KEY_FLAG],\n ['curry', WRAP_CURRY_FLAG],\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n ['flip', WRAP_FLIP_FLAG],\n ['partial', WRAP_PARTIAL_FLAG],\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n ['rearg', WRAP_REARG_FLAG]\n ];\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n domExcTag = '[object DOMException]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]',\n weakSetTag = '[object WeakSet]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to match empty string literals in compiled template source. */\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n /** Used to match HTML entities and HTML characters. */\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reUnescapedHtml = /[&<>\"']/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n /** Used to match template delimiters. */\n var reEscape = /<%-([\\s\\S]+?)%>/g,\n reEvaluate = /<%([\\s\\S]+?)%>/g,\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n /** Used to match leading and trailing whitespace. */\n var reTrim = /^\\s+|\\s+$/g,\n reTrimStart = /^\\s+/,\n reTrimEnd = /\\s+$/;\n\n /** Used to match wrap detail comments. */\n var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n /** Used to match words composed of alphanumeric characters. */\n var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /** Used to detect bad signed hexadecimal string values. */\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n /** Used to detect binary string values. */\n var reIsBinary = /^0b[01]+$/i;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used to detect octal string values. */\n var reIsOctal = /^0o[0-7]+$/i;\n\n /** Used to detect unsigned integer values. */\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\n var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n /** Used to ensure capturing order of template delimiters. */\n var reNoMatch = /($^)/;\n\n /** Used to match unescaped characters in compiled string literals. */\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n /** Used to compose unicode character classes. */\n var rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n /** Used to compose unicode capture groups. */\n var rsApos = \"['\\u2019]\",\n rsAstral = '[' + rsAstralRange + ']',\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n /** Used to compose unicode regexes. */\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:(?:1st|2nd|3rd|(?![123])\\\\dth)\\\\b)',\n rsOrdUpper = '\\\\d*(?:(?:1ST|2ND|3RD|(?![123])\\\\dTH)\\\\b)',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n /** Used to match apostrophes. */\n var reApos = RegExp(rsApos, 'g');\n\n /**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\n var reComboMark = RegExp(rsCombo, 'g');\n\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n /** Used to match complex or compound words. */\n var reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n ].join('|'), 'g');\n\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n /** Used to detect strings that need a more robust regexp to match words. */\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n /** Used to assign default `context` object properties. */\n var contextProps = [\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n ];\n\n /** Used to make template sourceURLs easier to identify. */\n var templateCounter = -1;\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\n typedArrayTags[weakMapTag] = false;\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n cloneableTags[boolTag] = cloneableTags[dateTag] =\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\n cloneableTags[numberTag] = cloneableTags[objectTag] =\n cloneableTags[regexpTag] = cloneableTags[setTag] =\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] =\n cloneableTags[weakMapTag] = false;\n\n /** Used to map Latin Unicode letters to basic Latin letters. */\n var deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n };\n\n /** Used to map characters to HTML entities. */\n var htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n\n /** Used to map HTML entities to characters. */\n var htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n };\n\n /** Used to escape characters for inclusion in compiled string literals. */\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /** Built-in method references without a dependency on `root`. */\n var freeParseFloat = parseFloat,\n freeParseInt = parseInt;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function('return this')();\n\n /** Detect free variable `exports`. */\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n /** Detect the popular CommonJS extension `module.exports`. */\n var moduleExports = freeModule && freeModule.exports === freeExports;\n\n /** Detect free variable `process` from Node.js. */\n var freeProcess = moduleExports && freeGlobal.process;\n\n /** Used to access faster Node.js helpers. */\n var nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n }());\n\n /* Node.js helper references. */\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n nodeIsDate = nodeUtil && nodeUtil.isDate,\n nodeIsMap = nodeUtil && nodeUtil.isMap,\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n nodeIsSet = nodeUtil && nodeUtil.isSet,\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Adds the key-value `pair` to `map`.\n *\n * @private\n * @param {Object} map The map to modify.\n * @param {Array} pair The key-value pair to add.\n * @returns {Object} Returns `map`.\n */\n function addMapEntry(map, pair) {\n // Don't return `map.set` because it's not chainable in IE 11.\n map.set(pair[0], pair[1]);\n return map;\n }\n\n /**\n * Adds `value` to `set`.\n *\n * @private\n * @param {Object} set The set to modify.\n * @param {*} value The value to add.\n * @returns {Object} Returns `set`.\n */\n function addSetEntry(set, value) {\n // Don't return `set.add` because it's not chainable in IE 11.\n set.add(value);\n return set;\n }\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEachRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEachRight(array, iteratee) {\n var length = array == null ? 0 : array.length;\n\n while (length--) {\n if (iteratee(array[length], length, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\n function arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.reduceRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the last element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n var length = array == null ? 0 : array.length;\n if (initAccum && length) {\n accumulator = array[--length];\n }\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n var asciiSize = baseProperty('length');\n\n /**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function asciiToArray(string) {\n return string.split('');\n }\n\n /**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function asciiWords(string) {\n return string.match(reAsciiWord) || [];\n }\n\n /**\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n * without support for iteratee shorthands, which iterates over `collection`\n * using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n function baseFindKey(collection, predicate, eachFunc) {\n var result;\n eachFunc(collection, function(value, key, collection) {\n if (predicate(value, key, collection)) {\n result = key;\n return false;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOfWith(array, value, fromIndex, comparator) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (comparator(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.mean` and `_.meanBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the mean.\n */\n function baseMean(array, iteratee) {\n var length = array == null ? 0 : array.length;\n return length ? (baseSum(array, iteratee) / length) : NAN;\n }\n\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\n function baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.sum` and `_.sumBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function baseSum(array, iteratee) {\n var result,\n index = -1,\n length = array.length;\n\n while (++index < length) {\n var current = iteratee(array[index]);\n if (current !== undefined) {\n result = result === undefined ? current : (result + current);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\n function baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */\n function baseToPairs(object, props) {\n return arrayMap(props, function(key) {\n return [key, object[key]];\n });\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n function baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\n function charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\n function charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\n function countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n }\n\n /**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\n var deburrLetter = basePropertyOf(deburredLetters);\n\n /**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n /**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\n function hasUnicode(string) {\n return reHasUnicode.test(string);\n }\n\n /**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\n function hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n }\n\n /**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */\n function iteratorToArray(iterator) {\n var data,\n result = [];\n\n while (!(data = iterator.next()).done) {\n result.push(data.value);\n }\n return result;\n }\n\n /**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\n function mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n }\n\n /**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\n function overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n }\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n }\n\n /**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\n function setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n }\n\n /**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */\n function setToPairs(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = [value, value];\n });\n return result;\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * A specialized version of `_.lastIndexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictLastIndexOf(array, value, fromIndex) {\n var index = fromIndex + 1;\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return index;\n }\n\n /**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\n function stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n }\n\n /**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n }\n\n /**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n /**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n function unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n }\n\n /**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function unicodeToArray(string) {\n return string.match(reUnicode) || [];\n }\n\n /**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Create a new pristine `lodash` function using the `context` object.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Util\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns a new `lodash` function.\n * @example\n *\n * _.mixin({ 'foo': _.constant('foo') });\n *\n * var lodash = _.runInContext();\n * lodash.mixin({ 'bar': lodash.constant('bar') });\n *\n * _.isFunction(_.foo);\n * // => true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // Create a suped-up `defer` in Node.js.\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n */\n var runInContext = (function runInContext(context) {\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n /** Built-in constructor references. */\n var Array = context.Array,\n Date = context.Date,\n Error = context.Error,\n Function = context.Function,\n Math = context.Math,\n Object = context.Object,\n RegExp = context.RegExp,\n String = context.String,\n TypeError = context.TypeError;\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = context['__core-js_shared__'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to generate unique IDs. */\n var idCounter = 0;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to infer the `Object` constructor. */\n var objectCtorString = funcToString.call(Object);\n\n /** Used to restore the original `_` reference in `_.noConflict`. */\n var oldDash = root._;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Built-in value references. */\n var Buffer = moduleExports ? context.Buffer : undefined,\n Symbol = context.Symbol,\n Uint8Array = context.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n symIterator = Symbol ? Symbol.iterator : undefined,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n }());\n\n /** Mocked built-ins. */\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeFloor = Math.floor,\n nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeIsFinite = context.isFinite,\n nativeJoin = arrayProto.join,\n nativeKeys = overArg(Object.keys, Object),\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now,\n nativeParseInt = context.parseInt,\n nativeRandom = Math.random,\n nativeReverse = arrayProto.reverse;\n\n /* Built-in method references that are verified to be native. */\n var DataView = getNative(context, 'DataView'),\n Map = getNative(context, 'Map'),\n Promise = getNative(context, 'Promise'),\n Set = getNative(context, 'Set'),\n WeakMap = getNative(context, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap;\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to detect maps, sets, and weakmaps. */\n var dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n }());\n\n /**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\n function baseLodash() {\n // No operation performed.\n }\n\n /**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\n function LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n }\n\n /**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\n lodash.templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'escape': reEscape,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'evaluate': reEvaluate,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'interpolate': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */\n 'variable': '',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */\n 'imports': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */\n '_': lodash\n }\n };\n\n // Ensure wrappers are instances of `baseLodash`.\n lodash.prototype = baseLodash.prototype;\n lodash.prototype.constructor = lodash;\n\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n LodashWrapper.prototype.constructor = LodashWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n }\n\n /**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\n function lazyClone() {\n var result = new LazyWrapper(this.__wrapped__);\n result.__actions__ = copyArray(this.__actions__);\n result.__dir__ = this.__dir__;\n result.__filtered__ = this.__filtered__;\n result.__iteratees__ = copyArray(this.__iteratees__);\n result.__takeCount__ = this.__takeCount__;\n result.__views__ = copyArray(this.__views__);\n return result;\n }\n\n /**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\n function lazyReverse() {\n if (this.__filtered__) {\n var result = new LazyWrapper(this);\n result.__dir__ = -1;\n result.__filtered__ = true;\n } else {\n result = this.clone();\n result.__dir__ *= -1;\n }\n return result;\n }\n\n /**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\n function lazyValue() {\n var array = this.__wrapped__.value(),\n dir = this.__dir__,\n isArr = isArray(array),\n isRight = dir < 0,\n arrLength = isArr ? array.length : 0,\n view = getView(0, arrLength, this.__views__),\n start = view.start,\n end = view.end,\n length = end - start,\n index = isRight ? end : (start - 1),\n iteratees = this.__iteratees__,\n iterLength = iteratees.length,\n resIndex = 0,\n takeCount = nativeMin(length, this.__takeCount__);\n\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n return baseWrapperValue(array, this.__actions__);\n }\n var result = [];\n\n outer:\n while (length-- && resIndex < takeCount) {\n index += dir;\n\n var iterIndex = -1,\n value = array[index];\n\n while (++iterIndex < iterLength) {\n var data = iteratees[iterIndex],\n iteratee = data.iteratee,\n type = data.type,\n computed = iteratee(value);\n\n if (type == LAZY_MAP_FLAG) {\n value = computed;\n } else if (!computed) {\n if (type == LAZY_FILTER_FLAG) {\n continue outer;\n } else {\n break outer;\n }\n }\n }\n result[resIndex++] = value;\n }\n return result;\n }\n\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype['delete'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype['delete'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype['delete'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n }\n\n /**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n function stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n }\n\n /**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function stackGet(key) {\n return this.__data__.get(key);\n }\n\n /**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function stackHas(key) {\n return this.__data__.has(key);\n }\n\n /**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\n function stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n }\n\n // Add methods to `Stack`.\n Stack.prototype.clear = stackClear;\n Stack.prototype['delete'] = stackDelete;\n Stack.prototype.get = stackGet;\n Stack.prototype.has = stackHas;\n Stack.prototype.set = stackSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\n function arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.sample` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @returns {*} Returns the random element.\n */\n function arraySample(array) {\n var length = array.length;\n return length ? array[baseRandom(0, length - 1)] : undefined;\n }\n\n /**\n * A specialized version of `_.sampleSize` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function arraySampleSize(array, n) {\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n }\n\n /**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function arrayShuffle(array) {\n return shuffleSelf(copyArray(array));\n }\n\n /**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n }\n\n /**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n }\n\n /**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n }\n\n /**\n * The base implementation of `_.at` without support for individual paths.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {string[]} paths The property paths to pick.\n * @returns {Array} Returns the picked elements.\n */\n function baseAt(object, paths) {\n var index = -1,\n length = paths.length,\n result = Array(length),\n skip = object == null;\n\n while (++index < length) {\n result[index] = skip ? undefined : get(object, paths[index]);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\n function baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n return number;\n }\n\n /**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, baseClone, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n }\n\n /**\n * The base implementation of `_.conforms` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */\n function baseConforms(source) {\n var props = keys(source);\n return function(object) {\n return baseConformsTo(object, source, props);\n };\n }\n\n /**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */\n function baseConformsTo(object, source, props) {\n var length = props.length;\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (length--) {\n var key = props[length],\n predicate = source[key],\n value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEach = createBaseEach(baseForOwn);\n\n /**\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n /**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n /**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\n function baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\n function baseFill(array, value, start, end) {\n var length = array.length;\n\n start = toInteger(start);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : toInteger(end);\n if (end < 0) {\n end += length;\n }\n end = start > end ? 0 : toLength(end);\n while (start < end) {\n array[start++] = value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = createBaseFor();\n\n /**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseForRight = createBaseFor(true);\n\n /**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwnRight(object, iteratee) {\n return object && baseForRight(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */\n function baseFunctions(object, props) {\n return arrayFilter(props, function(key) {\n return isFunction(object[key]);\n });\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\n function baseGt(value, other) {\n return value > other;\n }\n\n /**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n }\n\n /**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHasIn(object, key) {\n return object != null && key in Object(object);\n }\n\n /**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\n function baseInRange(number, start, end) {\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseInverter(object, setter, iteratee, accumulator) {\n baseForOwn(object, function(value, key, object) {\n setter(accumulator, iteratee(value), key, object);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function baseInvoke(object, path, args) {\n path = castPath(path, object);\n object = parent(object, path);\n var func = object == null ? object : object[toKey(last(path))];\n return func == null ? undefined : apply(func, object, args);\n }\n\n /**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\n function baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n }\n\n /**\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n */\n function baseIsArrayBuffer(value) {\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n }\n\n /**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\n function baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n }\n\n /**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n }\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n }\n\n /**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\n function baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n }\n\n /**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\n function baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n }\n\n /**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\n function baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n }\n\n /**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n function baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n }\n\n /**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\n function baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n }\n\n /**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\n function baseLt(value, other) {\n return value < other;\n }\n\n /**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n }\n\n /**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n }\n\n /**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n if (isObject(srcValue)) {\n stack || (stack = new Stack);\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(object[key], srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n }\n\n /**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = object[key],\n srcValue = source[key],\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n }\n\n /**\n * The base implementation of `_.nth` which doesn't coerce arguments.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {number} n The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n */\n function baseNth(array, n) {\n var length = array.length;\n if (!length) {\n return;\n }\n n += n < 0 ? length : 0;\n return isIndex(n, length) ? array[n] : undefined;\n }\n\n /**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\n function baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n }\n\n /**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\n function basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n }\n\n /**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\n function basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n }\n\n /**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\n function basePullAll(array, values, iteratee, comparator) {\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n index = -1,\n length = values.length,\n seen = array;\n\n if (array === values) {\n values = copyArray(values);\n }\n if (iteratee) {\n seen = arrayMap(array, baseUnary(iteratee));\n }\n while (++index < length) {\n var fromIndex = 0,\n value = values[index],\n computed = iteratee ? iteratee(value) : value;\n\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n if (seen !== array) {\n splice.call(seen, fromIndex, 1);\n }\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\n function basePullAt(array, indexes) {\n var length = array ? indexes.length : 0,\n lastIndex = length - 1;\n\n while (length--) {\n var index = indexes[length];\n if (length == lastIndex || index !== previous) {\n var previous = index;\n if (isIndex(index)) {\n splice.call(array, index, 1);\n } else {\n baseUnset(array, index);\n }\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\n function baseRandom(lower, upper) {\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n }\n\n /**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\n function baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n }\n\n /**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\n function baseRepeat(string, n) {\n var result = '';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n }\n\n /**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n }\n\n /**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */\n function baseSample(collection) {\n return arraySample(values(collection));\n }\n\n /**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function baseSampleSize(collection, n) {\n var array = values(collection);\n return shuffleSelf(array, baseClamp(n, 0, array.length));\n }\n\n /**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n }\n\n /**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n };\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n };\n\n /**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function baseShuffle(collection) {\n return shuffleSelf(values(collection));\n }\n\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n }\n\n /**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndex(array, value, retHighest) {\n var low = 0,\n high = array == null ? low : array.length;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if (computed !== null && !isSymbol(computed) &&\n (retHighest ? (computed <= value) : (computed < value))) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return baseSortedIndexBy(array, value, identity, retHighest);\n }\n\n /**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\n value = iteratee(value);\n\n var low = 0,\n high = array == null ? 0 : array.length,\n valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n /**\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseSortedUniq(array, iteratee) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n if (!index || !eq(computed, seen)) {\n var seen = computed;\n result[resIndex++] = value === 0 ? 0 : value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toNumber` which doesn't ensure correct\n * conversions of binary, hexadecimal, or octal string values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n */\n function baseToNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n return +value;\n }\n\n /**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\n function baseUnset(object, path) {\n path = castPath(path, object);\n object = parent(object, path);\n return object == null || delete object[toKey(last(path))];\n }\n\n /**\n * The base implementation of `_.update`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to update.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseUpdate(object, path, updater, customizer) {\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\n }\n\n /**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) &&\n predicate(array[index], index, array)) {}\n\n return isDrop\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n }\n\n /**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\n function baseWrapperValue(value, actions) {\n var result = value;\n if (result instanceof LazyWrapper) {\n result = result.value();\n }\n return arrayReduce(actions, function(result, action) {\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\n }, result);\n }\n\n /**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\n function baseXor(arrays, iteratee, comparator) {\n var length = arrays.length;\n if (length < 2) {\n return length ? baseUniq(arrays[0]) : [];\n }\n var index = -1,\n result = Array(length);\n\n while (++index < length) {\n var array = arrays[index],\n othIndex = -1;\n\n while (++othIndex < length) {\n if (othIndex != index) {\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n }\n }\n }\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n }\n\n /**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\n function baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n }\n\n /**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\n function castFunction(value) {\n return typeof value == 'function' ? value : identity;\n }\n\n /**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * A `baseRest` alias which can be replaced with `identity` by module\n * replacement plugins.\n *\n * @private\n * @type {Function}\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n var castRest = baseRest;\n\n /**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\n function castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n }\n\n /**\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n *\n * @private\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\n */\n var clearTimeout = ctxClearTimeout || function(id) {\n return root.clearTimeout(id);\n };\n\n /**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\n function cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n }\n\n /**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n }\n\n /**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\n function cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n }\n\n /**\n * Creates a clone of `map`.\n *\n * @private\n * @param {Object} map The map to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned map.\n */\n function cloneMap(map, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);\n return arrayReduce(array, addMapEntry, new map.constructor);\n }\n\n /**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\n function cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n }\n\n /**\n * Creates a clone of `set`.\n *\n * @private\n * @param {Object} set The set to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned set.\n */\n function cloneSet(set, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);\n return arrayReduce(array, addSetEntry, new set.constructor);\n }\n\n /**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\n function cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n }\n\n /**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\n function cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n }\n\n /**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\n function compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n }\n\n /**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n }\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n }\n\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n function copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\n function copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n }\n\n /**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n }\n\n /**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n }\n\n /**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n };\n }\n\n /**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n }\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n /**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\n function createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n }\n\n /**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\n function createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n }\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n }\n\n /**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\n function createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = getIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n }\n\n /**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\n function createFlow(fromRight) {\n return flatRest(function(funcs) {\n var length = funcs.length,\n index = length,\n prereq = LodashWrapper.prototype.thru;\n\n if (fromRight) {\n funcs.reverse();\n }\n while (index--) {\n var func = funcs[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? index : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) &&\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n !data[4].length && data[9] == 1\n ) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func))\n ? wrapper[funcName]()\n : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value)) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n });\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\n function createInverter(setter, toIteratee) {\n return function(object, iteratee) {\n return baseInverter(object, setter, toIteratee(iteratee), {});\n };\n }\n\n /**\n * Creates a function that performs a mathematical operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @param {number} [defaultValue] The value used for `undefined` arguments.\n * @returns {Function} Returns the new mathematical operation function.\n */\n function createMathOperation(operator, defaultValue) {\n return function(value, other) {\n var result;\n if (value === undefined && other === undefined) {\n return defaultValue;\n }\n if (value !== undefined) {\n result = value;\n }\n if (other !== undefined) {\n if (result === undefined) {\n return other;\n }\n if (typeof value == 'string' || typeof other == 'string') {\n value = baseToString(value);\n other = baseToString(other);\n } else {\n value = baseToNumber(value);\n other = baseToNumber(other);\n }\n result = operator(value, other);\n }\n return result;\n };\n }\n\n /**\n * Creates a function like `_.over`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over iteratees.\n * @returns {Function} Returns the new over function.\n */\n function createOver(arrayFunc) {\n return flatRest(function(iteratees) {\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n return baseRest(function(args) {\n var thisArg = this;\n return arrayFunc(iteratees, function(iteratee) {\n return apply(iteratee, thisArg, args);\n });\n });\n });\n }\n\n /**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\n function createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join('')\n : result.slice(0, length);\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\n function createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\n function createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n }\n\n /**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */\n function createRelationalOperation(operator) {\n return function(value, other) {\n if (!(typeof value == 'string' && typeof other == 'string')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return operator(value, other);\n };\n }\n\n /**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n }\n\n /**\n * Creates a function like `_.round`.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\n function createRound(methodName) {\n var func = Math[methodName];\n return function(number, precision) {\n number = toNumber(number);\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n if (precision) {\n // Shift with exponential notation to avoid floating-point issues.\n // See [MDN](https://mdn.io/round#Examples) for more details.\n var pair = (toString(number) + 'e').split('e'),\n value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n pair = (toString(value) + 'e').split('e');\n return +(pair[0] + 'e' + (+pair[1] - precision));\n }\n return func(number);\n };\n }\n\n /**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n };\n\n /**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */\n function createToPairs(keysFunc) {\n return function(object) {\n var tag = getTag(object);\n if (tag == mapTag) {\n return mapToArray(object);\n }\n if (tag == setTag) {\n return setToPairs(object);\n }\n return baseToPairs(object, keysFunc(object));\n };\n }\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n }\n\n /**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n }\n\n /**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n if (isObject(objValue) && isObject(srcValue)) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, objValue);\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n stack['delete'](srcValue);\n }\n return objValue;\n }\n\n /**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\n function customOmitClone(value) {\n return isPlainObject(value) ? undefined : value;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n function flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n }\n\n /**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n }\n\n /**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n }\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n };\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = (func.name + ''),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n /**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\n function getHolder(func) {\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n return object.placeholder;\n }\n\n /**\n * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n * this function returns the custom method, otherwise it returns `baseIteratee`.\n * If arguments are provided, the chosen function is invoked with them and\n * its result is returned.\n *\n * @private\n * @param {*} [value] The value to convert to an iteratee.\n * @param {number} [arity] The arity of the created iteratee.\n * @returns {Function} Returns the chosen function or its result.\n */\n function getIteratee() {\n var result = lodash.iteratee || iteratee;\n result = result === iteratee ? baseIteratee : result;\n return arguments.length ? result(arguments[0], arguments[1]) : result;\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n }\n\n /**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n };\n\n /**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n };\n\n /**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n var getTag = baseGetTag;\n\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n }\n\n /**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */\n function getView(start, end, transforms) {\n var index = -1,\n length = transforms.length;\n\n while (++index < length) {\n var data = transforms[index],\n size = data.size;\n\n switch (data.type) {\n case 'drop': start += size; break;\n case 'dropRight': end -= size; break;\n case 'take': end = nativeMin(end, start + size); break;\n case 'takeRight': start = nativeMax(start, end - size); break;\n }\n }\n return { 'start': start, 'end': end };\n }\n\n /**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\n function getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n }\n\n /**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\n function hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n }\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n }\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, cloneFunc, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return cloneMap(object, isDeep, cloneFunc);\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return cloneSet(object, isDeep, cloneFunc);\n\n case symbolTag:\n return cloneSymbol(object);\n }\n }\n\n /**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\n function insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n }\n\n /**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\n function isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n }\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n }\n\n /**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n }\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\n function isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * Checks if `func` is capable of being masked.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n */\n var isMaskable = coreJsData ? isFunction : stubFalse;\n\n /**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\n function isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n }\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !isObject(value);\n }\n\n /**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n /**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\n function parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n }\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = shortOut(baseSetData);\n\n /**\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n var setTimeout = ctxSetTimeout || function(func, wait) {\n return root.setTimeout(func, wait);\n };\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\n function setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + '');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n }\n\n /**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */\n function shuffleSelf(array, size) {\n var index = -1,\n length = array.length,\n lastIndex = length - 1;\n\n size = size === undefined ? length : size;\n while (++index < size) {\n var rand = baseRandom(index, lastIndex),\n value = array[rand];\n\n array[rand] = array[index];\n array[index] = value;\n }\n array.length = size;\n return array;\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n }\n\n /**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\n function updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = '_.' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n }\n\n /**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\n function wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\n function chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n }\n\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\n function compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * Creates a new array concatenating `array` with any additional arrays\n * and/or values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to concatenate.\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var other = _.concat(array, 2, [3], [[4]]);\n *\n * console.log(other);\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\n function concat() {\n var length = arguments.length;\n if (!length) {\n return [];\n }\n var args = Array(length - 1),\n array = arguments[0],\n index = length;\n\n while (index--) {\n args[index - 1] = arguments[index];\n }\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n }\n\n /**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\n var difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var differenceBy = baseRest(function(array, values) {\n var iteratee = last(values);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */\n var differenceWith = baseRest(function(array, values) {\n var comparator = last(values);\n if (isArrayLikeObject(comparator)) {\n comparator = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n : [];\n });\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, ['active', false]);\n * // => objects for ['barney']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for ['pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, ['active', false]);\n * // => objects for ['pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true)\n : [];\n }\n\n /**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], '*', 1, 3);\n * // => [4, '*', '*', 10]\n */\n function fill(array, value, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n start = 0;\n end = length;\n }\n return baseFill(array, value, start, end);\n }\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\n function findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index);\n }\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */\n function findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length - 1;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0\n ? nativeMax(length + index, 0)\n : nativeMin(index, length - 1);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n }\n\n /**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\n function flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n }\n\n /**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\n function flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\n }\n\n /**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */\n function flattenDepth(array, depth) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(array, depth);\n }\n\n /**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([['a', 1], ['b', 2]]);\n * // => { 'a': 1, 'b': 2 }\n */\n function fromPairs(pairs) {\n var index = -1,\n length = pairs == null ? 0 : pairs.length,\n result = {};\n\n while (++index < length) {\n var pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n }\n\n /**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\n function head(array) {\n return (array && array.length) ? array[0] : undefined;\n }\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\n function indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n }\n\n /**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\n function initial(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 0, -1) : [];\n }\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }]\n */\n var intersectionBy = baseRest(function(arrays) {\n var iteratee = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n if (iteratee === last(mapped)) {\n iteratee = undefined;\n } else {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }]\n */\n var intersectionWith = baseRest(function(arrays) {\n var comparator = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n comparator = typeof comparator == 'function' ? comparator : undefined;\n if (comparator) {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, undefined, comparator)\n : [];\n });\n\n /**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */\n function join(array, separator) {\n return array == null ? '' : nativeJoin.call(array, separator);\n }\n\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n function last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n }\n\n /**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */\n function lastIndexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n }\n return value === value\n ? strictLastIndexOf(array, value, index)\n : baseFindIndex(array, baseIsNaN, index, true);\n }\n\n /**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n *\n * _.nth(array, 1);\n * // => 'b'\n *\n * _.nth(array, -2);\n * // => 'c';\n */\n function nth(array, n) {\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n }\n\n /**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pull(array, 'a', 'c');\n * console.log(array);\n * // => ['b', 'b']\n */\n var pull = baseRest(pullAll);\n\n /**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */\n function pullAll(array, values) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values)\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n *\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n * console.log(array);\n * // => [{ 'x': 2 }]\n */\n function pullAllBy(array, values, iteratee) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, getIteratee(iteratee, 2))\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n *\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n */\n function pullAllWith(array, values, comparator) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, undefined, comparator)\n : array;\n }\n\n /**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => ['a', 'c']\n *\n * console.log(pulled);\n * // => ['b', 'd']\n */\n var pullAt = flatRest(function(array, indexes) {\n var length = array == null ? 0 : array.length,\n result = baseAt(array, indexes);\n\n basePullAt(array, arrayMap(indexes, function(index) {\n return isIndex(index, length) ? +index : index;\n }).sort(compareAscending));\n\n return result;\n });\n\n /**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\n function remove(array, predicate) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n\n predicate = getIteratee(predicate, 3);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n basePullAt(array, indexes);\n return result;\n }\n\n /**\n * Reverses `array` so that the first element becomes the last, the second\n * element becomes the second to last, and so on.\n *\n * **Note:** This method mutates `array` and is based on\n * [`Array#reverse`](https://mdn.io/Array/reverse).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.reverse(array);\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function reverse(array) {\n return array == null ? array : nativeReverse.call(array);\n }\n\n /**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function slice(array, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n start = 0;\n end = length;\n }\n else {\n start = start == null ? 0 : toInteger(start);\n end = end === undefined ? length : toInteger(end);\n }\n return baseSlice(array, start, end);\n }\n\n /**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */\n function sortedIndex(array, value) {\n return baseSortedIndex(array, value);\n }\n\n /**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\n function sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n }\n\n /**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */\n function sortedIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value);\n if (index < length && eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */\n function sortedLastIndex(array, value) {\n return baseSortedIndex(array, value, true);\n }\n\n /**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */\n function sortedLastIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n }\n\n /**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */\n function sortedLastIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value, true) - 1;\n if (eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.uniq` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */\n function sortedUniq(array) {\n return (array && array.length)\n ? baseSortedUniq(array)\n : [];\n }\n\n /**\n * This method is like `_.uniqBy` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */\n function sortedUniqBy(array, iteratee) {\n return (array && array.length)\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\n : [];\n }\n\n /**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */\n function tail(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 1, length) : [];\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\n function take(array, n, guard) {\n if (!(array && array.length)) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\n function takeRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */\n function takeRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, ['active', false]);\n * // => objects for ['barney', 'fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, 'active');\n * // => []\n */\n function takeWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3))\n : [];\n }\n\n /**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\n var union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n });\n\n /**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n var unionBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var unionWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n });\n\n /**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\n function uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n function uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\n function uniqWith(array, comparator) {\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n }\n\n /**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var length = 0;\n array = arrayFilter(array, function(group) {\n if (isArrayLikeObject(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n return baseTimes(length, function(index) {\n return arrayMap(array, baseProperty(index));\n });\n }\n\n /**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\n function unzipWith(array, iteratee) {\n if (!(array && array.length)) {\n return [];\n }\n var result = unzip(array);\n if (iteratee == null) {\n return result;\n }\n return arrayMap(result, function(group) {\n return apply(iteratee, undefined, group);\n });\n }\n\n /**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\n var without = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, values)\n : [];\n });\n\n /**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\n var xor = baseRest(function(arrays) {\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they're compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var xorBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var xorWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n });\n\n /**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */\n var zip = baseRest(unzip);\n\n /**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\n function zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n }\n\n /**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n */\n function zipObjectDeep(props, values) {\n return baseZipObject(props || [], values || [], baseSet);\n }\n\n /**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n * return a + b + c;\n * });\n * // => [111, 222]\n */\n var zipWith = baseRest(function(arrays) {\n var length = arrays.length,\n iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n return unzipWith(arrays, iteratee);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _\n * .chain(users)\n * .sortBy('age')\n * .map(function(o) {\n * return o.user + ' is ' + o.age;\n * })\n * .head()\n * .value();\n * // => 'pebbles is 1'\n */\n function chain(value) {\n var result = lodash(value);\n result.__chain__ = true;\n return result;\n }\n\n /**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * \"tap into\" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * // Mutate input array.\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */\n function tap(value, interceptor) {\n interceptor(value);\n return value;\n }\n\n /**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to \"pass thru\" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */\n function thru(value, interceptor) {\n return interceptor(value);\n }\n\n /**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _(object).at(['a[0].b.c', 'a[1]']).value();\n * // => [3, 4]\n */\n var wrapperAt = flatRest(function(paths) {\n var length = paths.length,\n start = length ? paths[0] : 0,\n value = this.__wrapped__,\n interceptor = function(object) { return baseAt(object, paths); };\n\n if (length > 1 || this.__actions__.length ||\n !(value instanceof LazyWrapper) || !isIndex(start)) {\n return this.thru(interceptor);\n }\n value = value.slice(start, +start + (length ? 1 : 0));\n value.__actions__.push({\n 'func': thru,\n 'args': [interceptor],\n 'thisArg': undefined\n });\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\n if (length && !array.length) {\n array.push(undefined);\n }\n return array;\n });\n });\n\n /**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n * .chain()\n * .head()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */\n function wrapperChain() {\n return chain(this);\n }\n\n /**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\n function wrapperCommit() {\n return new LodashWrapper(this.value(), this.__chain__);\n }\n\n /**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 1 }\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 2 }\n *\n * wrapped.next();\n * // => { 'done': true, 'value': undefined }\n */\n function wrapperNext() {\n if (this.__values__ === undefined) {\n this.__values__ = toArray(this.value());\n }\n var done = this.__index__ >= this.__values__.length,\n value = done ? undefined : this.__values__[this.__index__++];\n\n return { 'done': done, 'value': value };\n }\n\n /**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */\n function wrapperToIterator() {\n return this;\n }\n\n /**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\n function wrapperPlant(value) {\n var result,\n parent = this;\n\n while (parent instanceof baseLodash) {\n var clone = wrapperClone(parent);\n clone.__index__ = 0;\n clone.__values__ = undefined;\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n var previous = clone;\n parent = parent.__wrapped__;\n }\n previous.__wrapped__ = value;\n return result;\n }\n\n /**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function wrapperReverse() {\n var value = this.__wrapped__;\n if (value instanceof LazyWrapper) {\n var wrapped = value;\n if (this.__actions__.length) {\n wrapped = new LazyWrapper(this);\n }\n wrapped = wrapped.reverse();\n wrapped.__actions__.push({\n 'func': thru,\n 'args': [reverse],\n 'thisArg': undefined\n });\n return new LodashWrapper(wrapped, this.__chain__);\n }\n return this.thru(reverse);\n }\n\n /**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\n function wrapperValue() {\n return baseWrapperValue(this.__wrapped__, this.__actions__);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': 1, '6': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\n var countBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n ++result[key];\n } else {\n baseAssignValue(result, key, 1);\n }\n });\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\n function every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n */\n function filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\n var find = createFind(findIndex);\n\n /**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\n var findLast = createFind(findLastIndex);\n\n /**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMapDeep(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), INFINITY);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */\n function flatMapDepth(collection, iteratee, depth) {\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(map(collection, iteratee), depth);\n }\n\n /**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `2` then `1`.\n */\n function forEachRight(collection, iteratee) {\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\n var groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n });\n\n /**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\n function includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n }\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n var invokeMap = baseRest(function(collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value) {\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n });\n return result;\n });\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n * return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */\n var keyBy = createAggregator(function(result, value, key) {\n baseAssignValue(result, key, value);\n });\n\n /**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\n function map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\n function orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n }\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\n var partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function() { return [[], []]; });\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\n function reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n }\n\n /**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n function reduceRight(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n }\n\n /**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\n function reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(getIteratee(predicate, 3)));\n }\n\n /**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */\n function sample(collection) {\n var func = isArray(collection) ? arraySample : baseSample;\n return func(collection);\n }\n\n /**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */\n function sampleSize(collection, n, guard) {\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n return func(collection, n);\n }\n\n /**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\n function shuffle(collection) {\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\n return func(collection);\n }\n\n /**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\n function size(collection) {\n if (collection == null) {\n return 0;\n }\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n var tag = getTag(collection);\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n return baseKeys(collection).length;\n }\n\n /**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\n function some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\n var sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\n var now = ctxNow || function() {\n return root.Date.now();\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => Logs 'done saving!' after the two async saves have completed.\n */\n function after(n, func) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n /**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\n function ary(func, n, guard) {\n n = guard ? undefined : n;\n n = (func && n == null) ? func.length : n;\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n }\n\n /**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on('click', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */\n function before(n, func) {\n var result;\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n func = undefined;\n }\n return result;\n };\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\n var bind = baseRest(function(func, thisArg, partials) {\n var bitmask = WRAP_BIND_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bind));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(func, bitmask, thisArg, partials, holders);\n });\n\n /**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist. See\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */\n var bindKey = baseRest(function(object, key, partials) {\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bindKey));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(key, bitmask, object, partials, holders);\n });\n\n /**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\n function curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n }\n\n /**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\n function curryRight(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curryRight.placeholder;\n return result;\n }\n\n /**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\n function debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n }\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */\n var defer = baseRest(function(func, args) {\n return baseDelay(func, 1, args);\n });\n\n /**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => Logs 'later' after one second.\n */\n var delay = baseRest(function(func, wait, args) {\n return baseDelay(func, toNumber(wait) || 0, args);\n });\n\n /**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n * return _.toArray(arguments);\n * });\n *\n * flipped('a', 'b', 'c', 'd');\n * // => ['d', 'c', 'b', 'a']\n */\n function flip(func) {\n return createWrap(func, WRAP_FLIP_FLAG);\n }\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\n function negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n }\n\n /**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */\n function once(func) {\n return before(2, func);\n }\n\n /**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n * The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n * return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */\n var overArgs = castRest(function(func, transforms) {\n transforms = (transforms.length == 1 && isArray(transforms[0]))\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n var funcsLength = transforms.length;\n return baseRest(function(args) {\n var index = -1,\n length = nativeMin(args.length, funcsLength);\n\n while (++index < length) {\n args[index] = transforms[index].call(this, args[index]);\n }\n return apply(func, this, args);\n });\n });\n\n /**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\n var partial = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partial));\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n });\n\n /**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */\n var partialRight = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partialRight));\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n });\n\n /**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n */\n var rearg = flatRest(function(func, indexes) {\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n });\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\n function rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start === undefined ? start : toInteger(start);\n return baseRest(func, start);\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */\n function spread(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\n return baseRest(function(args) {\n var array = args[start],\n otherArgs = castSlice(args, 0, start);\n\n if (array) {\n arrayPush(otherArgs, array);\n }\n return apply(func, this, otherArgs);\n });\n }\n\n /**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n }\n\n /**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.unary(parseInt));\n * // => [6, 8, 10]\n */\n function unary(func) {\n return ary(func, 1);\n }\n\n /**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '

' + func(text) + '

';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '

fred, barney, & pebbles

'\n */\n function wrap(value, wrapper) {\n return partial(castFunction(wrapper), value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\n function castArray() {\n if (!arguments.length) {\n return [];\n }\n var value = arguments[0];\n return isArray(value) ? value : [value];\n }\n\n /**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\n function clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */\n function cloneWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\n function cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */\n function cloneDeepWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */\n function conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\n }\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n var gt = createRelationalOperation(baseGt);\n\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n var gte = createRelationalOperation(function(value, other) {\n return value >= other;\n });\n\n /**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n };\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n }\n\n /**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n var isBuffer = nativeIsBuffer || stubFalse;\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n /**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('');\n * // => false\n */\n function isElement(value) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n }\n\n /**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n function isEqual(value, other) {\n return baseIsEqual(value, other);\n }\n\n /**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\n function isEqualWith(value, other, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag ||\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n }\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\n function isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n /**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */\n function isMatch(object, source) {\n return object === source || baseIsMatch(object, source, getMatchData(source));\n }\n\n /**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */\n function isMatchWith(object, source, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseIsMatch(object, source, getMatchData(source), customizer);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (isMaskable(value)) {\n throw new Error(CORE_ERROR_TEXT);\n }\n return baseIsNative(value);\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\n function isNil(value) {\n return value == null;\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n }\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n /**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */\n function isSafeInteger(value) {\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n function isUndefined(value) {\n return value === undefined;\n }\n\n /**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */\n function isWeakMap(value) {\n return isObjectLike(value) && getTag(value) == weakMapTag;\n }\n\n /**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */\n function isWeakSet(value) {\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n }\n\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n var lt = createRelationalOperation(baseLt);\n\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n var lte = createRelationalOperation(function(value, other) {\n return value <= other;\n });\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\n function toArray(value) {\n if (!value) {\n return [];\n }\n if (isArrayLike(value)) {\n return isString(value) ? stringToArray(value) : copyArray(value);\n }\n if (symIterator && value[symIterator]) {\n return iteratorToArray(value[symIterator]());\n }\n var tag = getTag(value),\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n return func(value);\n }\n\n /**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\n function toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n }\n\n /**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\n function toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n }\n\n /**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */\n function toLength(value) {\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n }\n\n /**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\n function toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n }\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\n function toPlainObject(value) {\n return copyObject(value, keysIn(value));\n }\n\n /**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */\n function toSafeInteger(value) {\n return value\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n : (value === 0 ? value : 0);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\n var assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n });\n\n /**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\n var assignIn = createAssigner(function(object, source) {\n copyObject(source, keysIn(source), object);\n });\n\n /**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n });\n\n /**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keys(source), object, customizer);\n });\n\n /**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */\n var at = flatRest(baseAt);\n\n /**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties == null ? result : baseAssign(result, properties);\n }\n\n /**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var defaults = baseRest(function(args) {\n args.push(undefined, customDefaultsAssignIn);\n return apply(assignInWith, undefined, args);\n });\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */\n var defaultsDeep = baseRest(function(args) {\n args.push(undefined, customDefaultsMerge);\n return apply(mergeWith, undefined, args);\n });\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */\n function findKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n }\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\n function findLastKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n }\n\n /**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\n function forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */\n function forInRight(object, iteratee) {\n return object == null\n ? object\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forOwn(object, iteratee) {\n return object && baseForOwn(object, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */\n function forOwnRight(object, iteratee) {\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */\n function functions(object) {\n return object == null ? [] : baseFunctions(object, keys(object));\n }\n\n /**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */\n function functionsIn(object) {\n return object == null ? [] : baseFunctions(object, keysIn(object));\n }\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\n function has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n }\n\n /**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\n function hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n }\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\n var invert = createInverter(function(result, value, key) {\n result[value] = key;\n }, constant(identity));\n\n /**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n * return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */\n var invertBy = createInverter(function(result, value, key) {\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n }, getIteratee);\n\n /**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */\n var invoke = baseRest(baseInvoke);\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n function keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n }\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n }\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\n function mapKeys(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\n }\n\n /**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\n function mapValues(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n }\n\n /**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\n var merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n });\n\n /**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n });\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\n var omit = flatRest(function(object, paths) {\n var result = {};\n if (object == null) {\n return result;\n }\n var isDeep = false;\n paths = arrayMap(paths, function(path) {\n path = castPath(path, object);\n isDeep || (isDeep = path.length > 1);\n return path;\n });\n copyObject(object, getAllKeysIn(object), result);\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n var length = paths.length;\n while (length--) {\n baseUnset(result, paths[length]);\n }\n return result;\n });\n\n /**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */\n function omitBy(object, predicate) {\n return pickBy(object, negate(getIteratee(predicate)));\n }\n\n /**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\n var pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n });\n\n /**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\n function pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = getIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n }\n\n /**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */\n function result(object, path, defaultValue) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length;\n\n // Ensure the loop is entered when path is empty.\n if (!length) {\n length = 1;\n object = undefined;\n }\n while (++index < length) {\n var value = object == null ? undefined : object[toKey(path[index])];\n if (value === undefined) {\n index = length;\n value = defaultValue;\n }\n object = isFunction(value) ? value.call(object) : value;\n }\n return object;\n }\n\n /**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n }\n\n /**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */\n function setWith(object, path, value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseSet(object, path, value, customizer);\n }\n\n /**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */\n var toPairs = createToPairs(keys);\n\n /**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */\n var toPairsIn = createToPairs(keysIn);\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\n function transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = getIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n /**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */\n function unset(object, path) {\n return object == null ? true : baseUnset(object, path);\n }\n\n /**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */\n function update(object, path, updater) {\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\n }\n\n /**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */\n function updateWith(object, path, updater, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n }\n\n /**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n }\n\n /**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return object == null ? [] : baseValues(object, keysIn(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\n function clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n }\n\n /**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */\n function inRange(number, start, end) {\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n number = toNumber(number);\n return baseInRange(number, start, end);\n }\n\n /**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(lower, upper, floating) {\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined;\n }\n if (floating === undefined) {\n if (typeof upper == 'boolean') {\n floating = upper;\n upper = undefined;\n }\n else if (typeof lower == 'boolean') {\n floating = lower;\n lower = undefined;\n }\n }\n if (lower === undefined && upper === undefined) {\n lower = 0;\n upper = 1;\n }\n else {\n lower = toFinite(lower);\n if (upper === undefined) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\n if (floating || lower % 1 || upper % 1) {\n var rand = nativeRandom();\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n }\n return baseRandom(lower, upper);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\n var camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n });\n\n /**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\n function capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n }\n\n /**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\n function deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n }\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = toString(string);\n target = baseToString(target);\n\n var length = string.length;\n position = position === undefined\n ? length\n : baseClamp(toInteger(position), 0, length);\n\n var end = position;\n position -= target.length;\n return position >= 0 && string.slice(position, end) == target;\n }\n\n /**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n }\n\n /**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\n function escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n }\n\n /**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */\n var kebabCase = createCompounder(function(result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n\n /**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */\n var lowerCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toLowerCase();\n });\n\n /**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\n var lowerFirst = createCaseFirst('toLowerCase');\n\n /**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\n function pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n if (!length || strLength >= length) {\n return string;\n }\n var mid = (length - strLength) / 2;\n return (\n createPadding(nativeFloor(mid), chars) +\n string +\n createPadding(nativeCeil(mid), chars)\n );\n }\n\n /**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\n function padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n }\n\n /**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart('abc', 6);\n * // => ' abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */\n function padStart(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (createPadding(length - strLength, chars) + string)\n : string;\n }\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n }\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\n function repeat(string, n, guard) {\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n return baseRepeat(toString(string), n);\n }\n\n /**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\n function replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n }\n\n /**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */\n var snakeCase = createCompounder(function(result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n\n /**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */\n function split(string, separator, limit) {\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n separator = limit = undefined;\n }\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n if (!limit) {\n return [];\n }\n string = toString(string);\n if (string && (\n typeof separator == 'string' ||\n (separator != null && !isRegExp(separator))\n )) {\n separator = baseToString(separator);\n if (!separator && hasUnicode(string)) {\n return castSlice(stringToArray(string), 0, limit);\n }\n }\n return string.split(separator, limit);\n }\n\n /**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\n var startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\n });\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = toString(string);\n position = position == null\n ? 0\n : baseClamp(toInteger(position), 0, string.length);\n\n target = baseToString(target);\n return string.slice(position, position + target.length) == target;\n }\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<%- value %>');\n * compiled({ 'value': '\\r\\n\\r\\n\\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 78 */\n/***/ function(module, exports) {\n\n\t/*\r\n\t\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\t\tAuthor Tobias Koppers @sokra\r\n\t*/\r\n\t// css base code, injected by the css-loader\r\n\tmodule.exports = function() {\r\n\t\tvar list = [];\r\n\t\r\n\t\t// return the list of modules as css string\r\n\t\tlist.toString = function toString() {\r\n\t\t\tvar result = [];\r\n\t\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\t\tvar item = this[i];\r\n\t\t\t\tif(item[2]) {\r\n\t\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult.push(item[1]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn result.join(\"\");\r\n\t\t};\r\n\t\r\n\t\t// import a list of modules into the list\r\n\t\tlist.i = function(modules, mediaQuery) {\r\n\t\t\tif(typeof modules === \"string\")\r\n\t\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\t\tvar alreadyImportedModules = {};\r\n\t\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\t\tvar id = this[i][0];\r\n\t\t\t\tif(typeof id === \"number\")\r\n\t\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t\t}\r\n\t\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\t\tvar item = modules[i];\r\n\t\t\t\t// skip already imported module\r\n\t\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t\t// when a module is imported multiple times with different media queries.\r\n\t\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlist.push(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\treturn list;\r\n\t};\r\n\n\n/***/ },\n/* 79 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*\n\t\tMIT License http://www.opensource.org/licenses/mit-license.php\n\t\tAuthor Tobias Koppers @sokra\n\t*/\n\tvar stylesInDom = {},\n\t\tmemoize = function(fn) {\n\t\t\tvar memo;\n\t\t\treturn function () {\n\t\t\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\t\t\treturn memo;\n\t\t\t};\n\t\t},\n\t\tisOldIE = memoize(function() {\n\t\t\treturn /msie [6-9]\\b/.test(window.navigator.userAgent.toLowerCase());\n\t\t}),\n\t\tgetHeadElement = memoize(function () {\n\t\t\treturn document.head || document.getElementsByTagName(\"head\")[0];\n\t\t}),\n\t\tsingletonElement = null,\n\t\tsingletonCounter = 0,\n\t\tstyleElementsInsertedAtTop = [];\n\t\n\tmodule.exports = function(list, options) {\n\t\tif(false) {\n\t\t\tif(typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t\t}\n\t\n\t\toptions = options || {};\n\t\t// Force single-tag solution on IE6-9, which has a hard limit on the # of \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 85 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t header: { type: String },\n\t placement: { type: String, default: 'right' },\n\t show: { type: Boolean, required: true },\n\t width: { type: Number, default: 320 }\n\t },\n\t watch: {\n\t show: function show(val, old) {\n\t var _this = this;\n\t\n\t this.$emit('input', val);\n\t this.$emit(this.show ? 'open' : 'close');\n\t var body = document.body;\n\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\n\t if (val) {\n\t if (!this._backdrop) {\n\t this._backdrop = document.createElement('div');\n\t }\n\t this._backdrop.className = 'aside-backdrop';\n\t body.appendChild(this._backdrop);\n\t body.classList.add('modal-open');\n\t if (scrollBarWidth !== 0) {\n\t body.style.paddingRight = scrollBarWidth + 'px';\n\t }\n\t // request property that requires layout to force a layout\n\t var x = this._backdrop.clientHeight;\n\t this._backdrop.classList.add('in');\n\t (0, _NodeList2.default)(this._backdrop).on('click', function () {\n\t return _this.trigger_close();\n\t });\n\t } else {\n\t (0, _NodeList2.default)(this._backdrop).on('transitionend', function () {\n\t (0, _NodeList2.default)(_this._backdrop).off();\n\t try {\n\t body.classList.remove('modal-open');\n\t body.style.paddingRight = '0';\n\t body.removeChild(_this._backdrop);\n\t _this._backdrop = null;\n\t } catch (e) {}\n\t });\n\t this._backdrop.className = 'aside-backdrop';\n\t }\n\t }\n\t },\n\t methods: {\n\t trigger: function trigger() {\n\t var _this2 = this;\n\t\n\t return {\n\t close: function close() {\n\t return _this2.trigger_close();\n\t },\n\t open: function open() {\n\t return _this2.trigger_open();\n\t }\n\t };\n\t },\n\t trigger_close: function trigger_close() {\n\t this.$emit('close');\n\t },\n\t trigger_open: function trigger_open() {\n\t this.$emit('open');\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this3 = this;\n\t\n\t this.$emit('trigger', function () {\n\t return _this3.trigger;\n\t });\n\t }\n\t};\n\n/***/ },\n/* 86 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('transition', {\n\t attrs: {\n\t \"name\": 'slide' + _vm.placement\n\t }\n\t }, [(_vm.show) ? _vm._c('div', {\n\t staticClass: \"aside\",\n\t class: _vm.placement,\n\t style: ({\n\t width: _vm.width + 'px'\n\t })\n\t }, [_vm._c('div', {\n\t staticClass: \"aside-dialog\"\n\t }, [_vm._c('div', {\n\t staticClass: \"aside-content\"\n\t }, [_vm._c('div', {\n\t staticClass: \"aside-header\"\n\t }, [_vm._c('button', {\n\t staticClass: \"close\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.trigger_close\n\t }\n\t }, [_vm._c('span', [_vm._v(\"×\")])]), _vm._v(\" \"), _vm._c('h4', {\n\t staticClass: \"aside-title\"\n\t }, [_vm._t(\"header\", [_vm._v(_vm._s(_vm.header))])], 2)]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"aside-body\"\n\t }, [_vm._t(\"default\")], 2)])])]) : _vm._e()])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-3a4bde27\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 87 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(88)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(89)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\ButtonGroup.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-125eb0c8\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-125eb0c8\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] ButtonGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 88 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t buttons: { type: Boolean, default: true },\n\t disabled: { type: Boolean, default: false },\n\t justified: { type: Boolean, default: false },\n\t type: { type: String, default: 'default' },\n\t value: { default: null },\n\t vertical: { type: Boolean, default: false }\n\t },\n\t computed: {\n\t btnGroup: function btnGroup() {\n\t return !this.disabled;\n\t }\n\t },\n\t data: function data() {\n\t return {\n\t val: this.value\n\t };\n\t },\n\t\n\t watch: {\n\t // this will update EXTERNAL v-model when our val changes\n\t val: function val(_val) {\n\t this.$emit('input', _val);\n\t },\n\t\n\t // this will update our INTERNAL val, when something external changes our v-model\n\t value: function value(val) {\n\t this.val = val;\n\t }\n\t }\n\t};\n\n/***/ },\n/* 89 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: {\n\t 'btn-group': _vm.buttons, 'btn-group-justified': _vm.justified, 'btn-group-vertical': _vm.vertical\n\t },\n\t attrs: {\n\t \"data-toggle\": _vm.buttons && 'buttons'\n\t }\n\t }, [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-125eb0c8\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 90 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(91)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(93)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(94)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Carousel.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-322dee41\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-322dee41\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-322dee41\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Carousel.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 91 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 93 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// let coerce = {\n\t// interval: 'number'\n\t// }\n\t\n\texports.default = {\n\t props: {\n\t indicators: {\n\t type: Boolean,\n\t default: true\n\t },\n\t controls: {\n\t type: Boolean,\n\t default: true\n\t },\n\t interval: {\n\t type: Number,\n\t default: 5000\n\t }\n\t },\n\t data: function data() {\n\t return {\n\t indicator_list: [],\n\t index: 0,\n\t isAnimating: false\n\t };\n\t },\n\t\n\t watch: {\n\t index: function index(newVal, oldVal) {\n\t this.slide(newVal > oldVal ? 'left' : 'right', newVal, oldVal);\n\t }\n\t },\n\t methods: {\n\t indicatorClick: function indicatorClick(index) {\n\t if (this.isAnimating || this.index === index) return false;\n\t this.isAnimating = true;\n\t this.index = index;\n\t },\n\t slide: function slide(direction, next, prev) {\n\t var _this = this;\n\t\n\t if (!this.$el) {\n\t return;\n\t }\n\t var $slider = (0, _NodeList2.default)('.item', this.$el);\n\t if (!$slider.length) {\n\t return;\n\t }\n\t var selected = $slider[next] || $slider[0];\n\t (0, _NodeList2.default)(selected).addClass(direction === 'left' ? 'next' : 'prev');\n\t // request property that requires layout to force a layout\n\t var x = selected.clientHeight;\n\t (0, _NodeList2.default)([$slider[prev], selected]).addClass(direction).on('transitionend', function () {\n\t $slider.off('transitionend').className = 'item';\n\t (0, _NodeList2.default)(selected).addClass('active');\n\t _this.isAnimating = false;\n\t });\n\t },\n\t next: function next() {\n\t if (!this.$el || this.isAnimating) {\n\t return false;\n\t }\n\t this.isAnimating = true;\n\t this.index + 1 < (0, _NodeList2.default)('.item', this.$el).length ? this.index += 1 : this.index = 0;\n\t },\n\t prev: function prev() {\n\t if (!this.$el || this.isAnimating) {\n\t return false;\n\t }\n\t this.isAnimating = true;\n\t this.index === 0 ? this.index = (0, _NodeList2.default)('.item', this.$el).length - 1 : this.index -= 1;\n\t },\n\t toggleInterval: function toggleInterval(val) {\n\t if (val === undefined) {\n\t val = this._intervalID;\n\t }\n\t if (this._intervalID) {\n\t clearInterval(this._intervalID);\n\t delete this._intervalID;\n\t }\n\t if (val && this.interval > 0) {\n\t this._intervalID = setInterval(this.next, this.interval);\n\t }\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this2 = this;\n\t\n\t this.toggleInterval(true);\n\t (0, _NodeList2.default)(this.$el).on('mouseenter', function () {\n\t return _this2.toggleInterval(false);\n\t }).on('mouseleave', function () {\n\t return _this2.toggleInterval(true);\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t this.toggleInterval(false);\n\t (0, _NodeList2.default)(this.$el).off('mouseenter mouseleave');\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 94 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"carousel slide\",\n\t attrs: {\n\t \"data-ride\": \"carousel\"\n\t }\n\t }, [_vm._c('ol', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.indicators),\n\t expression: \"indicators\"\n\t }],\n\t staticClass: \"carousel-indicators\"\n\t }, _vm._l((_vm.indicator_list), function(indicator, i) {\n\t return _vm._c('li', {\n\t class: {\n\t active: i === _vm.index\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.indicatorClick(i)\n\t }\n\t }\n\t }, [_vm._c('span')])\n\t })), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"carousel-inner\",\n\t attrs: {\n\t \"role\": \"listbox\"\n\t }\n\t }, [_vm._t(\"default\")], 2), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.controls),\n\t expression: \"controls\"\n\t }],\n\t staticClass: \"carousel-controls hidden-xs\"\n\t }, [_vm._c('a', {\n\t staticClass: \"left carousel-control\",\n\t attrs: {\n\t \"role\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.prev\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"glyphicon glyphicon-chevron-left\",\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t })]), _vm._v(\" \"), _vm._c('a', {\n\t staticClass: \"right carousel-control\",\n\t attrs: {\n\t \"role\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.next\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"glyphicon glyphicon-chevron-right\",\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t })])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-322dee41\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 95 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(96)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(98)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(99)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Checkbox.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-6922bf24\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-6922bf24\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-6922bf24\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Checkbox.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 96 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 98 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t button: { type: Boolean, default: false },\n\t disabled: { type: Boolean, default: false },\n\t falseValue: { default: false },\n\t name: { type: String, default: null },\n\t readonly: { type: Boolean, default: false },\n\t trueValue: { default: true },\n\t type: { type: String, default: null },\n\t value: { default: false }\n\t },\n\t data: function data() {\n\t return {\n\t checked: this.value === this.trueValue\n\t };\n\t },\n\t\n\t computed: {\n\t inGroup: function inGroup() {\n\t return this.$parent && this.$parent.btnGroup && !this.$parent._radioGroup;\n\t },\n\t isButton: function isButton() {\n\t return this.button || this.$parent && this.$parent.btnGroup && this.$parent.buttons;\n\t },\n\t isFalse: function isFalse() {\n\t return this.value === this.falseValue;\n\t },\n\t isTrue: function isTrue() {\n\t return this.value === this.trueValue;\n\t },\n\t parentValue: function parentValue() {\n\t return this.$parent.val;\n\t },\n\t typeColor: function typeColor() {\n\t return this.type || this.$parent && this.$parent.type || 'default';\n\t }\n\t },\n\t watch: {\n\t checked: function checked(val, old) {\n\t var value = val ? this.trueValue : this.falseValue;\n\t this.$emit('checked', val);\n\t this.$emit('input', value);\n\t this.updateParent();\n\t },\n\t parentValue: function parentValue(val) {\n\t this.updateFromParent();\n\t },\n\t value: function value(val, old) {\n\t var checked = val === this.trueValue;\n\t if (this.checked !== checked) {\n\t this.checked = checked;\n\t }\n\t }\n\t },\n\t created: function created() {\n\t if (this.inGroup) {\n\t var parent = this.$parent;\n\t parent._checkboxGroup = true;\n\t if (!(parent.val instanceof Array)) {\n\t parent.val = [];\n\t }\n\t }\n\t },\n\t mounted: function mounted() {\n\t this.updateFromParent();\n\t },\n\t\n\t methods: {\n\t // called @ mounted(), or whenever $parent.val changes\n\t // sync our state with the $parent.val\n\t updateFromParent: function updateFromParent() {\n\t if (this.inGroup) {\n\t var index = this.$parent.val.indexOf(this.trueValue);\n\t this.checked = ~index;\n\t }\n\t },\n\t\n\t // called when our checked state changes\n\t updateParent: function updateParent() {\n\t if (this.inGroup) {\n\t var index = this.$parent.val.indexOf(this.trueValue);\n\t if (this.checked && !~index) this.$parent.val.push(this.trueValue);\n\t if (!this.checked && ~index) this.$parent.val.splice(index, 1);\n\t }\n\t },\n\t toggle: function toggle() {\n\t if (this.disabled || this.readonly) {\n\t return;\n\t }\n\t this.checked = !this.checked;\n\t }\n\t }\n\t};\n\n/***/ },\n/* 99 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c(_vm.isButton ? 'a' : 'label', {\n\t tag: \"a\",\n\t class: [_vm.isButton ? 'btn btn-' + _vm.typeColor : 'open checkbox ' + _vm.typeColor, {\n\t active: _vm.checked,\n\t disabled: _vm.disabled,\n\t readonly: _vm.readonly\n\t }],\n\t on: {\n\t \"click\": _vm.toggle\n\t }\n\t }, [(_vm.name) ? _vm._c('input', {\n\t attrs: {\n\t \"type\": \"hidden\",\n\t \"name\": _vm.name\n\t },\n\t domProps: {\n\t \"value\": _vm.checked ? _vm.trueValue : _vm.falseValue\n\t }\n\t }) : _vm._e(), _vm._v(\" \"), (!_vm.isButton) ? _vm._c('span', {\n\t staticClass: \"icon dropdown-toggle\",\n\t class: [_vm.checked ? 'btn-' + _vm.typeColor : '', {\n\t bg: _vm.typeColor === 'default'\n\t }]\n\t }) : _vm._e(), _vm._v(\" \"), (!_vm.isButton && _vm.checked && _vm.typeColor === 'default') ? _vm._c('span', {\n\t staticClass: \"icon\"\n\t }) : _vm._e(), _vm._v(\" \"), _vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-6922bf24\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 100 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(101)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(103)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(104)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Datepicker.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-477b8e5d\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-477b8e5d\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Datepicker.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 101 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 103 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\t// import $ from './utils/NodeList.js'\n\t\n\texports.default = {\n\t props: {\n\t value: { type: String },\n\t format: { default: 'MM/dd/yyyy' },\n\t disabledDaysOfWeek: { type: Array, default: function _default() {\n\t return [];\n\t }\n\t },\n\t width: { type: String },\n\t clearButton: { type: Boolean, default: false },\n\t lang: { type: String, default: navigator.language },\n\t placeholder: { type: String },\n\t iconsFont: { type: String, default: 'glyphicon' }\n\t },\n\t data: function data() {\n\t return {\n\t currDate: new Date(),\n\t dateRange: [],\n\t decadeRange: [],\n\t displayDayView: false,\n\t displayMonthView: false,\n\t displayYearView: false,\n\t val: this.value\n\t };\n\t },\n\t\n\t watch: {\n\t currDate: function currDate() {\n\t this.getDateRange();\n\t },\n\t format: function format() {\n\t this.val = this.stringify(this.currDate);\n\t },\n\t val: function val(_val, old) {\n\t this.$emit('input', _val);\n\t },\n\t value: function value(val) {\n\t if (this.val !== val) {\n\t this.val = val;\n\t }\n\t }\n\t },\n\t computed: {\n\t text: function text() {\n\t return (0, _utils.translations)(this.lang);\n\t },\n\t preBtnClasses: function preBtnClasses() {\n\t return 'datepicker-preBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-left';\n\t },\n\t nextBtnClasses: function nextBtnClasses() {\n\t return 'datepicker-nextBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-right';\n\t },\n\t disabledDaysArray: function disabledDaysArray() {\n\t return this.disabledDaysOfWeek.map(function (d) {\n\t return parseInt(d, 10);\n\t });\n\t }\n\t },\n\t methods: {\n\t close: function close() {\n\t this.displayDayView = this.displayMonthView = this.displayYearView = false;\n\t },\n\t inputClick: function inputClick() {\n\t this.currDate = this.parse(this.val) || this.parse(new Date());\n\t if (this.displayMonthView || this.displayYearView) {\n\t this.displayDayView = false;\n\t } else {\n\t this.displayDayView = !this.displayDayView;\n\t }\n\t },\n\t preNextDecadeClick: function preNextDecadeClick(flag) {\n\t var year = this.currDate.getFullYear();\n\t var months = this.currDate.getMonth();\n\t var date = this.currDate.getDate();\n\t\n\t if (flag === 0) {\n\t this.currDate = new Date(year - 10, months, date);\n\t } else {\n\t this.currDate = new Date(year + 10, months, date);\n\t }\n\t },\n\t preNextMonthClick: function preNextMonthClick(flag) {\n\t var year = this.currDate.getFullYear();\n\t var month = this.currDate.getMonth();\n\t var date = this.currDate.getDate();\n\t\n\t if (flag === 0) {\n\t var preMonth = this.getYearMonth(year, month - 1);\n\t this.currDate = new Date(preMonth.year, preMonth.month, date);\n\t } else {\n\t var nextMonth = this.getYearMonth(year, month + 1);\n\t this.currDate = new Date(nextMonth.year, nextMonth.month, date);\n\t }\n\t },\n\t preNextYearClick: function preNextYearClick(flag) {\n\t var year = this.currDate.getFullYear();\n\t var months = this.currDate.getMonth();\n\t var date = this.currDate.getDate();\n\t\n\t if (flag === 0) {\n\t this.currDate = new Date(year - 1, months, date);\n\t } else {\n\t this.currDate = new Date(year + 1, months, date);\n\t }\n\t },\n\t yearSelect: function yearSelect(year) {\n\t this.displayYearView = false;\n\t this.displayMonthView = true;\n\t this.currDate = new Date(year, this.currDate.getMonth(), this.currDate.getDate());\n\t },\n\t daySelect: function daySelect(day) {\n\t if (day.sclass === 'datepicker-item-disable') {\n\t return false;\n\t } else {\n\t this.currDate = day.date;\n\t this.val = this.stringify(this.currDate);\n\t this.displayDayView = false;\n\t }\n\t },\n\t switchMonthView: function switchMonthView() {\n\t this.displayDayView = false;\n\t this.displayMonthView = true;\n\t },\n\t switchDecadeView: function switchDecadeView() {\n\t this.displayMonthView = false;\n\t this.displayYearView = true;\n\t },\n\t monthSelect: function monthSelect(index) {\n\t this.displayMonthView = false;\n\t this.displayDayView = true;\n\t this.currDate = new Date(this.currDate.getFullYear(), index, this.currDate.getDate());\n\t },\n\t getYearMonth: function getYearMonth(year, month) {\n\t if (month > 11) {\n\t year++;\n\t month = 0;\n\t } else if (month < 0) {\n\t year--;\n\t month = 11;\n\t }\n\t return { year: year, month: month };\n\t },\n\t stringifyDecadeHeader: function stringifyDecadeHeader(date) {\n\t var yearStr = date.getFullYear().toString();\n\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0;\n\t var lastYearOfDecade = parseInt(firstYearOfDecade, 10) + 10;\n\t return firstYearOfDecade + '-' + lastYearOfDecade;\n\t },\n\t stringifyDayHeader: function stringifyDayHeader(date) {\n\t return this.text.months[date.getMonth()] + ' ' + date.getFullYear();\n\t },\n\t parseMonth: function parseMonth(date) {\n\t return this.text.months[date.getMonth()];\n\t },\n\t stringifyYearHeader: function stringifyYearHeader(date) {\n\t return date.getFullYear();\n\t },\n\t stringify: function stringify(date) {\n\t var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.format;\n\t\n\t if (!date) date = this.parse();\n\t if (!date) return '';\n\t var year = date.getFullYear();\n\t var month = date.getMonth() + 1;\n\t var day = date.getDate();\n\t var monthName = this.parseMonth(date);\n\t return format.replace(/yyyy/g, year).replace(/yy/g, year).replace(/MMMM/g, monthName).replace(/MMM/g, monthName.substring(0, 3)).replace(/MM/g, ('0' + month).slice(-2)).replace(/M(?!a)/g, month).replace(/dd/g, ('0' + day).slice(-2)).replace(/d/g, day);\n\t },\n\t parse: function parse(str) {\n\t if (str === undefined || str === null) {\n\t str = this.val;\n\t }\n\t var date = str.length === 10 && (this.format === 'dd-MM-yyyy' || this.format === 'dd/MM/yyyy') ? new Date(str.substring(6, 10), str.substring(3, 5) - 1, str.substring(0, 2)) : new Date(str);\n\t return isNaN(date.getFullYear()) ? new Date() : date;\n\t },\n\t getDayCount: function getDayCount(year, month) {\n\t var dict = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\t if (month === 1) {\n\t if (year % 400 === 0 || year % 4 === 0 && year % 100 !== 0) {\n\t return 29;\n\t }\n\t }\n\t return dict[month];\n\t },\n\t getDateRange: function getDateRange() {\n\t this.dateRange = [];\n\t this.decadeRange = [];\n\t var time = {\n\t year: this.currDate.getFullYear(),\n\t month: this.currDate.getMonth(),\n\t day: this.currDate.getDate()\n\t };\n\t var yearStr = time.year.toString();\n\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0 - 1;\n\t for (var i = 0; i < 12; i++) {\n\t this.decadeRange.push({\n\t text: firstYearOfDecade + i\n\t });\n\t }\n\t\n\t var currMonthFirstDay = new Date(time.year, time.month, 1);\n\t var firstDayWeek = currMonthFirstDay.getDay() + 1;\n\t if (firstDayWeek === 0) {\n\t firstDayWeek = 7;\n\t }\n\t var dayCount = this.getDayCount(time.year, time.month);\n\t if (firstDayWeek > 1) {\n\t var preMonth = this.getYearMonth(time.year, time.month - 1);\n\t var prevMonthDayCount = this.getDayCount(preMonth.year, preMonth.month);\n\t for (var _i = 1; _i < firstDayWeek; _i++) {\n\t var dayText = prevMonthDayCount - firstDayWeek + _i + 1;\n\t var date = new Date(preMonth.year, preMonth.month, dayText);\n\t var sclass = 'datepicker-item-gray';\n\t if (this.disabledDaysArray.indexOf(date.getDay()) > -1) {\n\t sclass = 'datepicker-item-disable';\n\t }\n\t this.dateRange.push({ text: dayText, date: date, sclass: sclass });\n\t }\n\t }\n\t\n\t for (var _i2 = 1; _i2 <= dayCount; _i2++) {\n\t var _date = new Date(time.year, time.month, _i2);\n\t var _sclass = '';\n\t if (this.disabledDaysArray.indexOf(_date.getDay()) > -1) {\n\t _sclass = 'datepicker-item-disable';\n\t }\n\t if (_i2 == time.day && _date.getFullYear() == time.year && _date.getMonth() == time.month) {\n\t _sclass = 'datepicker-dateRange-item-active';\n\t }\n\t this.dateRange.push({ text: _i2, date: _date, sclass: _sclass });\n\t }\n\t\n\t if (this.dateRange.length < 42) {\n\t var nextMonthNeed = 42 - this.dateRange.length;\n\t var nextMonth = this.getYearMonth(time.year, time.month + 1);\n\t\n\t for (var _i3 = 1; _i3 <= nextMonthNeed; _i3++) {\n\t var _date2 = new Date(nextMonth.year, nextMonth.month, _i3);\n\t var _sclass2 = 'datepicker-item-gray';\n\t if (this.disabledDaysArray.indexOf(_date2.getDay()) > -1) {\n\t _sclass2 = 'datepicker-item-disable';\n\t }\n\t this.dateRange.push({ text: _i3, date: _date2, sclass: _sclass2 });\n\t }\n\t }\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this = this;\n\t\n\t this.$emit('child-created', this);\n\t this.currDate = this.parse(this.val) || this.parse(new Date());\n\t this._blur = function (e) {\n\t if (!_this.$el.contains(e.target)) _this.close();\n\t };\n\t window.addEventListener('click', this._blur);\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t window.removeEventListener('click', this._blur);\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 104 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"datepicker\"\n\t }, [_vm._c('input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t staticClass: \"form-control datepicker-input\",\n\t class: {\n\t 'with-reset-button': _vm.clearButton\n\t },\n\t style: ({\n\t width: _vm.width\n\t }),\n\t attrs: {\n\t \"type\": \"text\",\n\t \"placeholder\": _vm.placeholder\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.val)\n\t },\n\t on: {\n\t \"click\": _vm.inputClick,\n\t \"input\": function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.val = $event.target.value\n\t }\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.val) ? _vm._c('button', {\n\t staticClass: \"close\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.val = ''\n\t }\n\t }\n\t }, [_vm._c('span', [_vm._v(\"×\")])]) : _vm._e(), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.displayDayView),\n\t expression: \"displayDayView\"\n\t }],\n\t staticClass: \"datepicker-popup\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-inner\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-body\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-ctrl\"\n\t }, [_vm._c('span', {\n\t class: _vm.preBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextMonthClick(0)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t class: _vm.nextBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextMonthClick(1)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('p', {\n\t on: {\n\t \"click\": _vm.switchMonthView\n\t }\n\t }, [_vm._v(_vm._s(_vm.stringifyDayHeader(_vm.currDate)))])]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-weekRange\"\n\t }, _vm._l((_vm.text.daysOfWeek), function(w) {\n\t return _vm._c('span', [_vm._v(_vm._s(w))])\n\t })), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-dateRange\"\n\t }, _vm._l((_vm.dateRange), function(d) {\n\t return _vm._c('span', {\n\t class: d.sclass,\n\t on: {\n\t \"click\": function($event) {\n\t _vm.daySelect(d)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(d.text))])\n\t }))])])]), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.displayMonthView),\n\t expression: \"displayMonthView\"\n\t }],\n\t staticClass: \"datepicker-popup\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-inner\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-body\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-ctrl\"\n\t }, [_vm._c('span', {\n\t class: _vm.preBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextYearClick(0)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t class: _vm.nextBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextYearClick(1)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('p', {\n\t on: {\n\t \"click\": _vm.switchDecadeView\n\t }\n\t }, [_vm._v(_vm._s(_vm.stringifyYearHeader(_vm.currDate)))])]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-monthRange\"\n\t }, [_vm._l((_vm.text.months), function(m, index) {\n\t return [_vm._c('span', {\n\t class: {\n\t 'datepicker-dateRange-item-active':\n\t (_vm.text.months[_vm.parse(_vm.val).getMonth()] === m) &&\n\t _vm.currDate.getFullYear() === _vm.parse(_vm.val).getFullYear()\n\t },\n\t domProps: {\n\t \"textContent\": _vm._s(m.substr(0, 3))\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.monthSelect(index)\n\t }\n\t }\n\t })]\n\t })], 2)])])]), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.displayYearView),\n\t expression: \"displayYearView\"\n\t }],\n\t staticClass: \"datepicker-popup\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-inner\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-body\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-ctrl\"\n\t }, [_vm._c('span', {\n\t class: _vm.preBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextDecadeClick(0)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t class: _vm.nextBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextDecadeClick(1)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('p', [_vm._v(_vm._s(_vm.stringifyDecadeHeader(_vm.currDate)))])]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-monthRange decadeRange\"\n\t }, [_vm._l((_vm.decadeRange), function(decade) {\n\t return [_vm._c('span', {\n\t class: {\n\t 'datepicker-dateRange-item-active': _vm.parse(_vm.val).getFullYear() === decade.text\n\t },\n\t domProps: {\n\t \"textContent\": _vm._s(decade.text)\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t $event.stopPropagation();\n\t _vm.yearSelect(decade.text)\n\t }\n\t }\n\t })]\n\t })], 2)])])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-477b8e5d\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 105 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(106)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(107)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Dropdown.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-39be1072\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-39be1072\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Dropdown.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 106 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tvar _ClickOutside = __webpack_require__(66);\n\t\n\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t directives: {\n\t ClickOutside: _ClickOutside2.default\n\t },\n\t props: {\n\t disabled: { type: Boolean, default: false },\n\t size: { type: String, default: null },\n\t text: { type: String, default: null },\n\t type: { type: String, default: 'default' },\n\t value: { type: Boolean, default: false }\n\t },\n\t data: function data() {\n\t var show = this.value;\n\t return { show: show };\n\t },\n\t\n\t watch: {\n\t show: function show(val) {\n\t this.$emit('input', val);\n\t },\n\t value: function value(val) {\n\t this.show = val;\n\t }\n\t },\n\t computed: {\n\t buttonSize: function buttonSize() {\n\t return ~['lg', 'sm', 'xs'].indexOf(this.size) ? 'btn-' + this.size : '';\n\t },\n\t inInput: function inInput() {\n\t return this.$parent._input;\n\t },\n\t isLi: function isLi() {\n\t return this.$parent._isTabs || this.$parent._navbar || this.$parent.menu;\n\t },\n\t menu: function menu() {\n\t return !this.$parent || this.$parent.navbar;\n\t },\n\t slots: function slots() {\n\t return this._slotContents;\n\t },\n\t submenu: function submenu() {\n\t return this.$parent && (this.$parent.menu || this.$parent.submenu);\n\t }\n\t },\n\t methods: {\n\t blur: function blur() {\n\t this.show = false;\n\t },\n\t toggle: function toggle() {\n\t if (!this.disabled) {\n\t this.show = !this.show;\n\t }\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this = this;\n\t\n\t (0, _NodeList2.default)('ul', this.$el).on('click', 'li>a', function (e) {\n\t _this.show = false;\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t (0, _NodeList2.default)('ul', this.$el).off();\n\t }\n\t};\n\n/***/ },\n/* 107 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c(_vm.isLi ? 'li' : 'div', {\n\t directives: [{\n\t name: \"click-outside\",\n\t rawName: \"v-click-outside\",\n\t value: (_vm.blur),\n\t expression: \"blur\"\n\t }],\n\t tag: \"div\",\n\t class: [{\n\t open: _vm.show,\n\t disabled: _vm.disabled,\n\t dropdown: _vm.isLi,\n\t 'input-group-btn': _vm.inInput,\n\t 'btn-group': !_vm.isLi && !_vm.inInput\n\t }]\n\t }, [_vm._t(\"before\"), _vm._v(\" \"), (_vm.isLi) ? _vm._c('a', {\n\t class: ['dropdown-toggle', _vm.buttonSize, {\n\t disabled: _vm.disabled\n\t }],\n\t attrs: {\n\t \"role\": \"button\"\n\t },\n\t on: {\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.show = false\n\t },\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }\n\t }\n\t }, [_vm._t(\"button\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"caret\"\n\t })], 2) : _vm._c('button', {\n\t class: ['btn btn-' + _vm.type, _vm.buttonSize, 'dropdown-toggle'],\n\t attrs: {\n\t \"type\": \"button\",\n\t \"disabled\": _vm.disabled\n\t },\n\t on: {\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.show = false\n\t },\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }\n\t }\n\t }, [_vm._t(\"button\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"caret\"\n\t })], 2), _vm._v(\" \"), _vm._t(\"dropdown-menu\", [_vm._c('ul', {\n\t staticClass: \"dropdown-menu\"\n\t }, [_vm._t(\"default\")], 2)])], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-39be1072\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 108 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(109)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(110)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\FormGroup.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-79eb400a\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-79eb400a\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] FormGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 109 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// let coerce = {\n\t// enterSubmit: 'boolean',\n\t// icon: 'boolean'\n\t// }\n\t\n\texports.default = {\n\t props: {\n\t enterSubmit: {\n\t type: Boolean,\n\t default: false\n\t },\n\t icon: {\n\t type: Boolean,\n\t default: false\n\t },\n\t lang: {\n\t type: String,\n\t default: navigator.language\n\t }\n\t },\n\t data: function data() {\n\t return {\n\t children: [],\n\t valid: null,\n\t timeout: null\n\t };\n\t },\n\t\n\t watch: {\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (val !== old && this._parent) this._parent.validate();\n\t }\n\t },\n\t methods: {\n\t validate: function validate() {\n\t var valid = true;\n\t this.children.some(function (el) {\n\t var v = el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\n\t if (!v) valid = false;\n\t return !valid;\n\t });\n\t this.valid = valid;\n\t return valid === true;\n\t }\n\t },\n\t created: function created() {\n\t this._formGroup = true;\n\t var parent = this.$parent;\n\t while (parent && !parent._formGroup) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formGroup) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t },\n\t mounted: function mounted() {\n\t this.validate();\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t}; //\n\t//\n\n/***/ },\n/* 110 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-79eb400a\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 111 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(112)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(113)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\FormValidator.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-b9f57c46\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-b9f57c46\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] FormValidator.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 112 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t enterSubmit: { type: Boolean, default: false },\n\t icon: { type: Boolean, default: false },\n\t lang: { type: String, default: navigator.language },\n\t value: null\n\t },\n\t data: function data() {\n\t return {\n\t children: [],\n\t valid: null,\n\t timeout: null\n\t };\n\t },\n\t\n\t watch: {\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit('input', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (val !== old && this._parent) this._parent.validate();\n\t }\n\t },\n\t methods: {\n\t validate: function validate() {\n\t var invalid = !this.children.every(function (el) {\n\t return el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\n\t });\n\t this.valid = !invalid;\n\t return !invalid;\n\t }\n\t },\n\t created: function created() {\n\t this._formValidator = true;\n\t var parent = this.$parent;\n\t while (parent && !parent._formValidator) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formValidator) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t },\n\t mounted: function mounted() {\n\t this.validate();\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t}; //\n\t//\n\n/***/ },\n/* 113 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-b9f57c46\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 114 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(115)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(117)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(118)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Input.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-652ad7b9\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-652ad7b9\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-652ad7b9\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Input.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 115 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 117 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\tvar DELAY = 300;\n\t\n\texports.default = {\n\t props: {\n\t clearButton: { type: Boolean, default: false },\n\t cols: { type: Number, default: null },\n\t datalist: { type: Array, default: null },\n\t disabled: { type: Boolean, default: false },\n\t enterSubmit: { type: Boolean, default: false },\n\t error: { type: String, default: null },\n\t help: { type: String, default: null },\n\t hideHelp: { type: Boolean, default: true },\n\t icon: { type: Boolean, default: false },\n\t label: { type: String, default: null },\n\t lang: { type: String, default: navigator.language },\n\t mask: null,\n\t maskDelay: { type: Number, default: 100 },\n\t match: { type: String, default: null },\n\t max: { type: String, default: null },\n\t maxlength: { type: Number, default: null },\n\t min: { type: String, default: null },\n\t minlength: { type: Number, default: 0 },\n\t name: { type: String, default: null },\n\t pattern: { default: null },\n\t placeholder: { type: String, default: null },\n\t readonly: { type: Boolean, default: false },\n\t required: { type: Boolean, default: false },\n\t rows: { type: Number, default: 3 },\n\t step: { type: Number, default: null },\n\t type: { type: String, default: 'text' },\n\t url: { type: String, default: null },\n\t urlMap: { type: Function, default: null },\n\t validationDelay: { type: Number, default: 250 },\n\t value: { default: null }\n\t },\n\t data: function data() {\n\t var val = this.value;\n\t return {\n\t options: this.datalist,\n\t val: val,\n\t valid: null,\n\t timeout: null\n\t };\n\t },\n\t\n\t computed: {\n\t canValidate: function canValidate() {\n\t return !this.disabled && !this.readonly && (this.required || this.regex || this.nativeValidate || this.match !== null);\n\t },\n\t errorText: function errorText() {\n\t var value = this.value;\n\t var error = [this.error];\n\t if (!value && this.required) error.push('(' + this.text.required.toLowerCase() + ')');\n\t if (value && value.length < this.minlength) error.push('(' + this.text.minLength.toLowerCase() + ': ' + this.minlength + ')');\n\t return error.join(' ');\n\t },\n\t id_datalist: function id_datalist() {\n\t if (this.type !== 'textarea' && this.datalist instanceof Array) {\n\t if (!this._id_datalist) {\n\t if (!this.$root.id_datalist) {\n\t this.$root.id_datalist = 0;\n\t }\n\t this._id_datalist = 'input-datalist' + this.$root.id_datalist++;\n\t }\n\t return this._id_datalist;\n\t }\n\t return null;\n\t },\n\t input: function input() {\n\t return this.$refs.input;\n\t },\n\t nativeValidate: function nativeValidate() {\n\t return (this.input || {}).checkValidity && (~['url', 'email'].indexOf(this.type.toLowerCase()) || this.min || this.max);\n\t },\n\t regex: function regex() {\n\t return _utils.coerce.pattern(this.pattern);\n\t },\n\t showError: function showError() {\n\t return this.error && this.valid === false;\n\t },\n\t showHelp: function showHelp() {\n\t return this.help && (!this.showError || !this.hideHelp);\n\t },\n\t text: function text() {\n\t return (0, _utils.translations)(this.lang);\n\t },\n\t title: function title() {\n\t return this.errorText || this.help || '';\n\t }\n\t },\n\t watch: {\n\t datalist: function datalist(val, old) {\n\t if (val !== old && val instanceof Array) {\n\t this.options = val;\n\t }\n\t },\n\t match: function match(val) {\n\t this.eval();\n\t },\n\t options: function options(val, old) {\n\t if (val !== old) this.$emit('options', val);\n\t },\n\t url: function url(val) {\n\t this._url();\n\t },\n\t val: function val(_val, old) {\n\t var _this = this;\n\t\n\t this.$emit('input', _val);\n\t if (_val !== old) {\n\t if (this.mask instanceof Function) {\n\t _val = this.mask(_val || '');\n\t if (this.val !== _val) {\n\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\n\t this._timeout.mask = setTimeout(function () {\n\t _this.val = _val;\n\t }, isNaN(this.maskDelay) ? 0 : this.maskDelay);\n\t }\n\t }\n\t this.eval();\n\t }\n\t },\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (this._parent) this._parent.validate();\n\t },\n\t value: function value(val) {\n\t if (this.val !== val) {\n\t this.val = val;\n\t }\n\t }\n\t },\n\t methods: {\n\t attr: function attr(value) {\n\t return ~['', null, undefined].indexOf(value) || value instanceof Function ? null : value;\n\t },\n\t emit: function emit(e) {\n\t this.$emit(e.type, e.type == 'input' ? e.target.value : e);\n\t if (e.type === 'blur' && this.canValidate) {\n\t this.valid = this.validate();\n\t }\n\t },\n\t eval: function _eval() {\n\t var _this2 = this;\n\t\n\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\n\t if (!this.canValidate) {\n\t this.valid = true;\n\t } else {\n\t this._timeout.eval = setTimeout(function () {\n\t _this2.valid = _this2.validate();\n\t _this2._timeout.eval = null;\n\t }, this.validationDelay);\n\t }\n\t },\n\t focus: function focus() {\n\t this.input.focus();\n\t },\n\t submit: function submit() {\n\t if (this.$parent._formValidator) {\n\t return this.$parent.validate();\n\t }\n\t if (this.input.form) {\n\t var invalids = (0, _NodeList2.default)('.form-group.validate:not(.has-success)', this.input.form);\n\t if (invalids.length) {\n\t invalids.find('input,textarea,select')[0].focus();\n\t } else {\n\t this.input.form.submit();\n\t }\n\t }\n\t },\n\t validate: function validate() {\n\t if (!this.canValidate) {\n\t return true;\n\t }\n\t var value = (this.val || '').trim();\n\t if (!value) {\n\t return !this.required;\n\t }\n\t if (this.match !== null) {\n\t return this.match === value;\n\t }\n\t if (value.length < this.minlength) {\n\t return false;\n\t }\n\t if (this.nativeValidate && !this.input.checkValidity()) {\n\t return false;\n\t }\n\t if (this.regex) {\n\t if (!(this.regex instanceof Function ? this.regex(this.val) : this.regex.test(this.val))) {\n\t return false;\n\t }\n\t }\n\t return true;\n\t },\n\t reset: function reset() {\n\t this.value = '';\n\t this.valid = null;\n\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\n\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\n\t }\n\t },\n\t created: function created() {\n\t this._input = true;\n\t this._timeout = {};\n\t var parent = this.$parent;\n\t while (parent && !parent._formValidator) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formValidator) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t this._url = (0, _utils.delayer)(function () {\n\t var _this3 = this;\n\t\n\t if (!this.url || !this.$http || this._loading) {\n\t return;\n\t }\n\t this._loading = true;\n\t this.$http.get(this.url).then(function (response) {\n\t var data = response.data instanceof Array ? response.data : [];\n\t try {\n\t data = JSON.parse(data);\n\t } catch (e) {}\n\t if (_this3.urlMap) {\n\t data = data.map(_this3.urlMap);\n\t }\n\t _this3.options = data;\n\t _this3.loading = false;\n\t }, function (response) {\n\t _this3.loading = false;\n\t });\n\t }, DELAY);\n\t if (this.url) this._url();\n\t },\n\t mounted: function mounted() {\n\t // $(this.input).on('focus', e => { this.$emit('focus', e) }).on('blur', e => {\n\t // if (this.canValidate) { this.valid = this.validate() }\n\t // this.$emit('blur', e)\n\t // })\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t // $(this.input).off()\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 118 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"form-group\",\n\t class: {\n\t validate: _vm.canValidate, 'has-feedback': _vm.icon, 'has-error': _vm.canValidate && _vm.valid === false, 'has-success': _vm.canValidate && _vm.valid\n\t }\n\t }, [_vm._t(\"label\", [(_vm.label) ? _vm._c('label', {\n\t staticClass: \"control-label\",\n\t on: {\n\t \"click\": _vm.focus\n\t }\n\t }, [_vm._v(_vm._s(_vm.label))]) : _vm._e()]), _vm._v(\" \"), (_vm.$slots.before || _vm.$slots.after) ? _vm._c('div', {\n\t staticClass: \"input-group\"\n\t }, [_vm._t(\"before\"), _vm._v(\" \"), _vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t ref: \"input\",\n\t tag: \"textarea\",\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"cols\": _vm.cols,\n\t \"disabled\": _vm.disabled,\n\t \"list\": _vm.id_datalist,\n\t \"max\": _vm.attr(_vm.max),\n\t \"maxlength\": _vm.maxlength,\n\t \"min\": _vm.attr(_vm.min),\n\t \"name\": _vm.name,\n\t \"placeholder\": _vm.placeholder,\n\t \"readonly\": _vm.readonly,\n\t \"required\": _vm.required,\n\t \"rows\": _vm.rows,\n\t \"step\": _vm.step,\n\t \"title\": _vm.attr(_vm.title),\n\t \"type\": _vm.type == 'textarea' ? null : _vm.type\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.val)\n\t },\n\t on: {\n\t \"blur\": _vm.emit,\n\t \"focus\": _vm.emit,\n\t \"input\": [function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.val = $event.target.value\n\t }, _vm.emit],\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\n\t }\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.value) ? _vm._c('div', {\n\t class: {\n\t icon: _vm.icon\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": function($event) {\n\t _vm.value = ''\n\t }\n\t }\n\t }, [_vm._v(\"×\")])]) : _vm._e(), _vm._v(\" \"), (_vm.icon) ? _vm._c('div', {\n\t staticClass: \"icon\"\n\t }, [(_vm.icon && _vm.valid !== null) ? _vm._c('span', {\n\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t }) : _vm._e()]) : _vm._e(), _vm._v(\" \"), _vm._t(\"after\")], 2) : [_vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t ref: \"input\",\n\t tag: \"textarea\",\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"cols\": _vm.cols,\n\t \"disabled\": _vm.disabled,\n\t \"list\": _vm.id_datalist,\n\t \"max\": _vm.attr(_vm.max),\n\t \"maxlength\": _vm.maxlength,\n\t \"min\": _vm.attr(_vm.min),\n\t \"name\": _vm.name,\n\t \"placeholder\": _vm.placeholder,\n\t \"readonly\": _vm.readonly,\n\t \"required\": _vm.required,\n\t \"rows\": _vm.rows,\n\t \"step\": _vm.step,\n\t \"title\": _vm.attr(_vm.title),\n\t \"type\": _vm.type == 'textarea' ? null : _vm.type\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.val)\n\t },\n\t on: {\n\t \"blur\": _vm.emit,\n\t \"focus\": _vm.emit,\n\t \"input\": [function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.val = $event.target.value\n\t }, _vm.emit],\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\n\t }\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.val) ? _vm._c('span', {\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": function($event) {\n\t _vm.val = ''\n\t }\n\t }\n\t }, [_vm._v(\"×\")]) : _vm._e(), _vm._v(\" \"), (_vm.icon && _vm.valid !== null) ? _vm._c('span', {\n\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t }) : _vm._e()], _vm._v(\" \"), (_vm.id_datalist) ? _vm._c('datalist', {\n\t attrs: {\n\t \"id\": _vm.id_datalist\n\t }\n\t }, _vm._l((_vm.options), function(opc) {\n\t return _vm._c('option', {\n\t domProps: {\n\t \"value\": opc\n\t }\n\t })\n\t })) : _vm._e(), _vm._v(\" \"), (_vm.showHelp) ? _vm._c('div', {\n\t staticClass: \"help-block\",\n\t on: {\n\t \"click\": _vm.focus\n\t }\n\t }, [_vm._v(_vm._s(_vm.help))]) : _vm._e(), _vm._v(\" \"), (_vm.showError) ? _vm._c('div', {\n\t staticClass: \"help-block with-errors\",\n\t on: {\n\t \"click\": _vm.focus\n\t }\n\t }, [_vm._v(_vm._s(_vm.errorText))]) : _vm._e()], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-652ad7b9\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 119 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(120)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(122)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(127)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Modal.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-fe7d5dc8\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-fe7d5dc8\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Modal.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 120 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 122 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _isInteger = __webpack_require__(123);\n\t\n\tvar _isInteger2 = _interopRequireDefault(_isInteger);\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t backdrop: { type: Boolean, default: true },\n\t callback: { type: Function, default: null },\n\t cancelText: { type: String, default: 'Close' },\n\t effect: { type: String, default: null },\n\t large: { type: Boolean, default: false },\n\t okText: { type: String, default: 'Save changes' },\n\t small: { type: Boolean, default: false },\n\t title: { type: String, default: '' },\n\t value: { type: Boolean, required: true },\n\t width: { default: null }\n\t },\n\t data: function data() {\n\t return {\n\t transition: false,\n\t val: null\n\t };\n\t },\n\t\n\t computed: {\n\t optionalWidth: function optionalWidth() {\n\t if (this.width === null) {\n\t return null;\n\t } else if ((0, _isInteger2.default)(this.width)) {\n\t return this.width + 'px';\n\t }\n\t return this.width;\n\t }\n\t },\n\t watch: {\n\t transition: function transition(val, old) {\n\t if (val === old) {\n\t return;\n\t }\n\t var el = this.$el;\n\t var body = document.body;\n\t if (val) {\n\t //starting\n\t if (this.val) {\n\t el.querySelector('.modal-content').focus();\n\t el.style.display = 'block';\n\t setTimeout(function () {\n\t return el.classList.add('in');\n\t }, 0);\n\t body.classList.add('modal-open');\n\t if ((0, _utils.getScrollBarWidth)() !== 0) {\n\t body.style.paddingRight = (0, _utils.getScrollBarWidth)() + 'px';\n\t }\n\t } else {\n\t el.classList.remove('in');\n\t }\n\t } else {\n\t //ending\n\t this.$emit(this.val ? 'opened' : 'closed');\n\t if (!this.val) {\n\t el.style.display = 'none';\n\t body.style.paddingRight = null;\n\t body.classList.remove('modal-open');\n\t }\n\t }\n\t },\n\t val: function val(_val, old) {\n\t this.$emit('input', _val);\n\t if (old === null ? _val === true : _val !== old) this.transition = true;\n\t },\n\t value: function value(val, old) {\n\t if (val !== old) this.val = val;\n\t }\n\t },\n\t methods: {\n\t action: function action(val, p) {\n\t if (val === null) {\n\t return;\n\t }\n\t if (val && this.callback instanceof Function) this.callback();\n\t this.$emit(val ? 'ok' : 'cancel', p);\n\t this.val = val || false;\n\t }\n\t },\n\t mounted: function mounted() {\n\t this.val = this.value;\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 123 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(124), __esModule: true };\n\n/***/ },\n/* 124 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(125);\n\tmodule.exports = __webpack_require__(7).Number.isInteger;\n\n/***/ },\n/* 125 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.3 Number.isInteger(number)\n\tvar $export = __webpack_require__(5);\n\t\n\t$export($export.S, 'Number', {isInteger: __webpack_require__(126)});\n\n/***/ },\n/* 126 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.3 Number.isInteger(number)\n\tvar isObject = __webpack_require__(13)\n\t , floor = Math.floor;\n\tmodule.exports = function isInteger(it){\n\t return !isObject(it) && isFinite(it) && floor(it) === it;\n\t};\n\n/***/ },\n/* 127 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: ['modal', _vm.effect],\n\t attrs: {\n\t \"role\": \"dialog\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.backdrop && _vm.action(false, 1)\n\t },\n\t \"transitionend\": function($event) {\n\t _vm.transition = false\n\t }\n\t }\n\t }, [_vm._c('div', {\n\t class: ['modal-dialog', {\n\t 'modal-lg': _vm.large,\n\t 'modal-sm': _vm.small\n\t }],\n\t style: ({\n\t width: _vm.optionalWidth\n\t }),\n\t attrs: {\n\t \"role\": \"document\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t $event.stopPropagation();\n\t _vm.action(null)\n\t }\n\t }\n\t }, [_vm._c('div', {\n\t staticClass: \"modal-content\"\n\t }, [_vm._t(\"modal-header\", [_vm._c('div', {\n\t staticClass: \"modal-header\"\n\t }, [_vm._c('button', {\n\t staticClass: \"close\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.action(false, 2)\n\t }\n\t }\n\t }, [_vm._c('span', [_vm._v(\"×\")])]), _vm._v(\" \"), _vm._c('h4', {\n\t staticClass: \"modal-title\"\n\t }, [_vm._t(\"title\", [_vm._v(_vm._s(_vm.title))])], 2)])]), _vm._v(\" \"), _vm._t(\"modal-body\", [_vm._c('div', {\n\t staticClass: \"modal-body\"\n\t }, [_vm._t(\"default\")], 2)]), _vm._v(\" \"), _vm._t(\"modal-footer\", [_vm._c('div', {\n\t staticClass: \"modal-footer\"\n\t }, [_vm._c('button', {\n\t staticClass: \"btn btn-default\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.action(false, 3)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(_vm.cancelText))]), _vm._v(\" \"), _vm._c('button', {\n\t staticClass: \"btn btn-primary\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.action(true, 4)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(_vm.okText))])])])], 2)])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-fe7d5dc8\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 128 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(129)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(130)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Navbar.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-38f0619e\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-38f0619e\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Navbar.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 129 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t type: { type: String, default: 'default' },\n\t placement: { type: String, default: '' },\n\t container: { type: String, default: '' }\n\t },\n\t data: function data() {\n\t return {\n\t id: 'bs-example-navbar-collapse-1',\n\t collapsed: true,\n\t styles: {}\n\t };\n\t },\n\t\n\t computed: {\n\t slots: function slots() {\n\t return this._slotContents;\n\t }\n\t },\n\t methods: {\n\t toggleCollapse: function toggleCollapse(e) {\n\t e && e.preventDefault();\n\t this.collapsed = !this.collapsed;\n\t }\n\t },\n\t created: function created() {\n\t this._navbar = true;\n\t },\n\t mounted: function mounted() {\n\t var _this = this;\n\t\n\t try {\n\t (function () {\n\t var $dropdown = (0, _NodeList2.default)('.dropdown>[data-toggle=\"dropdown\"]', _this.$el).parent();\n\t if ($dropdown) {\n\t $dropdown.on('click', '.dropdown-toggle', function (e) {\n\t e.preventDefault();\n\t $dropdown.each(function (content) {\n\t if (content.contains(e.target)) content.classList.toggle('open');\n\t });\n\t }).on('click', '.dropdown-menu>li>a', function (e) {\n\t $dropdown.each(function (content) {\n\t if (content.contains(e.target)) content.classList.remove('open');\n\t });\n\t }).onBlur(function (e) {\n\t $dropdown.each(function (content) {\n\t if (!content.contains(e.target)) content.classList.remove('open');\n\t });\n\t });\n\t }\n\t })();\n\t } catch (ex) {\n\t console.log('error finding dropdown');\n\t }\n\t\n\t (0, _NodeList2.default)(this.$el).on('click touchstart', 'li:not(.dropdown)>a', function (e) {\n\t setTimeout(function () {\n\t _this.collapsed = true;\n\t }, 200);\n\t }).onBlur(function (e) {\n\t if (!_this.$el.contains(e.target)) {\n\t _this.collapsed = true;\n\t }\n\t });\n\t var height = this.$el.offsetHeight;\n\t if (this.placement === 'top') {\n\t document.body.style.paddingTop = height + 'px';\n\t }\n\t if (this.placement === 'bottom') {\n\t document.body.style.paddingBottom = height + 'px';\n\t }\n\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\"collapse\"]', this.$el).on('click', function (e) {\n\t return _this.toggleCollapse(e);\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t (0, _NodeList2.default)('.dropdown', this.$el).off('click').offBlur();\n\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\"collapse\"]', this.$el).off('click');\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 130 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('nav', {\n\t class: ['navbar', 'navbar-' + _vm.type, _vm.placement === 'static' ? 'navbar-static-top' : 'navbar-fixed-' + _vm.placement]\n\t }, [_vm._c('div', {\n\t class: _vm.container === 'fluid' ? 'container-fluid' : 'container'\n\t }, [_vm._c('div', {\n\t staticClass: \"navbar-header\"\n\t }, [(!_vm.$slots.collapse) ? _vm._c('button', {\n\t staticClass: \"navbar-toggle collapsed\",\n\t attrs: {\n\t \"type\": \"button\",\n\t \"aria-expanded\": \"false\"\n\t },\n\t on: {\n\t \"click\": _vm.toggleCollapse\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"sr-only\"\n\t }, [_vm._v(\"Toggle navigation\")]), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon-bar\"\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon-bar\"\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon-bar\"\n\t })]) : _vm._e(), _vm._v(\" \"), _vm._t(\"collapse\"), _vm._v(\" \"), _vm._t(\"brand\")], 2), _vm._v(\" \"), _vm._c('div', {\n\t class: ['navbar-collapse', {\n\t collapse: _vm.collapsed\n\t }]\n\t }, [_vm._c('ul', {\n\t staticClass: \"nav navbar-nav\"\n\t }, [_vm._t(\"default\")], 2), _vm._v(\" \"), (_vm.$slots.left) ? _vm._c('ul', {\n\t staticClass: \"nav navbar-nav navbar-left\"\n\t }, [_vm._t(\"left\")], 2) : _vm._e(), _vm._v(\" \"), (_vm.$slots.right) ? _vm._c('ul', {\n\t staticClass: \"nav navbar-nav navbar-right\"\n\t }, [_vm._t(\"right\")], 2) : _vm._e()])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-38f0619e\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 131 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(132)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(133)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Option.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-42088116\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-42088116\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Option.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 132 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t\n\texports.default = {\n\t props: { value: null },\n\t data: function data() {\n\t return { loading: true };\n\t },\n\t mounted: function mounted() {\n\t if (this.$parent._select) {\n\t if (!this.$parent.options) {\n\t this.$parent.options = [];\n\t }\n\t var el = {};\n\t el[this.$parent.optionsLabel] = this.$el.innerHTML;\n\t el[this.$parent.optionsValue] = this.value;\n\t this.$parent.options.push(el);\n\t this.loading = false;\n\t } else {\n\t console.warn('options only work inside a select component');\n\t }\n\t }\n\t};\n\n/***/ },\n/* 133 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return (_vm.loading) ? _vm._c('li', [_vm._t(\"default\")], 2) : _vm._e()\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-42088116\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 134 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(135)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(137)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(138)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Panel.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-b1e0461a\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-b1e0461a\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Panel.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 135 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 137 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t header: { type: String },\n\t isOpen: { type: Boolean, default: null },\n\t type: { type: String, default: null }\n\t },\n\t data: function data() {\n\t return {\n\t open: this.isOpen\n\t };\n\t },\n\t\n\t watch: {\n\t isOpen: function isOpen(val) {\n\t this.open = val;\n\t }\n\t },\n\t computed: {\n\t inAccordion: function inAccordion() {\n\t return this.$parent && this.$parent._isAccordion;\n\t },\n\t panelType: function panelType() {\n\t return 'panel-' + (this.type || this.$parent && this.$parent.type || 'default');\n\t }\n\t },\n\t methods: {\n\t toggle: function toggle() {\n\t this.open = !this.open;\n\t if (this.inAccordion) {\n\t this.$parent.openChild(this);\n\t }\n\t },\n\t enter: function enter(el) {\n\t el.style.height = 'auto';\n\t var endWidth = getComputedStyle(el).height;\n\t el.style.height = '0px';\n\t el.offsetHeight; // force repaint\n\t el.style.height = endWidth;\n\t },\n\t afterEnter: function afterEnter(el) {\n\t el.style.height = 'auto';\n\t },\n\t beforeLeave: function beforeLeave(el) {\n\t el.style.height = getComputedStyle(el).height;\n\t el.offsetHeight; // force repaint\n\t el.style.height = '0px';\n\t }\n\t },\n\t created: function created() {\n\t if (this.isOpen === null) {\n\t this.open = !this.inAccordion;\n\t }\n\t }\n\t};\n\n/***/ },\n/* 138 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: ['panel', _vm.panelType]\n\t }, [_vm._c('div', {\n\t class: ['panel-heading', {\n\t 'accordion-toggle': _vm.inAccordion\n\t }],\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.inAccordion && _vm.toggle()\n\t }\n\t }\n\t }, [_vm._t(\"header\", [_vm._c('h4', {\n\t staticClass: \"panel-title\"\n\t }, [_vm._v(_vm._s(_vm.header))])])], 2), _vm._v(\" \"), _vm._c('transition', {\n\t attrs: {\n\t \"name\": \"collapse\"\n\t },\n\t on: {\n\t \"enter\": _vm.enter,\n\t \"after-enter\": _vm.afterEnter,\n\t \"before-leave\": _vm.beforeLeave\n\t }\n\t }, [(_vm.open) ? _vm._c('div', {\n\t staticClass: \"panel-collapse\"\n\t }, [_vm._c('div', {\n\t staticClass: \"panel-body\"\n\t }, [_vm._t(\"default\")], 2)]) : _vm._e()])], 1)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-b1e0461a\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 139 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(140)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(142)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(144)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Popover.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-2465bf54\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-2465bf54\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Popover.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 140 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 142 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _popoverMixins = __webpack_require__(143);\n\t\n\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t mixins: [_popoverMixins2.default],\n\t props: {\n\t trigger: { type: String, default: 'click' }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 143 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t content: { type: String },\n\t effect: { type: String, default: 'fade' },\n\t header: { type: Boolean, default: true },\n\t placement: { type: String, default: 'top' },\n\t title: { type: String },\n\t trigger: { type: String }\n\t },\n\t data: function data() {\n\t return {\n\t top: 0,\n\t left: 0,\n\t show: false\n\t };\n\t },\n\t\n\t computed: {\n\t events: function events() {\n\t return { contextmenu: ['contextmenu'], hover: ['mouseleave', 'mouseenter'], focus: ['blur', 'focus'] }[this.trigger] || ['click'];\n\t }\n\t },\n\t methods: {\n\t beforeEnter: function beforeEnter() {\n\t var _this = this;\n\t\n\t this.position();\n\t setTimeout(function () {\n\t return _this.position();\n\t }, 30);\n\t },\n\t position: function position() {\n\t var _this2 = this;\n\t\n\t this.$nextTick(function () {\n\t var popover = _this2.$refs.popover;\n\t var trigger = _this2.$refs.trigger.children[0];\n\t switch (_this2.placement) {\n\t case 'top':\n\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\n\t _this2.top = trigger.offsetTop - popover.offsetHeight;\n\t break;\n\t case 'left':\n\t _this2.left = trigger.offsetLeft - popover.offsetWidth;\n\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\n\t break;\n\t case 'right':\n\t _this2.left = trigger.offsetLeft + trigger.offsetWidth;\n\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\n\t break;\n\t case 'bottom':\n\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\n\t _this2.top = trigger.offsetTop + trigger.offsetHeight;\n\t break;\n\t default:\n\t console.warn('Wrong placement prop');\n\t }\n\t popover.style.top = _this2.top + 'px';\n\t popover.style.left = _this2.left + 'px';\n\t });\n\t },\n\t toggle: function toggle(e) {\n\t if (e && this.trigger === 'contextmenu') e.preventDefault();\n\t this.show = !this.show;\n\t if (this.show) this.beforeEnter();\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this3 = this;\n\t\n\t var trigger = this.$refs.trigger.children[0];\n\t if (!trigger) return console.error('Could not find trigger v-el in your component that uses popoverMixin.');\n\t\n\t if (this.trigger === 'focus' && !~trigger.tabIndex) {\n\t trigger = (0, _NodeList2.default)('a,input,select,textarea,button', trigger);\n\t if (!trigger.length) {\n\t return;\n\t }\n\t }\n\t this.events.forEach(function (event) {\n\t (0, _NodeList2.default)(trigger).on(event, _this3.toggle);\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._trigger) (0, _NodeList2.default)(this._trigger).off();\n\t }\n\t};\n\n/***/ },\n/* 144 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', {\n\t ref: \"trigger\"\n\t }, [_vm._t(\"default\"), _vm._v(\" \"), _vm._c('transition', {\n\t attrs: {\n\t \"name\": _vm.effect\n\t }\n\t }, [(_vm.show) ? _vm._c('div', {\n\t ref: \"popover\",\n\t class: ['popover', _vm.placement]\n\t }, [_vm._c('div', {\n\t staticClass: \"arrow\"\n\t }), _vm._v(\" \"), (_vm.title) ? _vm._c('h3', {\n\t staticClass: \"popover-title\"\n\t }, [_vm._t(\"title\", [_vm._v(_vm._s(_vm.title))])], 2) : _vm._e(), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"popover-content\"\n\t }, [_vm._t(\"content\", [_vm._c('span', {\n\t domProps: {\n\t \"innerHTML\": _vm._s(_vm.content)\n\t }\n\t })])], 2)]) : _vm._e()])], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-2465bf54\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 145 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(146)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(147)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Progressbar.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-68aa3375\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-68aa3375\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Progressbar.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 146 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\texports.default = {\n\t props: {\n\t animated: { type: Boolean, default: false },\n\t label: { default: false },\n\t now: { required: true },\n\t striped: { type: Boolean, default: false },\n\t type: { type: String }\n\t },\n\t computed: {\n\t labelBool: function labelBool() {\n\t return _utils.coerce.boolean(this.label);\n\t },\n\t nowNum: function nowNum() {\n\t return _utils.coerce.number(this.now);\n\t }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 147 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: ['progress-bar', 'progress-bar-' + _vm.type, {\n\t active: _vm.animated,\n\t 'progress-bar-striped': _vm.striped\n\t }],\n\t style: ({\n\t width: _vm.nowNum + '%'\n\t }),\n\t domProps: {\n\t \"textContent\": _vm._s(_vm.labelBool ? _vm.nowNum + '%' : null)\n\t }\n\t })\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-68aa3375\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 148 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(149)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(151)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(152)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Radio.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-74cfd92c\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-74cfd92c\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Radio.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 149 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 151 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t button: { type: Boolean, default: false },\n\t disabled: { type: Boolean, default: false },\n\t name: { type: String, default: null },\n\t readonly: { type: Boolean, default: false },\n\t selectedValue: { default: true },\n\t type: { type: String, default: null },\n\t value: { default: false }\n\t },\n\t data: function data() {\n\t return {\n\t check: this.value\n\t };\n\t },\n\t\n\t computed: {\n\t active: function active() {\n\t return this.check === this.selectedValue;\n\t },\n\t inGroup: function inGroup() {\n\t return this.$parent && this.$parent.btnGroup && !this.$parent._checkboxGroup;\n\t },\n\t parentValue: function parentValue() {\n\t return this.$parent.val;\n\t },\n\t buttonStyle: function buttonStyle() {\n\t return this.button || this.$parent && this.$parent.btnGroup && this.$parent.buttons;\n\t },\n\t typeColor: function typeColor() {\n\t return this.type || this.$parent && this.$parent.type || 'default';\n\t }\n\t },\n\t watch: {\n\t check: function check(val) {\n\t if (this.selectedValue === val) {\n\t this.$emit('input', val);\n\t this.$emit('checked', true);\n\t this.updateParent();\n\t }\n\t },\n\t parentValue: function parentValue(val) {\n\t this.updateFromParent();\n\t },\n\t value: function value(val) {\n\t if (this.selectedValue == val) {\n\t this.check = val;\n\t } else {\n\t this.check = false;\n\t }\n\t }\n\t },\n\t created: function created() {\n\t if (this.inGroup) {\n\t var parent = this.$parent;\n\t parent._radioGroup = true;\n\t this.updateFromParent();\n\t }\n\t },\n\t\n\t methods: {\n\t updateFromParent: function updateFromParent() {\n\t if (this.inGroup) {\n\t if (this.selectedValue == this.$parent.val) {\n\t this.check = this.selectedValue;\n\t } else {\n\t this.check = false;\n\t }\n\t }\n\t },\n\t updateParent: function updateParent() {\n\t if (this.inGroup) {\n\t if (this.selectedValue === this.check) {\n\t this.$parent.val = this.selectedValue;\n\t }\n\t }\n\t },\n\t focus: function focus() {\n\t this.$refs.input.focus();\n\t },\n\t toggle: function toggle() {\n\t if (this.disabled) {\n\t return;\n\t }\n\t this.focus();\n\t if (this.readonly) {\n\t return;\n\t }\n\t this.check = this.selectedValue;\n\t }\n\t }\n\t};\n\n/***/ },\n/* 152 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c(_vm.buttonStyle ? 'label' : 'div', {\n\t tag: \"div\",\n\t class: [(_vm.buttonStyle ? 'btn btn-' + _vm.typeColor : 'radio ' + _vm.typeColor), {\n\t active: _vm.active,\n\t disabled: _vm.disabled,\n\t readonly: _vm.readonly\n\t }],\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }\n\t }\n\t }, [(_vm.buttonStyle) ? [_vm._c('input', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (!_vm.readonly),\n\t expression: \"!readonly\"\n\t }, {\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.check),\n\t expression: \"check\"\n\t }],\n\t ref: \"input\",\n\t attrs: {\n\t \"type\": \"radio\",\n\t \"autocomplete\": \"off\",\n\t \"name\": _vm.name,\n\t \"readonly\": _vm.readonly,\n\t \"disabled\": _vm.disabled\n\t },\n\t domProps: {\n\t \"value\": _vm.selectedValue,\n\t \"checked\": _vm._q(_vm.check, _vm.selectedValue)\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.check = _vm.selectedValue\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._t(\"default\")] : _vm._c('label', {\n\t staticClass: \"open\"\n\t }, [_vm._c('input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.check),\n\t expression: \"check\"\n\t }],\n\t ref: \"input\",\n\t attrs: {\n\t \"type\": \"radio\",\n\t \"autocomplete\": \"off\",\n\t \"name\": _vm.name,\n\t \"readonly\": _vm.readonly,\n\t \"disabled\": _vm.disabled\n\t },\n\t domProps: {\n\t \"value\": _vm.selectedValue,\n\t \"checked\": _vm._q(_vm.check, _vm.selectedValue)\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.check = _vm.selectedValue\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon dropdown-toggle\",\n\t class: [_vm.active ? 'btn-' + _vm.typeColor : '', {\n\t bg: _vm.typeColor === 'default'\n\t }]\n\t }), _vm._v(\" \"), (_vm.active && _vm.typeColor === 'default') ? _vm._c('span', {\n\t staticClass: \"icon\"\n\t }) : _vm._e(), _vm._v(\" \"), _vm._t(\"default\")], 2)], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-74cfd92c\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 153 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(154)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(156)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(157)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Select.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-e514dbc6\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-e514dbc6\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-e514dbc6\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Select.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 154 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 156 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _ClickOutside = __webpack_require__(66);\n\t\n\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\tvar timeout = {};\n\texports.default = {\n\t directives: {\n\t ClickOutside: _ClickOutside2.default\n\t },\n\t props: {\n\t clearButton: { type: Boolean, default: false },\n\t closeOnSelect: { type: Boolean, default: false },\n\t disabled: { type: Boolean, default: false },\n\t lang: { type: String, default: navigator.language },\n\t limit: { type: Number, default: 1024 },\n\t minSearch: { type: Number, default: 0 },\n\t multiple: { type: Boolean, default: false },\n\t name: { type: String, default: null },\n\t options: { type: Array, default: function _default() {\n\t return [];\n\t }\n\t },\n\t optionsLabel: { type: String, default: 'label' },\n\t optionsValue: { type: String, default: 'value' },\n\t parent: { default: true },\n\t placeholder: { type: String, default: null },\n\t readonly: { type: Boolean, default: null },\n\t required: { type: Boolean, default: null },\n\t search: { type: Boolean, default: false },\n\t searchText: { type: String, default: null },\n\t countText: { type: String, default: null },\n\t showCount: { type: Boolean, default: false },\n\t url: { type: String, default: null },\n\t value: null\n\t },\n\t data: function data() {\n\t return {\n\t list: [],\n\t loading: null,\n\t searchValue: null,\n\t show: false,\n\t notify: false,\n\t val: null,\n\t valid: null\n\t };\n\t },\n\t\n\t computed: {\n\t canSearch: function canSearch() {\n\t return this.minSearch ? this.list.length >= this.minSearch : this.search;\n\t },\n\t classes: function classes() {\n\t return [{ open: this.show, disabled: this.disabled }, this.class, this.isLi ? 'dropdown' : this.inInput ? 'input-group-btn' : 'btn-group'];\n\t },\n\t filteredOptions: function filteredOptions() {\n\t var _this = this;\n\t\n\t var search = (this.searchValue || '').toLowerCase();\n\t return !search ? this.list : this.list.filter(function (el) {\n\t return ~el[_this.optionsLabel].toLowerCase().search(search);\n\t });\n\t },\n\t hasParent: function hasParent() {\n\t return this.parent instanceof Array ? this.parent.length : this.parent;\n\t },\n\t inInput: function inInput() {\n\t return this.$parent._input;\n\t },\n\t isLi: function isLi() {\n\t return this.$parent._navbar || this.$parent.menu || this.$parent._tabset;\n\t },\n\t limitText: function limitText() {\n\t return this.text.limit.replace('{{limit}}', this.limit);\n\t },\n\t selected: function selected() {\n\t var _this2 = this;\n\t\n\t if (this.list.length === 0) {\n\t return '';\n\t }\n\t var sel = this.values.map(function (val) {\n\t return (_this2.list.find(function (o) {\n\t return o[_this2.optionsValue] === val;\n\t }) || {})[_this2.optionsLabel];\n\t }).filter(function (val) {\n\t return val !== undefined;\n\t });\n\t this.$emit('selected', sel);\n\t return sel.join(', ');\n\t },\n\t selectedText: function selectedText() {\n\t return this.countText || this.text.selected.replace('{{count}}', this.values.length);\n\t },\n\t showPlaceholder: function showPlaceholder() {\n\t return this.values.length === 0 || !this.hasParent ? this.placeholder || this.text.notSelected : null;\n\t },\n\t text: function text() {\n\t return (0, _utils.translations)(this.lang);\n\t },\n\t values: function values() {\n\t return this.val instanceof Array ? this.val : ~[null, undefined].indexOf(this.val) ? [] : [this.val];\n\t },\n\t valOptions: function valOptions() {\n\t var _this3 = this;\n\t\n\t return this.list.map(function (el) {\n\t return el[_this3.optionsValue];\n\t });\n\t }\n\t },\n\t watch: {\n\t options: function options(_options) {\n\t if (_options instanceof Array) this.setOptions(_options);\n\t },\n\t show: function show(val) {\n\t if (val) {\n\t this.$refs.search ? this.$refs.search.focus() : this.$refs.btn.focus();\n\t // onBlur(this.$refs.select, e => { this.show = false })\n\t } else {\n\t // offBlur(this.$refs.select)\n\t }\n\t },\n\t url: function url() {\n\t this.urlChanged();\n\t },\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (val !== old && this._parent) this._parent.validate();\n\t },\n\t value: function value(val, old) {\n\t if (val !== old) {\n\t this.val = val;\n\t }\n\t },\n\t val: function val(_val, old) {\n\t var _this4 = this;\n\t\n\t if (_val === undefined) {\n\t this.val = _val = null;\n\t }\n\t if (_val !== old) {\n\t this.$emit('change', _val);\n\t this.$emit('input', _val);\n\t }\n\t if (_val instanceof Array && _val.length > this.limit) {\n\t this.val = _val.slice(0, this.limit);\n\t this.notify = true;\n\t if (timeout.limit) clearTimeout(timeout.limit);\n\t timeout.limit = setTimeout(function () {\n\t timeout.limit = false;\n\t _this4.notify = false;\n\t }, 1500);\n\t }\n\t this.valid = this.validate();\n\t }\n\t },\n\t methods: {\n\t close: function close() {\n\t this.show = false;\n\t },\n\t checkData: function checkData() {\n\t if (this.multiple) {\n\t if (this.limit < 1) {\n\t this.limit = 1;\n\t }\n\t if (!(this.val instanceof Array)) {\n\t this.val = this.val === null || this.val === undefined ? [] : [this.val];\n\t }\n\t var values = this.valOptions;\n\t this.val = this.val.filter(function (el) {\n\t return ~values.indexOf(el);\n\t });\n\t if (this.values.length > this.limit) {\n\t this.val = this.val.slice(0, this.limit);\n\t }\n\t } else {\n\t if (!~this.valOptions.indexOf(this.val)) {\n\t this.val = null;\n\t }\n\t }\n\t },\n\t clear: function clear() {\n\t if (this.disabled || this.readonly) {\n\t return;\n\t }\n\t this.val = this.val instanceof Array ? [] : null;\n\t this.toggle();\n\t },\n\t clearSearch: function clearSearch() {\n\t this.searchValue = '';\n\t this.$refs.search.focus();\n\t },\n\t isSelected: function isSelected(v) {\n\t return this.values.indexOf(v) > -1;\n\t },\n\t select: function select(v) {\n\t if (this.val instanceof Array) {\n\t var newVal = this.val.slice(0);\n\t if (~newVal.indexOf(v)) {\n\t newVal.splice(newVal.indexOf(v), 1);\n\t } else {\n\t newVal.push(v);\n\t }\n\t this.val = newVal;\n\t if (this.closeOnSelect) {\n\t this.toggle();\n\t }\n\t } else {\n\t this.val = v;\n\t this.toggle();\n\t }\n\t },\n\t setOptions: function setOptions(options) {\n\t var _this5 = this;\n\t\n\t this.list = options.map(function (el) {\n\t if (el instanceof Object) {\n\t return el;\n\t }\n\t var obj = {};\n\t obj[_this5.optionsLabel] = el;\n\t obj[_this5.optionsValue] = el;\n\t return obj;\n\t });\n\t this.$emit('options', this.list);\n\t },\n\t toggle: function toggle() {\n\t if (this.disabled && !this.show) return;\n\t this.show = !this.show;\n\t if (!this.show) this.$refs.btn.focus();\n\t },\n\t urlChanged: function urlChanged() {\n\t var _this6 = this;\n\t\n\t if (!this.url || !this.$http) {\n\t return;\n\t }\n\t this.loading = true;\n\t this.$http.get(this.url).then(function (response) {\n\t var data = response.data instanceof Array ? response.data : [];\n\t try {\n\t data = JSON.parse(data);\n\t } catch (e) {}\n\t _this6.setOptions(data);\n\t _this6.loading = false;\n\t _this6.checkData();\n\t }, function (response) {\n\t _this6.loading = false;\n\t });\n\t },\n\t validate: function validate() {\n\t return !this.required ? true : this.val instanceof Array ? this.val.length > 0 : this.val !== null;\n\t }\n\t },\n\t created: function created() {\n\t this.setOptions(this.options);\n\t this.val = this.value;\n\t this._select = true;\n\t if (this.val === undefined || !this.parent) {\n\t this.val = null;\n\t }\n\t if (!this.multiple && this.val instanceof Array) {\n\t this.val = this.val[0];\n\t }\n\t this.checkData();\n\t if (this.url) this.urlChanged();\n\t var parent = this.$parent;\n\t while (parent && !parent._formValidator) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formValidator) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t },\n\t mounted: function mounted() {\n\t if (this._parent) this._parent.children.push(this);\n\t this.setOptions(this.options);\n\t this.val = this.value;\n\t this.checkData();\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 157 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t directives: [{\n\t name: \"click-outside\",\n\t rawName: \"v-click-outside\",\n\t value: (_vm.close),\n\t expression: \"close\"\n\t }],\n\t ref: \"select\",\n\t class: _vm.classes\n\t }, [_vm._c('div', {\n\t ref: \"btn\",\n\t staticClass: \"form-control dropdown-toggle\",\n\t attrs: {\n\t \"tabindex\": \"1\",\n\t \"disabled\": _vm.disabled || !_vm.hasParent,\n\t \"readonly\": _vm.readonly\n\t },\n\t on: {\n\t \"blur\": function($event) {\n\t _vm.canSearch ? null : _vm.close()\n\t },\n\t \"click\": function($event) {\n\t _vm.toggle()\n\t },\n\t \"keydown\": [function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t $event.stopPropagation();\n\t $event.preventDefault();\n\t _vm.close($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"space\", 32)) { return; }\n\t $event.stopPropagation();\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t $event.stopPropagation();\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }]\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"btn-content\",\n\t domProps: {\n\t \"innerHTML\": _vm._s(_vm.loading ? _vm.text.loading : _vm.showPlaceholder || (_vm.multiple && _vm.showCount ? _vm.selectedText : _vm.selected))\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.values.length) ? _vm._c('span', {\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": function($event) {\n\t _vm.clear()\n\t }\n\t }\n\t }, [_vm._v(\"×\")]) : _vm._e()]), _vm._v(\" \"), _vm._c('select', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t ref: \"sel\",\n\t staticClass: \"secret\",\n\t attrs: {\n\t \"name\": _vm.name,\n\t \"multiple\": _vm.multiple,\n\t \"required\": _vm.required,\n\t \"readonly\": _vm.readonly,\n\t \"disabled\": _vm.disabled\n\t },\n\t on: {\n\t \"change\": function($event) {\n\t _vm.val = Array.prototype.filter.call($event.target.options, function(o) {\n\t return o.selected\n\t }).map(function(o) {\n\t var val = \"_value\" in o ? o._value : o.value;\n\t return val\n\t })[0]\n\t }\n\t }\n\t }, [(_vm.required) ? _vm._c('option', {\n\t attrs: {\n\t \"value\": \"\"\n\t }\n\t }) : _vm._e(), _vm._v(\" \"), _vm._l((_vm.list), function(option) {\n\t return _vm._c('option', {\n\t domProps: {\n\t \"value\": option[_vm.optionsValue]\n\t }\n\t }, [_vm._v(_vm._s(option[_vm.optionsLabel]))])\n\t })], 2), _vm._v(\" \"), _vm._c('ul', {\n\t staticClass: \"dropdown-menu\"\n\t }, [(_vm.list.length) ? [(_vm.canSearch) ? _vm._c('li', {\n\t staticClass: \"bs-searchbox\"\n\t }, [_vm._c('input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.searchValue),\n\t expression: \"searchValue\"\n\t }],\n\t ref: \"search\",\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"type\": \"text\",\n\t \"placeholder\": _vm.searchText || _vm.text.search,\n\t \"autocomplete\": \"off\"\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.searchValue)\n\t },\n\t on: {\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.close($event)\n\t },\n\t \"input\": function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.searchValue = $event.target.value\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.searchValue),\n\t expression: \"searchValue\"\n\t }],\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": _vm.clearSearch\n\t }\n\t }, [_vm._v(\"×\")])]) : _vm._e(), _vm._v(\" \"), (_vm.required && !_vm.clearButton) ? _vm._c('li', [_vm._c('a', {\n\t on: {\n\t \"mousedown\": function($event) {\n\t $event.preventDefault();\n\t _vm.clear() && _vm.close()\n\t }\n\t }\n\t }, [_vm._v(_vm._s(_vm.placeholder || _vm.text.notSelected))])]) : _vm._e(), _vm._v(\" \"), _vm._l((_vm.filteredOptions), function(option) {\n\t return _vm._c('li', {\n\t attrs: {\n\t \"id\": option[_vm.optionsValue]\n\t }\n\t }, [_vm._c('a', {\n\t on: {\n\t \"mousedown\": function($event) {\n\t $event.preventDefault();\n\t _vm.select(option[_vm.optionsValue])\n\t }\n\t }\n\t }, [_vm._c('span', {\n\t domProps: {\n\t \"innerHTML\": _vm._s(option[_vm.optionsLabel])\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.isSelected(option[_vm.optionsValue])),\n\t expression: \"isSelected(option[optionsValue])\"\n\t }],\n\t staticClass: \"glyphicon glyphicon-ok check-mark\"\n\t })])])\n\t })] : _vm._e(), _vm._v(\" \"), _vm._t(\"default\"), _vm._v(\" \"), (_vm.notify && !_vm.closeOnSelect) ? _vm._c('transition', {\n\t attrs: {\n\t \"name\": \"fadein\"\n\t }\n\t }, [_vm._c('div', {\n\t staticClass: \"notify in\"\n\t }, [_vm._v(_vm._s(_vm.limitText))])]) : _vm._e()], 2), _vm._v(\" \"), (_vm.notify && _vm.closeOnSelect) ? _vm._c('transition', {\n\t attrs: {\n\t \"name\": \"fadein\"\n\t }\n\t }, [_vm._c('div', {\n\t staticClass: \"notify out\"\n\t }, [_vm._c('div', [_vm._v(_vm._s(_vm.limitText))])])]) : _vm._e()], 1)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-e514dbc6\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 158 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(159)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(160)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Slider.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-32185b82\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-32185b82\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Slider.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 159 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t\n\texports.default = {\n\t computed: {\n\t index: function index() {\n\t return this.$parent.$children.indexOf(this);\n\t },\n\t show: function show() {\n\t return this.$parent.index === this.index;\n\t }\n\t },\n\t mounted: function mounted() {\n\t if (this.$parent.indicator_list) {\n\t this.$parent.indicator_list.push(this.index);\n\t }\n\t\n\t if (this.index === 0) {\n\t this.$el.classList.add('active');\n\t }\n\t }\n\t};\n\n/***/ },\n/* 160 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"item\"\n\t }, [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-32185b82\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 161 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(162)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(164)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(165)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Spinner.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-8b298e70\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-8b298e70\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Spinner.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 162 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 164 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar MIN_WAIT = 500; // in ms\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t fixed: { type: Boolean, default: false },\n\t global: { type: Boolean, default: false },\n\t size: { type: String, default: 'md' },\n\t text: { type: String, default: '' },\n\t value: { default: false }\n\t },\n\t data: function data() {\n\t return {\n\t active: this.value,\n\t locked: false\n\t };\n\t },\n\t\n\t computed: {\n\t spinnerSize: function spinnerSize() {\n\t return 'spinner-' + (this.size ? this.size : 'sm');\n\t }\n\t },\n\t watch: {\n\t active: function active(val, old) {\n\t if (val !== old) this.$emit('input', val);\n\t },\n\t value: function value(val, old) {\n\t if (val !== old) {\n\t this[val ? 'show' : 'hide']();\n\t }\n\t }\n\t },\n\t methods: {\n\t hide: function hide() {\n\t var delay = 0;\n\t this.active = false;\n\t },\n\t show: function show(options) {\n\t if (options) {\n\t if (options.text) {\n\t this.text = options.text;\n\t }\n\t if (options.size) {\n\t this.size = options.size;\n\t }\n\t if (options.fixed) {\n\t this.fixed = options.fixed;\n\t }\n\t }\n\t // block scrolling when spinner is on\n\t this._body.style.overflowY = 'hidden';\n\t // activate spinner\n\t this._started = new Date();\n\t this.active = true;\n\t this.locked = true;\n\t this._unlock();\n\t }\n\t },\n\t created: function created() {\n\t this._body = document.body;\n\t this._bodyOverflow = document.body.style.overflowY;\n\t this._unlock = (0, _utils.delayer)(function () {\n\t this.locked = false;\n\t this._body.style.overflowY = this._bodyOverflow;\n\t }, MIN_WAIT);\n\t if (this.global) {\n\t if (!this.$root._globalSpinner) {\n\t this.$root._globalSpinner = true;\n\t var self = this;\n\t this._global = {\n\t hide: function hide() {\n\t self.hide();\n\t },\n\t show: function show() {\n\t self.show();\n\t }\n\t };\n\t this.$root.$on('spinner::show', this._global.show);\n\t this.$root.$on('spinner::hide', this._global.hide);\n\t }\n\t }\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._global) {\n\t this.$root.$off('spinner::show', this._global.show);\n\t this.$root.$off('spinner::hide', this._global.hide);\n\t delete this.$root._globalSpinner;\n\t }\n\t clearTimeout(this._spinnerAnimation);\n\t this._body.style.overflowY = this._bodyOverflow;\n\t }\n\t};\n\n/***/ },\n/* 165 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.active || _vm.locked),\n\t expression: \"active||locked\"\n\t }],\n\t class: ['spinner spinner-gritcode', _vm.spinnerSize, {\n\t 'spinner-fixed': _vm.fixed\n\t }]\n\t }, [_vm._c('div', {\n\t staticClass: \"spinner-wrapper\"\n\t }, [_vm._c('div', {\n\t staticClass: \"spinner-circle\"\n\t }), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"spinner-text\"\n\t }, [_vm._v(_vm._s(_vm.text))])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-8b298e70\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 166 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(167)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(168)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Tab.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-0985e878\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-0985e878\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Tab.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 167 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t disabled: { type: Boolean, default: false },\n\t header: { type: String }\n\t },\n\t data: function data() {\n\t return {\n\t fadein: false\n\t };\n\t },\n\t\n\t computed: {\n\t active: function active() {\n\t var _this = this;\n\t\n\t var active = !this._tabs || this._tabs.show === this;\n\t this.fadein = false;\n\t if (active) {\n\t setTimeout(function () {\n\t _this.fadein = true;\n\t }, 0);\n\t }\n\t return active;\n\t },\n\t index: function index() {\n\t return this._tabs.tabs.indexOf(this);\n\t },\n\t transition: function transition() {\n\t return this._tabs ? this._tabs.effect : null;\n\t }\n\t },\n\t created: function created() {\n\t this._isTab = true;\n\t var tabs = this;\n\t while (!this._tabs && tabs.$parent) {\n\t if (tabs._isTabGroup) {\n\t tabs.tabs.push(this);\n\t this._tabGroup = tabs;\n\t }\n\t if (tabs._isTabs) {\n\t tabs.tabs.push(this);\n\t this._tabs = tabs;\n\t if (!this._tabGroup) tabs.headers.push(this);\n\t }\n\t tabs = tabs.$parent;\n\t }\n\t if (!this._tabs) throw Error('tab depend on tabs.');\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t var _this2 = this;\n\t\n\t if (this._tabGroup) {\n\t this._tabGroup.tabs = this._tabGroup.tabs.filter(function (el) {\n\t return el !== _this2;\n\t });\n\t }\n\t if (this._tabs) {\n\t this._tabs.tabs = this._tabs.tabs.filter(function (el) {\n\t return el !== _this2;\n\t });\n\t }\n\t if (this._tabs) {\n\t if (this._tabs.active === this.index) {\n\t this._tabs.index = 0;\n\t }\n\t if (this._ingroup) {\n\t var id = this.$parent.tabs.indexOf(this);\n\t if (~id) this.$parent.tabs.splice(id, 1);\n\t }\n\t }\n\t if (this._tabs) {\n\t var _id = this._tabs.tabs.indexOf(this);\n\t if (~_id) this._tabs.tabs.splice(_id, 1);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 168 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t ref: \"panel\",\n\t class: ['tab-pane', {\n\t 'active fade': _vm.active,\n\t 'in': _vm.fadein\n\t }],\n\t attrs: {\n\t \"role\": \"tabpanel\"\n\t }\n\t }, [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-0985e878\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 169 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(170)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(172)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(173)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\TabGroup.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-55faf3cb\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-55faf3cb\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] TabGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 170 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 172 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t disabled: { type: Boolean, default: false },\n\t header: { type: String }\n\t },\n\t data: function data() {\n\t return {\n\t show: false,\n\t tabs: []\n\t };\n\t },\n\t\n\t computed: {\n\t active: function active() {\n\t return ~this.tabs.indexOf(this._tabs.show);\n\t }\n\t },\n\t methods: {\n\t blur: function blur() {\n\t this.show = false;\n\t },\n\t toggle: function toggle() {\n\t this.show = !this.show;\n\t }\n\t },\n\t created: function created() {\n\t this._isTabGroup = true;\n\t if (this.$parent) {\n\t if (this.$parent._isTabGroup) throw Error('Can\\'t nest tab-groups.');\n\t if (!this.$parent._isTabs) throw Error('tab-group depend on tabs.');\n\t }\n\t this._tabs = this.$parent;\n\t this._tabs.headers.push(this);\n\t }\n\t};\n\n/***/ },\n/* 173 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-55faf3cb\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 174 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(175)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(177)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(178)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Tabs.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-70100ddf\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-70100ddf\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Tabs.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 175 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 177 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _Dropdown = __webpack_require__(105);\n\t\n\tvar _Dropdown2 = _interopRequireDefault(_Dropdown);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t components: {\n\t dropdown: _Dropdown2.default\n\t },\n\t props: {\n\t // effect: {type: String, default: 'fadein'},\n\t justified: false,\n\t navStyle: { type: String, default: null },\n\t value: { type: Number, default: 0 }\n\t },\n\t data: function data() {\n\t var index = this.value || 0;\n\t return {\n\t index: index,\n\t headers: [],\n\t tabs: []\n\t };\n\t },\n\t\n\t watch: {\n\t index: function index(val) {\n\t this.$emit('active', val);\n\t this.$emit('input', val);\n\t },\n\t value: function value(val) {\n\t this.index = val;\n\t }\n\t },\n\t computed: {\n\t navStyleClass: function navStyleClass() {\n\t return ['nav', ~['pills', 'stacked'].indexOf(this.navStyle) ? 'nav-' + this.navStyle : 'nav-tabs', {\n\t 'nav-justified': _utils.coerce.boolean(this.justified),\n\t 'nav-pills': this.navStyle === 'stacked'\n\t }];\n\t },\n\t show: function show() {\n\t return this.tabs[this.index] || this.tabs[0];\n\t }\n\t },\n\t methods: {\n\t select: function select(tab) {\n\t if (!tab.disabled) {\n\t this.index = this.tabs.indexOf(tab);\n\t }\n\t }\n\t },\n\t created: function created() {\n\t this._isTabs = true;\n\t }\n\t};\n\n/***/ },\n/* 178 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t attrs: {\n\t \"tabs\": \"\"\n\t }\n\t }, [_vm._c('ul', {\n\t class: _vm.navStyleClass,\n\t attrs: {\n\t \"role\": \"tablist\"\n\t }\n\t }, [_vm._l((_vm.headers), function(header) {\n\t return [(header._isTab) ? _vm._c('li', {\n\t class: {\n\t active: header.active, disabled: header.disabled\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.select(header)\n\t }\n\t }\n\t }, [_vm._t(\"header\", [_vm._c('a', {\n\t attrs: {\n\t \"href\": \"#\"\n\t },\n\t domProps: {\n\t \"innerHTML\": _vm._s(header.header)\n\t }\n\t })])], 2) : _vm._e(), _vm._v(\" \"), (header._isTabGroup) ? _vm._c('dropdown', {\n\t class: {\n\t active: header.active\n\t },\n\t attrs: {\n\t \"text\": header.header,\n\t \"disabled\": header.disabled\n\t }\n\t }, _vm._l((header.tabs), function(tab) {\n\t return _vm._c('li', {\n\t class: {\n\t disabled: tab.disabled\n\t }\n\t }, [_vm._c('a', {\n\t attrs: {\n\t \"href\": \"#\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.select(tab)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(tab.header))])])\n\t })) : _vm._e()]\n\t })], 2), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"tab-content\"\n\t }, [_vm._t(\"default\")], 2)])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-70100ddf\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 179 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(180)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(181)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\ToggleButton.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-f034a5f2\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-f034a5f2\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] ToggleButton.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 180 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\texports.default = {\n\t props: {\n\t disabled: { default: null },\n\t falseType: { default: null },\n\t name: null,\n\t readonly: { default: null },\n\t trueType: { default: 'primary' },\n\t value: false\n\t },\n\t data: function data() {\n\t return {\n\t active: _utils.coerce.boolean(this.value),\n\t types: {\n\t danger: 'btn-danger',\n\t info: 'btn-info',\n\t primary: 'btn-primary',\n\t success: 'btn-success',\n\t warning: 'btn-warning'\n\t }\n\t };\n\t },\n\t\n\t watch: {\n\t active: function active(val, old) {\n\t if (val !== old) {\n\t this.$emit('changed', val);\n\t this.$emit(val ? 'enabled' : 'disabled');\n\t this.$emit('input', val);\n\t }\n\t },\n\t value: function value(val, old) {\n\t if (val !== old) {\n\t this.active = _utils.coerce.boolean(this.value);\n\t }\n\t }\n\t },\n\t computed: {\n\t boolDisabled: function boolDisabled() {\n\t return _utils.coerce.boolean(this.disabled);\n\t },\n\t boolReadonly: function boolReadonly() {\n\t return _utils.coerce.boolean(this.readonly);\n\t },\n\t type: function type() {\n\t return this.types[this.value ? this.trueType : this.falseType] || 'btn-default';\n\t }\n\t },\n\t methods: {\n\t toggle: function toggle() {\n\t if (this.boolDisabled || this.boolReadonly) {\n\t return;\n\t }\n\t this.active = !this.active;\n\t }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 181 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('a', {\n\t class: ['btn', _vm.type, {\n\t readonly: _vm.boolReadonly\n\t }],\n\t attrs: {\n\t \"href\": \"javascript:void(0)\",\n\t \"disabled\": _vm.boolDisabled\n\t },\n\t on: {\n\t \"click\": _vm.toggle\n\t }\n\t }, [_vm._c('span', {\n\t class: ['glyphicon', 'glyphicon-' + (_vm.value ? 'ok' : 'remove')]\n\t }), _vm._v(\" \"), _vm._t(\"default\"), _vm._v(\" \"), (_vm.name) ? _vm._c('input', {\n\t attrs: {\n\t \"type\": \"hidden\",\n\t \"name\": _vm.name\n\t },\n\t domProps: {\n\t \"value\": _vm.active ? 1 : 0\n\t }\n\t }) : _vm._e()], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-f034a5f2\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 182 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(183)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(185)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(186)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Tooltip.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-48fb51b2\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-48fb51b2\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Tooltip.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 183 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 185 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _popoverMixins = __webpack_require__(143);\n\t\n\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t mixins: [_popoverMixins2.default],\n\t props: {\n\t effect: { type: String, default: 'scale' },\n\t trigger: { type: String, default: 'hover' }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 186 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', {\n\t ref: \"trigger\"\n\t }, [_vm._t(\"default\"), _vm._v(\" \"), _vm._c('transition', {\n\t attrs: {\n\t \"name\": _vm.effect\n\t }\n\t }, [(_vm.show) ? _vm._c('div', {\n\t ref: \"popover\",\n\t class: ['tooltip', _vm.placement]\n\t }, [_vm._c('div', {\n\t staticClass: \"tooltip-arrow\"\n\t }), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"tooltip-inner\"\n\t }, [_vm._t(\"content\", [_vm._c('div', {\n\t domProps: {\n\t \"innerHTML\": _vm._s(_vm.content)\n\t }\n\t })])], 2)]) : _vm._e()])], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-48fb51b2\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 187 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(188)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(190)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(206)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Typeahead.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-5b5f5e94\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-5b5f5e94\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Typeahead.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 188 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 190 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof2 = __webpack_require__(191);\n\t\n\tvar _typeof3 = _interopRequireDefault(_typeof2);\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar DELAY = 300; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t async: { type: String },\n\t data: { type: Array },\n\t delay: { type: Number, default: DELAY },\n\t asyncKey: { type: String, default: null },\n\t limit: { type: Number, default: 8 },\n\t matchCase: { type: Boolean, default: false },\n\t matchStart: { type: Boolean, default: false },\n\t onHit: {\n\t type: Function,\n\t default: function _default(item) {\n\t return item;\n\t }\n\t },\n\t placeholder: { type: String },\n\t template: { type: String },\n\t type: { type: String, default: 'text' },\n\t value: { type: String, default: '' }\n\t },\n\t data: function data() {\n\t return {\n\t asign: '',\n\t showDropdown: false,\n\t noResults: true,\n\t current: 0,\n\t items: [],\n\t val: this.value\n\t };\n\t },\n\t\n\t computed: {\n\t templateComp: function templateComp() {\n\t return {\n\t template: typeof this.template === 'string' ? '' + this.template + '' : '',\n\t props: { item: { default: null } }\n\t };\n\t }\n\t },\n\t watch: {\n\t val: function val(_val, old) {\n\t this.$emit('input', _val);\n\t if (_val !== old && _val !== this.asign) this.__update();\n\t },\n\t value: function value(val) {\n\t if (this.val !== val) {\n\t this.val = val;\n\t }\n\t }\n\t },\n\t methods: {\n\t setItems: function setItems(data) {\n\t var _this = this;\n\t\n\t if (this.async) {\n\t this.items = this.asyncKey ? data[this.asyncKey] : data;\n\t this.items = this.items.slice(0, this.limit);\n\t } else {\n\t this.items = (data || []).filter(function (value) {\n\t if ((typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) === 'object') {\n\t return true;\n\t }\n\t value = _this.matchCase ? value : value.toLowerCase();\n\t var query = _this.matchCase ? _this.val : _this.val.toLowerCase();\n\t return _this.matchStart ? value.indexOf(query) === 0 : value.indexOf(query) !== -1;\n\t }).slice(0, this.limit);\n\t }\n\t this.showDropdown = this.items.length > 0;\n\t },\n\t setValue: function setValue(value) {\n\t this.asign = value;\n\t this.val = value;\n\t this.items = [];\n\t this.loading = false;\n\t this.showDropdown = false;\n\t },\n\t reset: function reset() {\n\t this.setValue(null);\n\t },\n\t setActive: function setActive(index) {\n\t this.current = index;\n\t },\n\t isActive: function isActive(index) {\n\t return this.current === index;\n\t },\n\t hit: function hit(e) {\n\t e.preventDefault();\n\t this.setValue(this.onHit(this.items[this.current], this));\n\t },\n\t up: function up() {\n\t if (this.current > 0) {\n\t this.current--;\n\t } else {\n\t this.current = this.items.length - 1;\n\t }\n\t },\n\t down: function down() {\n\t if (this.current < this.items.length - 1) {\n\t this.current++;\n\t } else {\n\t this.current = 0;\n\t }\n\t }\n\t },\n\t created: function created() {\n\t this.__update = (0, _utils.delayer)(function () {\n\t var _this2 = this;\n\t\n\t if (!this.val) {\n\t this.reset();\n\t return;\n\t }\n\t this.asign = '';\n\t if (this.async) {\n\t (0, _utils.getJSON)(this.async + this.val).then(function (data) {\n\t _this2.setItems(data);\n\t });\n\t } else if (this.data) {\n\t this.setItems(this.data);\n\t }\n\t }, 'delay', DELAY);\n\t this.__update();\n\t }\n\t};\n\n/***/ },\n/* 191 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\texports.__esModule = true;\n\t\n\tvar _iterator = __webpack_require__(20);\n\t\n\tvar _iterator2 = _interopRequireDefault(_iterator);\n\t\n\tvar _symbol = __webpack_require__(192);\n\t\n\tvar _symbol2 = _interopRequireDefault(_symbol);\n\t\n\tvar _typeof = typeof _symbol2.default === \"function\" && typeof _iterator2.default === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj; };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = typeof _symbol2.default === \"function\" && _typeof(_iterator2.default) === \"symbol\" ? function (obj) {\n\t return typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n\t} : function (obj) {\n\t return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n\t};\n\n/***/ },\n/* 192 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(193), __esModule: true };\n\n/***/ },\n/* 193 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(194);\n\t__webpack_require__(203);\n\t__webpack_require__(204);\n\t__webpack_require__(205);\n\tmodule.exports = __webpack_require__(7).Symbol;\n\n/***/ },\n/* 194 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// ECMAScript 6 symbols shim\n\tvar global = __webpack_require__(6)\n\t , has = __webpack_require__(29)\n\t , DESCRIPTORS = __webpack_require__(15)\n\t , $export = __webpack_require__(5)\n\t , redefine = __webpack_require__(28)\n\t , META = __webpack_require__(195).KEY\n\t , $fails = __webpack_require__(16)\n\t , shared = __webpack_require__(43)\n\t , setToStringTag = __webpack_require__(47)\n\t , uid = __webpack_require__(44)\n\t , wks = __webpack_require__(48)\n\t , wksExt = __webpack_require__(55)\n\t , wksDefine = __webpack_require__(196)\n\t , keyOf = __webpack_require__(197)\n\t , enumKeys = __webpack_require__(198)\n\t , isArray = __webpack_require__(201)\n\t , anObject = __webpack_require__(12)\n\t , toIObject = __webpack_require__(36)\n\t , toPrimitive = __webpack_require__(18)\n\t , createDesc = __webpack_require__(19)\n\t , _create = __webpack_require__(32)\n\t , gOPNExt = __webpack_require__(60)\n\t , $GOPD = __webpack_require__(202)\n\t , $DP = __webpack_require__(11)\n\t , $keys = __webpack_require__(34)\n\t , gOPD = $GOPD.f\n\t , dP = $DP.f\n\t , gOPN = gOPNExt.f\n\t , $Symbol = global.Symbol\n\t , $JSON = global.JSON\n\t , _stringify = $JSON && $JSON.stringify\n\t , PROTOTYPE = 'prototype'\n\t , HIDDEN = wks('_hidden')\n\t , TO_PRIMITIVE = wks('toPrimitive')\n\t , isEnum = {}.propertyIsEnumerable\n\t , SymbolRegistry = shared('symbol-registry')\n\t , AllSymbols = shared('symbols')\n\t , OPSymbols = shared('op-symbols')\n\t , ObjectProto = Object[PROTOTYPE]\n\t , USE_NATIVE = typeof $Symbol == 'function'\n\t , QObject = global.QObject;\n\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\tvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\t\n\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\tvar setSymbolDesc = DESCRIPTORS && $fails(function(){\n\t return _create(dP({}, 'a', {\n\t get: function(){ return dP(this, 'a', {value: 7}).a; }\n\t })).a != 7;\n\t}) ? function(it, key, D){\n\t var protoDesc = gOPD(ObjectProto, key);\n\t if(protoDesc)delete ObjectProto[key];\n\t dP(it, key, D);\n\t if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\n\t} : dP;\n\t\n\tvar wrap = function(tag){\n\t var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n\t sym._k = tag;\n\t return sym;\n\t};\n\t\n\tvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\n\t return typeof it == 'symbol';\n\t} : function(it){\n\t return it instanceof $Symbol;\n\t};\n\t\n\tvar $defineProperty = function defineProperty(it, key, D){\n\t if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\n\t anObject(it);\n\t key = toPrimitive(key, true);\n\t anObject(D);\n\t if(has(AllSymbols, key)){\n\t if(!D.enumerable){\n\t if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\n\t it[HIDDEN][key] = true;\n\t } else {\n\t if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\n\t D = _create(D, {enumerable: createDesc(0, false)});\n\t } return setSymbolDesc(it, key, D);\n\t } return dP(it, key, D);\n\t};\n\tvar $defineProperties = function defineProperties(it, P){\n\t anObject(it);\n\t var keys = enumKeys(P = toIObject(P))\n\t , i = 0\n\t , l = keys.length\n\t , key;\n\t while(l > i)$defineProperty(it, key = keys[i++], P[key]);\n\t return it;\n\t};\n\tvar $create = function create(it, P){\n\t return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n\t};\n\tvar $propertyIsEnumerable = function propertyIsEnumerable(key){\n\t var E = isEnum.call(this, key = toPrimitive(key, true));\n\t if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\n\t return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n\t};\n\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\n\t it = toIObject(it);\n\t key = toPrimitive(key, true);\n\t if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\n\t var D = gOPD(it, key);\n\t if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\n\t return D;\n\t};\n\tvar $getOwnPropertyNames = function getOwnPropertyNames(it){\n\t var names = gOPN(toIObject(it))\n\t , result = []\n\t , i = 0\n\t , key;\n\t while(names.length > i){\n\t if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\n\t } return result;\n\t};\n\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\n\t var IS_OP = it === ObjectProto\n\t , names = gOPN(IS_OP ? OPSymbols : toIObject(it))\n\t , result = []\n\t , i = 0\n\t , key;\n\t while(names.length > i){\n\t if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\n\t } return result;\n\t};\n\t\n\t// 19.4.1.1 Symbol([description])\n\tif(!USE_NATIVE){\n\t $Symbol = function Symbol(){\n\t if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\n\t var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n\t var $set = function(value){\n\t if(this === ObjectProto)$set.call(OPSymbols, value);\n\t if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\n\t setSymbolDesc(this, tag, createDesc(1, value));\n\t };\n\t if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\n\t return wrap(tag);\n\t };\n\t redefine($Symbol[PROTOTYPE], 'toString', function toString(){\n\t return this._k;\n\t });\n\t\n\t $GOPD.f = $getOwnPropertyDescriptor;\n\t $DP.f = $defineProperty;\n\t __webpack_require__(61).f = gOPNExt.f = $getOwnPropertyNames;\n\t __webpack_require__(200).f = $propertyIsEnumerable;\n\t __webpack_require__(199).f = $getOwnPropertySymbols;\n\t\n\t if(DESCRIPTORS && !__webpack_require__(27)){\n\t redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n\t }\n\t\n\t wksExt.f = function(name){\n\t return wrap(wks(name));\n\t }\n\t}\n\t\n\t$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\n\t\n\tfor(var symbols = (\n\t // 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\t 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n\t).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\n\t\n\tfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\n\t\n\t$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n\t // 19.4.2.1 Symbol.for(key)\n\t 'for': function(key){\n\t return has(SymbolRegistry, key += '')\n\t ? SymbolRegistry[key]\n\t : SymbolRegistry[key] = $Symbol(key);\n\t },\n\t // 19.4.2.5 Symbol.keyFor(sym)\n\t keyFor: function keyFor(key){\n\t if(isSymbol(key))return keyOf(SymbolRegistry, key);\n\t throw TypeError(key + ' is not a symbol!');\n\t },\n\t useSetter: function(){ setter = true; },\n\t useSimple: function(){ setter = false; }\n\t});\n\t\n\t$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n\t // 19.1.2.2 Object.create(O [, Properties])\n\t create: $create,\n\t // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n\t defineProperty: $defineProperty,\n\t // 19.1.2.3 Object.defineProperties(O, Properties)\n\t defineProperties: $defineProperties,\n\t // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n\t // 19.1.2.7 Object.getOwnPropertyNames(O)\n\t getOwnPropertyNames: $getOwnPropertyNames,\n\t // 19.1.2.8 Object.getOwnPropertySymbols(O)\n\t getOwnPropertySymbols: $getOwnPropertySymbols\n\t});\n\t\n\t// 24.3.2 JSON.stringify(value [, replacer [, space]])\n\t$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\n\t var S = $Symbol();\n\t // MS Edge converts symbol values to JSON as {}\n\t // WebKit converts symbol values to JSON as null\n\t // V8 throws on boxed symbols\n\t return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\n\t})), 'JSON', {\n\t stringify: function stringify(it){\n\t if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\n\t var args = [it]\n\t , i = 1\n\t , replacer, $replacer;\n\t while(arguments.length > i)args.push(arguments[i++]);\n\t replacer = args[1];\n\t if(typeof replacer == 'function')$replacer = replacer;\n\t if($replacer || !isArray(replacer))replacer = function(key, value){\n\t if($replacer)value = $replacer.call(this, key, value);\n\t if(!isSymbol(value))return value;\n\t };\n\t args[1] = replacer;\n\t return _stringify.apply($JSON, args);\n\t }\n\t});\n\t\n\t// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n\t$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n\t// 19.4.3.5 Symbol.prototype[@@toStringTag]\n\tsetToStringTag($Symbol, 'Symbol');\n\t// 20.2.1.9 Math[@@toStringTag]\n\tsetToStringTag(Math, 'Math', true);\n\t// 24.3.3 JSON[@@toStringTag]\n\tsetToStringTag(global.JSON, 'JSON', true);\n\n/***/ },\n/* 195 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar META = __webpack_require__(44)('meta')\n\t , isObject = __webpack_require__(13)\n\t , has = __webpack_require__(29)\n\t , setDesc = __webpack_require__(11).f\n\t , id = 0;\n\tvar isExtensible = Object.isExtensible || function(){\n\t return true;\n\t};\n\tvar FREEZE = !__webpack_require__(16)(function(){\n\t return isExtensible(Object.preventExtensions({}));\n\t});\n\tvar setMeta = function(it){\n\t setDesc(it, META, {value: {\n\t i: 'O' + ++id, // object ID\n\t w: {} // weak collections IDs\n\t }});\n\t};\n\tvar fastKey = function(it, create){\n\t // return primitive with prefix\n\t if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n\t if(!has(it, META)){\n\t // can't set metadata to uncaught frozen object\n\t if(!isExtensible(it))return 'F';\n\t // not necessary to add metadata\n\t if(!create)return 'E';\n\t // add missing metadata\n\t setMeta(it);\n\t // return object ID\n\t } return it[META].i;\n\t};\n\tvar getWeak = function(it, create){\n\t if(!has(it, META)){\n\t // can't set metadata to uncaught frozen object\n\t if(!isExtensible(it))return true;\n\t // not necessary to add metadata\n\t if(!create)return false;\n\t // add missing metadata\n\t setMeta(it);\n\t // return hash weak collections IDs\n\t } return it[META].w;\n\t};\n\t// add metadata on freeze-family methods calling\n\tvar onFreeze = function(it){\n\t if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);\n\t return it;\n\t};\n\tvar meta = module.exports = {\n\t KEY: META,\n\t NEED: false,\n\t fastKey: fastKey,\n\t getWeak: getWeak,\n\t onFreeze: onFreeze\n\t};\n\n/***/ },\n/* 196 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global = __webpack_require__(6)\n\t , core = __webpack_require__(7)\n\t , LIBRARY = __webpack_require__(27)\n\t , wksExt = __webpack_require__(55)\n\t , defineProperty = __webpack_require__(11).f;\n\tmodule.exports = function(name){\n\t var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n\t if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\n\t};\n\n/***/ },\n/* 197 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar getKeys = __webpack_require__(34)\n\t , toIObject = __webpack_require__(36);\n\tmodule.exports = function(object, el){\n\t var O = toIObject(object)\n\t , keys = getKeys(O)\n\t , length = keys.length\n\t , index = 0\n\t , key;\n\t while(length > index)if(O[key = keys[index++]] === el)return key;\n\t};\n\n/***/ },\n/* 198 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// all enumerable object keys, includes symbols\n\tvar getKeys = __webpack_require__(34)\n\t , gOPS = __webpack_require__(199)\n\t , pIE = __webpack_require__(200);\n\tmodule.exports = function(it){\n\t var result = getKeys(it)\n\t , getSymbols = gOPS.f;\n\t if(getSymbols){\n\t var symbols = getSymbols(it)\n\t , isEnum = pIE.f\n\t , i = 0\n\t , key;\n\t while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\n\t } return result;\n\t};\n\n/***/ },\n/* 199 */\n/***/ function(module, exports) {\n\n\texports.f = Object.getOwnPropertySymbols;\n\n/***/ },\n/* 200 */\n/***/ function(module, exports) {\n\n\texports.f = {}.propertyIsEnumerable;\n\n/***/ },\n/* 201 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.2.2 IsArray(argument)\n\tvar cof = __webpack_require__(38);\n\tmodule.exports = Array.isArray || function isArray(arg){\n\t return cof(arg) == 'Array';\n\t};\n\n/***/ },\n/* 202 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar pIE = __webpack_require__(200)\n\t , createDesc = __webpack_require__(19)\n\t , toIObject = __webpack_require__(36)\n\t , toPrimitive = __webpack_require__(18)\n\t , has = __webpack_require__(29)\n\t , IE8_DOM_DEFINE = __webpack_require__(14)\n\t , gOPD = Object.getOwnPropertyDescriptor;\n\t\n\texports.f = __webpack_require__(15) ? gOPD : function getOwnPropertyDescriptor(O, P){\n\t O = toIObject(O);\n\t P = toPrimitive(P, true);\n\t if(IE8_DOM_DEFINE)try {\n\t return gOPD(O, P);\n\t } catch(e){ /* empty */ }\n\t if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\n\t};\n\n/***/ },\n/* 203 */\n/***/ function(module, exports) {\n\n\n\n/***/ },\n/* 204 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(196)('asyncIterator');\n\n/***/ },\n/* 205 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(196)('observable');\n\n/***/ },\n/* 206 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: {\n\t open: _vm.showDropdown\n\t },\n\t staticStyle: {\n\t \"position\": \"relative\"\n\t }\n\t }, [_vm._c('input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"autocomplete\": \"off\",\n\t \"placeholder\": _vm.placeholder,\n\t \"type\": _vm.type\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.val)\n\t },\n\t on: {\n\t \"blur\": function($event) {\n\t _vm.showDropdown = false\n\t },\n\t \"keydown\": [function($event) {\n\t if (_vm._k($event.keyCode, \"down\", 40)) { return; }\n\t $event.preventDefault();\n\t _vm.down($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t _vm.hit($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.reset($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"up\", 38)) { return; }\n\t $event.preventDefault();\n\t _vm.up($event)\n\t }],\n\t \"input\": function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.val = $event.target.value\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('ul', {\n\t ref: \"dropdown\",\n\t staticClass: \"dropdown-menu\"\n\t }, _vm._l((_vm.items), function(item, i) {\n\t return _vm._c('li', {\n\t class: {\n\t active: _vm.isActive(i)\n\t }\n\t }, [_vm._c('a', {\n\t on: {\n\t \"mousedown\": function($event) {\n\t $event.preventDefault();\n\t _vm.hit($event)\n\t },\n\t \"mousemove\": function($event) {\n\t _vm.setActive(i)\n\t }\n\t }\n\t }, [_vm._c(_vm.templateComp, {\n\t tag: \"component\",\n\t attrs: {\n\t \"item\": item\n\t }\n\t })], 1)])\n\t }))])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-5b5f5e94\", module.exports)\n\t }\n\t}\n\n/***/ }\n/******/ ])\n});\n;\n//# sourceMappingURL=vue-strap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3Z1ZS1zdHJhcC9kaXN0L3Z1ZS1zdHJhcC5qcz9lMTQ3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogdnVlLXN0cmFwIDIuMC4yXG4gKiBodHRwOi8vd2ZmcmFuY28uZ2l0aHViLmlvL3Z1ZS1zdHJhcC9cbiAqIENvbXBpbGVkIHVzaW5nIFZ1ZSAyLjEuMTBcbiAqL1xuKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiVnVlU3RyYXBcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiVnVlU3RyYXBcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdHZhciBfU2Nyb2xsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OCk7XG5cdFxuXHR2YXIgX1Njcm9sbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TY3JvbGwpO1xuXHRcblx0dmFyIF9BY2NvcmRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5KTtcblx0XG5cdHZhciBfQWNjb3JkaW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FjY29yZGlvbik7XG5cdFxuXHR2YXIgX0FmZml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Mik7XG5cdFxuXHR2YXIgX0FmZml4MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FmZml4KTtcblx0XG5cdHZhciBfQWxlcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1KTtcblx0XG5cdHZhciBfQWxlcnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQWxlcnQpO1xuXHRcblx0dmFyIF9Bc2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oODIpO1xuXHRcblx0dmFyIF9Bc2lkZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Bc2lkZSk7XG5cdFxuXHR2YXIgX0J1dHRvbkdyb3VwID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4Nyk7XG5cdFxuXHR2YXIgX0J1dHRvbkdyb3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0J1dHRvbkdyb3VwKTtcblx0XG5cdHZhciBfQ2Fyb3VzZWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwKTtcblx0XG5cdHZhciBfQ2Fyb3VzZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2Fyb3VzZWwpO1xuXHRcblx0dmFyIF9DaGVja2JveCA9IF9fd2VicGFja19yZXF1aXJlX18oOTUpO1xuXHRcblx0dmFyIF9DaGVja2JveDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DaGVja2JveCk7XG5cdFxuXHR2YXIgX0RhdGVwaWNrZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMCk7XG5cdFxuXHR2YXIgX0RhdGVwaWNrZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRGF0ZXBpY2tlcik7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDUpO1xuXHRcblx0dmFyIF9Ecm9wZG93bjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ecm9wZG93bik7XG5cdFxuXHR2YXIgX0Zvcm1Hcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTA4KTtcblx0XG5cdHZhciBfRm9ybUdyb3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1Hcm91cCk7XG5cdFxuXHR2YXIgX0Zvcm1WYWxpZGF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMSk7XG5cdFxuXHR2YXIgX0Zvcm1WYWxpZGF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRm9ybVZhbGlkYXRvcik7XG5cdFxuXHR2YXIgX0lucHV0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTQpO1xuXHRcblx0dmFyIF9JbnB1dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9JbnB1dCk7XG5cdFxuXHR2YXIgX01vZGFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTkpO1xuXHRcblx0dmFyIF9Nb2RhbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbCk7XG5cdFxuXHR2YXIgX05hdmJhciA9IF9fd2VicGFja19yZXF1aXJlX18oMTI4KTtcblx0XG5cdHZhciBfTmF2YmFyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdmJhcik7XG5cdFxuXHR2YXIgX09wdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTMxKTtcblx0XG5cdHZhciBfT3B0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX09wdGlvbik7XG5cdFxuXHR2YXIgX1BhbmVsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzQpO1xuXHRcblx0dmFyIF9QYW5lbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QYW5lbCk7XG5cdFxuXHR2YXIgX1BvcG92ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzOSk7XG5cdFxuXHR2YXIgX1BvcG92ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUG9wb3Zlcik7XG5cdFxuXHR2YXIgX1Byb2dyZXNzYmFyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDUpO1xuXHRcblx0dmFyIF9Qcm9ncmVzc2JhcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qcm9ncmVzc2Jhcik7XG5cdFxuXHR2YXIgX1JhZGlvID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDgpO1xuXHRcblx0dmFyIF9SYWRpbzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9SYWRpbyk7XG5cdFxuXHR2YXIgX1NlbGVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUzKTtcblx0XG5cdHZhciBfU2VsZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NlbGVjdCk7XG5cdFxuXHR2YXIgX1NsaWRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTU4KTtcblx0XG5cdHZhciBfU2xpZGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NsaWRlcik7XG5cdFxuXHR2YXIgX1NwaW5uZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2MSk7XG5cdFxuXHR2YXIgX1NwaW5uZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU3Bpbm5lcik7XG5cdFxuXHR2YXIgX1RhYiA9IF9fd2VicGFja19yZXF1aXJlX18oMTY2KTtcblx0XG5cdHZhciBfVGFiMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYik7XG5cdFxuXHR2YXIgX1RhYkdyb3VwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjkpO1xuXHRcblx0dmFyIF9UYWJHcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJHcm91cCk7XG5cdFxuXHR2YXIgX1RhYnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NCk7XG5cdFxuXHR2YXIgX1RhYnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFicyk7XG5cdFxuXHR2YXIgX1RvZ2dsZUJ1dHRvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTc5KTtcblx0XG5cdHZhciBfVG9nZ2xlQnV0dG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RvZ2dsZUJ1dHRvbik7XG5cdFxuXHR2YXIgX1Rvb2x0aXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4Mik7XG5cdFxuXHR2YXIgX1Rvb2x0aXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVG9vbHRpcCk7XG5cdFxuXHR2YXIgX1R5cGVhaGVhZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTg3KTtcblx0XG5cdHZhciBfVHlwZWFoZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1R5cGVhaGVhZCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly8gQ29tcG9uZW50c1xuXHRcblx0Ly8gRGlyZWN0aXZlc1xuXHQvLyBVdGlsc1xuXHR2YXIgVnVlU3RyYXAgPSB7XG5cdCAgZGlyZWN0aXZlczoge1xuXHQgICAgQ2xpY2tPdXRzaWRlOiBfQ2xpY2tPdXRzaWRlMi5kZWZhdWx0LFxuXHQgICAgU2Nyb2xsOiBfU2Nyb2xsMi5kZWZhdWx0XG5cdCAgfSxcblx0ICB1dGlsczoge1xuXHQgICAgJDogX05vZGVMaXN0Mi5kZWZhdWx0LFxuXHQgICAgY29lcmNlOiBfdXRpbHMuY29lcmNlXG5cdCAgfSxcblx0ICAvL2NvbXBvbmVudHNcblx0ICBhY2NvcmRpb246IF9BY2NvcmRpb24yLmRlZmF1bHQsXG5cdCAgYWZmaXg6IF9BZmZpeDIuZGVmYXVsdCxcblx0ICBhbGVydDogX0FsZXJ0Mi5kZWZhdWx0LFxuXHQgIGFzaWRlOiBfQXNpZGUyLmRlZmF1bHQsXG5cdCAgYnV0dG9uR3JvdXA6IF9CdXR0b25Hcm91cDIuZGVmYXVsdCxcblx0ICBjYXJvdXNlbDogX0Nhcm91c2VsMi5kZWZhdWx0LFxuXHQgIGNoZWNrYm94OiBfQ2hlY2tib3gyLmRlZmF1bHQsXG5cdCAgZGF0ZXBpY2tlcjogX0RhdGVwaWNrZXIyLmRlZmF1bHQsXG5cdCAgZHJvcGRvd246IF9Ecm9wZG93bjIuZGVmYXVsdCxcblx0ICBmb3JtR3JvdXA6IF9Gb3JtR3JvdXAyLmRlZmF1bHQsXG5cdCAgZm9ybVZhbGlkYXRvcjogX0Zvcm1WYWxpZGF0b3IyLmRlZmF1bHQsXG5cdCAgaW5wdXQ6IF9JbnB1dDIuZGVmYXVsdCxcblx0ICBtb2RhbDogX01vZGFsMi5kZWZhdWx0LFxuXHQgIG5hdmJhcjogX05hdmJhcjIuZGVmYXVsdCxcblx0ICBvcHRpb246IF9PcHRpb24yLmRlZmF1bHQsXG5cdCAgcGFuZWw6IF9QYW5lbDIuZGVmYXVsdCxcblx0ICBwb3BvdmVyOiBfUG9wb3ZlcjIuZGVmYXVsdCxcblx0ICBwcm9ncmVzc2JhcjogX1Byb2dyZXNzYmFyMi5kZWZhdWx0LFxuXHQgIHJhZGlvOiBfUmFkaW8yLmRlZmF1bHQsXG5cdCAgc2VsZWN0OiBfU2VsZWN0Mi5kZWZhdWx0LFxuXHQgIHNsaWRlcjogX1NsaWRlcjIuZGVmYXVsdCxcblx0ICBzcGlubmVyOiBfU3Bpbm5lcjIuZGVmYXVsdCxcblx0ICB0YWI6IF9UYWIyLmRlZmF1bHQsXG5cdCAgdGFiR3JvdXA6IF9UYWJHcm91cDIuZGVmYXVsdCxcblx0ICB0YWJzOiBfVGFiczIuZGVmYXVsdCxcblx0ICB0b2dnbGVCdXR0b246IF9Ub2dnbGVCdXR0b24yLmRlZmF1bHQsXG5cdCAgdG9vbHRpcDogX1Rvb2x0aXAyLmRlZmF1bHQsXG5cdCAgdHlwZWFoZWFkOiBfVHlwZWFoZWFkMi5kZWZhdWx0XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IFZ1ZVN0cmFwO1xuXG4vKioqLyB9LFxuLyogMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXHRcblx0dmFyIF9pdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xuXHRcblx0dmFyIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvcik7XG5cdFxuXHR2YXIgX2dldE93blByb3BlcnR5TmFtZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2KTtcblx0XG5cdHZhciBfZ2V0T3duUHJvcGVydHlOYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRPd25Qcm9wZXJ0eU5hbWVzKTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2syID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Mik7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzMiA9IF9fd2VicGFja19yZXF1aXJlX18oNjMpO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDbGFzczIpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdF9fd2VicGFja19yZXF1aXJlX18oNjQpO1xuXHRcblx0dmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cdHZhciBub2RlRXJyb3IgPSBuZXcgRXJyb3IoJ1Bhc3NlZCBhcmd1bWVudHMgbXVzdCBiZSBvZiBOb2RlJyk7XG5cdHZhciBibHVyRXZlbnQ7XG5cdHZhciBibHVyTGlzdCA9IFtdO1xuXHR2YXIgRXZlbnRzID0gW107XG5cdFxuXHRmdW5jdGlvbiBpc05vZGUodmFsKSB7XG5cdCAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHdpbmRvdy5Ob2RlO1xuXHR9XG5cdGZ1bmN0aW9uIGlzTm9kZUxpc3QodmFsKSB7XG5cdCAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHdpbmRvdy5Ob2RlTGlzdCB8fCB2YWwgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENvbGxlY3Rpb24gfHwgdmFsIGluc3RhbmNlb2YgQXJyYXk7XG5cdH1cblx0XG5cdHZhciBOb2RlTGlzdCA9IGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBOb2RlTGlzdChhcmdzKSB7XG5cdCAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMy5kZWZhdWx0KSh0aGlzLCBOb2RlTGlzdCk7XG5cdFxuXHQgICAgdmFyIG5vZGVzID0gYXJncztcblx0ICAgIGlmIChhcmdzWzBdID09PSB3aW5kb3cpIHtcblx0ICAgICAgbm9kZXMgPSBbd2luZG93XTtcblx0ICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgIG5vZGVzID0gKGFyZ3NbMV0gfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoYXJnc1swXSk7XG5cdCAgICAgIGlmIChhcmdzWzFdKSB7XG5cdCAgICAgICAgdGhpcy5vd25lciA9IGFyZ3NbMV07XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAoMCBpbiBhcmdzICYmICFpc05vZGUoYXJnc1swXSkgJiYgYXJnc1swXSAmJiAnbGVuZ3RoJyBpbiBhcmdzWzBdKSB7XG5cdCAgICAgIG5vZGVzID0gYXJnc1swXTtcblx0ICAgICAgaWYgKGFyZ3NbMV0pIHtcblx0ICAgICAgICB0aGlzLm93bmVyID0gYXJnc1sxXTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaWYgKG5vZGVzKSB7XG5cdCAgICAgIGZvciAodmFyIGkgaW4gbm9kZXMpIHtcblx0ICAgICAgICB0aGlzW2ldID0gbm9kZXNbaV07XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5sZW5ndGggPSBub2Rlcy5sZW5ndGg7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmxlbmd0aCA9IDA7XG5cdCAgICB9XG5cdCAgICB3aW5kb3cucHJ1ZWJhID0gdGhpcztcblx0ICB9XG5cdFxuXHQgICgwLCBfY3JlYXRlQ2xhc3MzLmRlZmF1bHQpKE5vZGVMaXN0LCBbe1xuXHQgICAga2V5OiAnY29uY2F0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjb25jYXQoKSB7XG5cdCAgICAgIHZhciBub2RlcyA9IEFycmF5UHJvdG8uc2xpY2UuY2FsbCh0aGlzKTtcblx0ICAgICAgZnVuY3Rpb24gZmxhdHRlbihhcnIpIHtcblx0ICAgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcnIsIGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGlzTm9kZShlbCkpIHtcblx0ICAgICAgICAgICAgaWYgKCF+bm9kZXMuaW5kZXhPZihlbCkpIG5vZGVzLnB1c2goZWwpO1xuXHQgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGVsKSkge1xuXHQgICAgICAgICAgICBmbGF0dGVuKGVsKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcblx0ICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcmdzLCBmdW5jdGlvbiAoYXJnKSB7XG5cdCAgICAgICAgaWYgKGlzTm9kZShhcmcpKSB7XG5cdCAgICAgICAgICBpZiAoIX5ub2Rlcy5pbmRleE9mKGFyZykpIG5vZGVzLnB1c2goYXJnKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZUxpc3QoYXJnKSkge1xuXHQgICAgICAgICAgZmxhdHRlbihhcmcpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aHJvdyBFcnJvcignQ29uY2F0IGFyZ3VtZW50cyBtdXN0IGJlIG9mIGEgTm9kZSwgTm9kZUxpc3QsIEhUTUxDb2xsZWN0aW9uLCBvciBBcnJheSBvZiAoTm9kZSwgTm9kZUxpc3QsIEhUTUxDb2xsZWN0aW9uLCBBcnJheSknKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZGVsZXRlJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKCkge1xuXHQgICAgICB2YXIgbm90UmVtb3ZlZCA9IGZsYXR0ZW4odGhpcykuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbC5yZW1vdmUpIHtcblx0ICAgICAgICAgIGVsLnJlbW92ZSgpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoZWwucGFyZW50Tm9kZSkge1xuXHQgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmIChub3RSZW1vdmVkLmxlbmd0aCkgY29uc29sZS53YXJuKCdOb2RlTGlzdDogU29tZSBub2RlcyBjb3VsZCBub3QgYmUgZGVsZXRlZC4nKTtcblx0ICAgICAgcmV0dXJuIG5vdFJlbW92ZWQ7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZWFjaCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZWFjaCgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcblx0ICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZmlsdGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmaWx0ZXIoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhBcnJheVByb3RvLmZpbHRlci5hcHBseSh0aGlzLCBhcmdzKSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZmluZCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZmluZChlbGVtZW50KSB7XG5cdCAgICAgIHZhciBub2RlcyA9IFtdO1xuXHQgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICBub2Rlcy5wdXNoKG5vZGUucXVlcnlTZWxlY3RvckFsbChlbGVtZW50KSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICBpZiAoaXNOb2RlKGVsZW1lbnQpKSBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICBpZiAobm9kZSAhPT0gZWxlbWVudCAmJiBub2RlLmNvbnRhaW5zKGVsZW1lbnQpKSBub2Rlcy5wdXNoKGVsZW1lbnQpO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKGlzTm9kZUxpc3QoZWxlbWVudCkpIHtcblx0ICAgICAgICB2YXIgZWxzID0gZmxhdHRlbihlbGVtZW50KTtcblx0ICAgICAgICBmbGF0dGVuKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICAgIGVscy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgICBpZiAobm9kZSAhPT0gZWwgJiYgbm9kZS5jb250YWlucyhlbCkpIG5vZGVzLnB1c2goZWwpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZsYXR0ZW4obm9kZXMsIHRoaXMub3duZXIpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZvckVhY2gnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2luY2x1ZGVzJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBpbmNsdWRlcyhlbGVtZW50LCBpbmRleCkge1xuXHQgICAgICByZXR1cm4gfnRoaXMuaW5kZXhPZihlbGVtZW50LCBpbmRleCk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnbWFwJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW41ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW41KSwgX2tleTUgPSAwOyBfa2V5NSA8IF9sZW41OyBfa2V5NSsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5NV0gPSBhcmd1bWVudHNbX2tleTVdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgbWFwcGVkID0gQXJyYXlQcm90by5tYXAuYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiBtYXBwZWQuc29tZShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gaXNOb2RlKGVsKSB8fCBpc05vZGVMaXN0KGVsKTtcblx0ICAgICAgfSkgPyBmbGF0dGVuKG1hcHBlZCwgdGhpcykgOiBtYXBwZWQ7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncGFyZW50Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKHRoaXMubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbC5wYXJlbnROb2RlO1xuXHQgICAgICB9KSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncG9wJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwb3AoYW1vdW50KSB7XG5cdCAgICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGFtb3VudCA9IDE7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIG5vZGVzID0gW107XG5cdCAgICAgIHZhciBwb3AgPSBBcnJheVByb3RvLnBvcC5iaW5kKHRoaXMpO1xuXHQgICAgICB3aGlsZSAoYW1vdW50LS0pIHtcblx0ICAgICAgICBub2Rlcy5wdXNoKHBvcCgpKTtcblx0ICAgICAgfXJldHVybiBOb2RlTGlzdEpTKG5vZGVzLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdwdXNoJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjYpLCBfa2V5NiA9IDA7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk2XSA9IGFyZ3VtZW50c1tfa2V5Nl07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyZ3MsIGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmcpKSB0aHJvdyBub2RlRXJyb3I7XG5cdCAgICAgICAgaWYgKCF+X3RoaXMuaW5kZXhPZihhcmcpKSBBcnJheVByb3RvLnB1c2guY2FsbChfdGhpcywgYXJnKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3NoaWZ0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzaGlmdChhbW91bnQpIHtcblx0ICAgICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XG5cdCAgICAgICAgYW1vdW50ID0gMTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgbm9kZXMgPSBbXTtcblx0ICAgICAgd2hpbGUgKGFtb3VudC0tKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChBcnJheVByb3RvLnNoaWZ0LmNhbGwodGhpcykpO1xuXHQgICAgICB9cmV0dXJuIG5vZGVzLmxlbmd0aCA9PSAxID8gbm9kZXNbMF0gOiBOb2RlTGlzdEpTKG5vZGVzLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzbGljZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2xpY2UoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW43ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW43KSwgX2tleTcgPSAwOyBfa2V5NyA8IF9sZW43OyBfa2V5NysrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5N10gPSBhcmd1bWVudHNbX2tleTddO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhBcnJheVByb3RvLnNsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzcGxpY2UnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNwbGljZSgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjggPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjgpLCBfa2V5OCA9IDA7IF9rZXk4IDwgX2xlbjg7IF9rZXk4KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk4XSA9IGFyZ3VtZW50c1tfa2V5OF07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIGkgPSAyLCBsID0gYXJncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmdzW2ldKSkgdGhyb3cgbm9kZUVycm9yO1xuXHQgICAgICB9XG5cdCAgICAgIEFycmF5UHJvdG8uc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICd1bnNoaWZ0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIHZhciB1bnNoaWZ0ID0gQXJyYXlQcm90by51bnNoaWZ0LmJpbmQodGhpcyk7XG5cdFxuXHQgICAgICBmb3IgKHZhciBfbGVuOSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuOSksIF9rZXk5ID0gMDsgX2tleTkgPCBfbGVuOTsgX2tleTkrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTldID0gYXJndW1lbnRzW19rZXk5XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJncywgZnVuY3Rpb24gKGFyZykge1xuXHQgICAgICAgIGlmICghaXNOb2RlKGFyZykpIHRocm93IG5vZGVFcnJvcjtcblx0ICAgICAgICBpZiAoIX5fdGhpczIuaW5kZXhPZihhcmcpKSB1bnNoaWZ0KGFyZyk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdhZGRDbGFzcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQ2xhc3MoY2xhc3Nlcykge1xuXHQgICAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCB0cnVlKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdyZW1vdmVDbGFzcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoY2xhc3Nlcykge1xuXHQgICAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCBmYWxzZSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAndG9nZ2xlQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuXHRcblx0ICAgICAgdmFyIG1ldGhvZCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyAndG9nZ2xlJyA6IHZhbHVlID8gJ2FkZCcgOiAncmVtb3ZlJztcblx0ICAgICAgaWYgKHR5cGVvZiBjbGFzc2VzID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgcmV0dXJuIGNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuXHQgICAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdFttZXRob2RdKGMpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdnZXQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGdldChwcm9wKSB7XG5cdCAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgZWwgPSBlbFtwcm9wXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXJyLnB1c2goZWwpO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIGZsYXR0ZW4oYXJyLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzZXQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNldChwcm9wLCB2YWx1ZSkge1xuXHQgICAgICBpZiAocHJvcC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGVsKSB7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wKSB7XG5cdCAgICAgICAgICAgICAgaWYgKGtleSBpbiBlbCkge1xuXHQgICAgICAgICAgICAgICAgZWxba2V5XSA9IHByb3Bba2V5XTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgICBpZiAocHJvcCBpbiBlbCkge1xuXHQgICAgICAgICAgICBlbFtwcm9wXSA9IHZhbHVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2NhbGwnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbGwoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4xMCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMTApLCBfa2V5MTAgPSAwOyBfa2V5MTAgPCBfbGVuMTA7IF9rZXkxMCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5MTBdID0gYXJndW1lbnRzW19rZXkxMF07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvLnNoaWZ0LmNhbGwoYXJncyk7XG5cdCAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgdmFyIHJldHVyblRoaXMgPSB0cnVlO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgaWYgKGVsICYmIGVsW21ldGhvZF0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgZWwgPSBlbFttZXRob2RdLmFwcGx5KGVsLCBhcmdzKTtcblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICAgIGlmIChyZXR1cm5UaGlzICYmIGVsICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuVGhpcyA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBhcnIucHVzaCh1bmRlZmluZWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiByZXR1cm5UaGlzID8gdGhpcyA6IGZsYXR0ZW4oYXJyLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdpdGVtJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBpdGVtKGluZGV4KSB7XG5cdCAgICAgIHJldHVybiBOb2RlTGlzdEpTKFt0aGlzW2luZGV4XV0sIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uJyxcblx0XG5cdFxuXHQgICAgLy8gZXZlbnQgaGFuZGxlcnNcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuXHQgICAgICBpZiAodHlwZW9mIGV2ZW50cyA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBldmVudHMgPSBldmVudHMudHJpbSgpLnJlcGxhY2UoL1xccysvLCAnICcpLnNwbGl0KCcgJyk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cdCAgICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgY2FsbGJhY2sgPSBzZWxlY3Rvcjtcblx0ICAgICAgICBzZWxlY3RvciA9IG51bGw7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuIHRoaXM7XG5cdCAgICAgIHZhciBmbiA9IGNhbGxiYWNrO1xuXHQgICAgICBjYWxsYmFjayA9IHNlbGVjdG9yID8gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICB2YXIgZWxzID0gTm9kZUxpc3RKUyhzZWxlY3RvciwgdGhpcyk7XG5cdCAgICAgICAgaWYgKCFlbHMubGVuZ3RoKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVscy5zb21lKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgdmFyIHRhcmdldCA9IGVsLmNvbnRhaW5zKGUudGFyZ2V0KTtcblx0ICAgICAgICAgIGlmICh0YXJnZXQpIGZuLmNhbGwoZWwsIGUsIGVsKTtcblx0ICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gOiBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgIGZuLmFwcGx5KHRoaXMsIFtlLCB0aGlzXSk7XG5cdCAgICAgIH07XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgIGlmIChlbCA9PT0gd2luZG93IHx8IGlzTm9kZShlbCkpIHtcblx0ICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgY2FsbGJhY2ssIGZhbHNlKTtcblx0ICAgICAgICAgICAgRXZlbnRzLnB1c2goe1xuXHQgICAgICAgICAgICAgIGVsOiBlbCxcblx0ICAgICAgICAgICAgICBldmVudDogZXZlbnQsXG5cdCAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb2ZmJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYoZXZlbnRzLCBjYWxsYmFjaykge1xuXHQgICAgICBpZiAoZXZlbnRzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICBjYWxsYmFjayA9IGV2ZW50cztcblx0ICAgICAgICBldmVudHMgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGV2ZW50cyA9IGV2ZW50cyBpbnN0YW5jZW9mIEFycmF5ID8gZXZlbnRzIDogdHlwZW9mIGV2ZW50cyA9PT0gJ3N0cmluZycgPyBldmVudHMudHJpbSgpLnJlcGxhY2UoL1xccysvLCAnICcpLnNwbGl0KCcgJykgOiBudWxsO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgRXZlbnRzID0gRXZlbnRzLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgaWYgKGUgJiYgZS5lbCA9PT0gZWwgJiYgKCFjYWxsYmFjayB8fCBjYWxsYmFjayA9PT0gZS5jYWxsYmFjaykgJiYgKCFldmVudHMgfHwgfmV2ZW50cy5pbmRleE9mKGUuZXZlbnQpKSkge1xuXHQgICAgICAgICAgICBlLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS5ldmVudCwgZS5jYWxsYmFjayk7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25CbHVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkJsdXIoY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cdCAgICAgIGlmICghY2FsbGJhY2spIHJldHVybiB0aGlzO1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgYmx1ckxpc3QucHVzaCh7IGVsOiBlbCwgY2FsbGJhY2s6IGNhbGxiYWNrIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKCFibHVyRXZlbnQpIHtcblx0ICAgICAgICBibHVyRXZlbnQgPSBmdW5jdGlvbiBibHVyRXZlbnQoZSkge1xuXHQgICAgICAgICAgYmx1ckxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gaXRlbS5lbC5jb250YWlucyhlLnRhcmdldCkgfHwgaXRlbS5lbCA9PT0gZS50YXJnZXQ7XG5cdCAgICAgICAgICAgIGlmICghdGFyZ2V0KSBpdGVtLmNhbGxiYWNrLmNhbGwoaXRlbS5lbCwgZSwgaXRlbS5lbCk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYmx1ckV2ZW50LCBmYWxzZSk7XG5cdCAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJsdXJFdmVudCwgZmFsc2UpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29mZkJsdXInLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9mZkJsdXIoY2FsbGJhY2spIHtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGJsdXJMaXN0ID0gYmx1ckxpc3QuZmlsdGVyKGZ1bmN0aW9uIChibHVyKSB7XG5cdCAgICAgICAgICBpZiAoYmx1ciAmJiBibHVyLmVsID09PSBlbCAmJiAoIWNhbGxiYWNrIHx8IGJsdXIuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICByZXR1cm4gZWw7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdhc0FycmF5Jyxcblx0ICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgICByZXR1cm4gQXJyYXlQcm90by5zbGljZS5jYWxsKHRoaXMpO1xuXHQgICAgfVxuXHQgIH1dKTtcblx0ICByZXR1cm4gTm9kZUxpc3Q7XG5cdH0oKTtcblx0XG5cdHZhciBOTCA9IE5vZGVMaXN0LnByb3RvdHlwZTtcblx0XG5cdGZ1bmN0aW9uIGZsYXR0ZW4oYXJyLCBvd25lcikge1xuXHQgIHZhciBsaXN0ID0gW107XG5cdCAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJyLCBmdW5jdGlvbiAoZWwpIHtcblx0ICAgIGlmIChpc05vZGUoZWwpKSB7XG5cdCAgICAgIGlmICghfmxpc3QuaW5kZXhPZihlbCkpIGxpc3QucHVzaChlbCk7XG5cdCAgICB9IGVsc2UgaWYgKGlzTm9kZUxpc3QoZWwpKSB7XG5cdCAgICAgIGZvciAodmFyIGlkIGluIGVsKSB7XG5cdCAgICAgICAgaWYgKCF+bGlzdC5pbmRleE9mKGVsW2lkXSkpIGxpc3QucHVzaChlbFtpZF0pO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2UgaWYgKGVsICE9PSBudWxsKSB7XG5cdCAgICAgIGFyci5nZXQgPSBOTC5nZXQ7XG5cdCAgICAgIGFyci5zZXQgPSBOTC5zZXQ7XG5cdCAgICAgIGFyci5jYWxsID0gTkwuY2FsbDtcblx0ICAgICAgYXJyLm93bmVyID0gb3duZXI7XG5cdCAgICAgIHJldHVybiBhcnI7XG5cdCAgICB9XG5cdCAgfSk7XG5cdCAgcmV0dXJuIE5vZGVMaXN0SlMobGlzdCwgb3duZXIpO1xuXHR9XG5cdFxuXHR2YXIgZXhjZXB0aW9ucyA9IFsnam9pbicsICdjb3B5V2l0aGluJywgJ2ZpbGwnLCAnZmluZCcsICdmb3JFYWNoJ107XG5cdCgwLCBfZ2V0T3duUHJvcGVydHlOYW1lczIuZGVmYXVsdCkoQXJyYXlQcm90bykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdCAgaWYgKCF+ZXhjZXB0aW9ucy5pbmRleE9mKGtleSkgJiYgTkxba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICBOTFtrZXldID0gQXJyYXlQcm90b1trZXldO1xuXHQgIH1cblx0fSk7XG5cdGlmICh3aW5kb3cuU3ltYm9sICYmIF9pdGVyYXRvcjIuZGVmYXVsdCkge1xuXHQgIE5MW19pdGVyYXRvcjIuZGVmYXVsdF0gPSBOTC52YWx1ZXMgPSBBcnJheVByb3RvW19pdGVyYXRvcjIuZGVmYXVsdF07XG5cdH1cblx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRmdW5jdGlvbiBzZXR0ZXJHZXR0ZXIocHJvcCkge1xuXHQgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICBpZiAoTkxbcHJvcF0pIHJldHVybjtcblx0ICBpZiAoZGl2W3Byb3BdIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgIE5MW3Byb3BdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMTEgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjExKSwgX2tleTExID0gMDsgX2tleTExIDwgX2xlbjExOyBfa2V5MTErKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTExXSA9IGFyZ3VtZW50c1tfa2V5MTFdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHZhciByZXR1cm5UaGlzID0gdHJ1ZTtcblx0ICAgICAgZm9yICh2YXIgaSBpbiBOTCkge1xuXHQgICAgICAgIHZhciBlbCA9IE5MW2ldO1xuXHQgICAgICAgIGlmIChlbCAmJiBlbFtwcm9wXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICAgICAgICBlbCA9IGVsW3Byb3BdLmFwcGx5KGVsLCBhcmdzKTtcblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICAgIGlmIChyZXR1cm5UaGlzICYmIGVsICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuVGhpcyA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBhcnIucHVzaCh1bmRlZmluZWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gcmV0dXJuVGhpcyA/IF90aGlzMyA6IGZsYXR0ZW4oYXJyLCBfdGhpczMpO1xuXHQgICAgfTtcblx0ICB9IGVsc2Uge1xuXHQgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoTkwsIHByb3AsIHtcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICAgICAgdmFyIGFyciA9IFtdO1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICBlbCA9IGVsW3Byb3BdO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgYXJyLnB1c2goZWwpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKGVsICYmIHByb3AgaW4gZWwpIHtcblx0ICAgICAgICAgICAgZWxbcHJvcF0gPSB2YWx1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgfVxuXHR9XG5cdGZvciAodmFyIHByb3AgaW4gZGl2KSB7XG5cdCAgc2V0dGVyR2V0dGVyKHByb3ApO1xuXHR9ZnVuY3Rpb24gTm9kZUxpc3RKUygpIHtcblx0ICBmb3IgKHZhciBfbGVuMTIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjEyKSwgX2tleTEyID0gMDsgX2tleTEyIDwgX2xlbjEyOyBfa2V5MTIrKykge1xuXHQgICAgYXJnc1tfa2V5MTJdID0gYXJndW1lbnRzW19rZXkxMl07XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gbmV3IE5vZGVMaXN0KGFyZ3MpO1xuXHR9XG5cdHdpbmRvdy5OTCA9IE5vZGVMaXN0SlM7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSBOb2RlTGlzdEpTO1xuXG4vKioqLyB9LFxuLyogMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgJE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNykuT2JqZWN0O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2Mpe1xuXHQgIHJldHVybiAkT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHQvLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuXHQkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSwgJ09iamVjdCcsIHtkZWZpbmVQcm9wZXJ0eTogX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZn0pO1xuXG4vKioqLyB9LFxuLyogNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGdsb2JhbCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIGNvcmUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIGN0eCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oOClcblx0ICAsIGhpZGUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblx0XG5cdHZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcblx0ICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuXHQgICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG5cdCAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcblx0ICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuXHQgICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG5cdCAgICAsIElTX1dSQVAgICA9IHR5cGUgJiAkZXhwb3J0Lldcblx0ICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcblx0ICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdXG5cdCAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV1cblx0ICAgICwga2V5LCBvd24sIG91dDtcblx0ICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcblx0ICBmb3Ioa2V5IGluIHNvdXJjZSl7XG5cdCAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcblx0ICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG5cdCAgICBpZihvd24gJiYga2V5IGluIGV4cG9ydHMpY29udGludWU7XG5cdCAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuXHQgICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcblx0ICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuXHQgICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cblx0ICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG5cdCAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuXHQgICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcblx0ICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24oQyl7XG5cdCAgICAgIHZhciBGID0gZnVuY3Rpb24oYSwgYiwgYyl7XG5cdCAgICAgICAgaWYodGhpcyBpbnN0YW5jZW9mIEMpe1xuXHQgICAgICAgICAgc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe1xuXHQgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQztcblx0ICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEMoYSk7XG5cdCAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuXHQgICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG5cdCAgICAgICAgfSByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICB9O1xuXHQgICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG5cdCAgICAgIHJldHVybiBGO1xuXHQgICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG5cdCAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG5cdCAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSVcblx0ICAgIGlmKElTX1BST1RPKXtcblx0ICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuXHQgICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuXHQgICAgICBpZih0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKWhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cdC8vIHR5cGUgYml0bWFwXG5cdCRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG5cdCRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG5cdCRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG5cdCRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cblx0JGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG5cdCRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuXHQkZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcblx0JGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgIFxuXHRtb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG5cbi8qKiovIH0sXG4vKiA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxuXHR2YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcblx0ICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdGlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbi8qKiovIH0sXG4vKiA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHR2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuXHRpZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuLyoqKi8gfSxcbi8qIDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xuXHR2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcblx0ICBhRnVuY3Rpb24oZm4pO1xuXHQgIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG5cdCAgc3dpdGNoKGxlbmd0aCl7XG5cdCAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcblx0ICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG5cdCAgICB9O1xuXHQgICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG5cdCAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuXHQgICAgfTtcblx0ICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuXHQgICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcblx0ICAgIH07XG5cdCAgfVxuXHQgIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcblx0ICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuXHQgIH07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZFAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCBjcmVhdGVEZXNjID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSkgPyBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuXHQgIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG5cdH0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuXHQgIG9iamVjdFtrZXldID0gdmFsdWU7XG5cdCAgcmV0dXJuIG9iamVjdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDExICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgYW5PYmplY3QgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuXHQgICwgSUU4X0RPTV9ERUZJTkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KVxuXHQgICwgdG9QcmltaXRpdmUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KVxuXHQgICwgZFAgICAgICAgICAgICAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdFxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuXHQgIGFuT2JqZWN0KE8pO1xuXHQgIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcblx0ICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcblx0ICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuXHQgICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuXHQgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblx0ICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcblx0ICBpZigndmFsdWUnIGluIEF0dHJpYnV0ZXMpT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG5cdCAgcmV0dXJuIE87XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gIV9fd2VicGFja19yZXF1aXJlX18oMTUpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KShmdW5jdGlvbigpe1xuXHQgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX3JlcXVpcmVfXygxNykoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDE1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5cdG1vZHVsZS5leHBvcnRzID0gIV9fd2VicGFja19yZXF1aXJlX18oMTYpKGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcblx0fSk7XG5cbi8qKiovIH0sXG4vKiAxNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcblx0ICB0cnkge1xuXHQgICAgcmV0dXJuICEhZXhlYygpO1xuXHQgIH0gY2F0Y2goZSl7XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMylcblx0ICAsIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5kb2N1bWVudFxuXHQgIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuXHQgICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHQvLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuXHQvLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBTKXtcblx0ICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcblx0ICB2YXIgZm4sIHZhbDtcblx0ICBpZihTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG5cdCAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG5cdCAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG5cdCAgcmV0dXJuIHtcblx0ICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcblx0ICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcblx0ICAgIHdyaXRhYmxlICAgIDogIShiaXRtYXAgJiA0KSxcblx0ICAgIHZhbHVlICAgICAgIDogdmFsdWVcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX193ZWJwYWNrX3JlcXVpcmVfXygyMSksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1MSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSkuZignaXRlcmF0b3InKTtcblxuLyoqKi8gfSxcbi8qIDIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciAkYXQgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMykodHJ1ZSk7XG5cdFxuXHQvLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5cdF9fd2VicGFja19yZXF1aXJlX18oMjYpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcblx0ICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG5cdCAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcblx0Ly8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxuXHR9LCBmdW5jdGlvbigpe1xuXHQgIHZhciBPICAgICA9IHRoaXMuX3Rcblx0ICAgICwgaW5kZXggPSB0aGlzLl9pXG5cdCAgICAsIHBvaW50O1xuXHQgIGlmKGluZGV4ID49IE8ubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG5cdCAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuXHQgIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuXHQgIHJldHVybiB7dmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZX07XG5cdH0pO1xuXG4vKioqLyB9LFxuLyogMjMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgZGVmaW5lZCAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cdC8vIHRydWUgIC0+IFN0cmluZyNhdFxuXHQvLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuXHQgIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuXHQgICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcblx0ICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcblx0ICAgICAgLCBsID0gcy5sZW5ndGhcblx0ICAgICAgLCBhLCBiO1xuXHQgICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcblx0ICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG5cdCAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuXHQgICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuXHQgICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIDcuMS40IFRvSW50ZWdlclxuXHR2YXIgY2VpbCAgPSBNYXRoLmNlaWxcblx0ICAsIGZsb29yID0gTWF0aC5mbG9vcjtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYoaXQgPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgTElCUkFSWSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KVxuXHQgICwgJGV4cG9ydCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCByZWRlZmluZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpXG5cdCAgLCBoaWRlICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBJdGVyYXRvcnMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzApXG5cdCAgLCAkaXRlckNyZWF0ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpXG5cdCAgLCBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpXG5cdCAgLCBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oNDkpXG5cdCAgLCBJVEVSQVRPUiAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpKCdpdGVyYXRvcicpXG5cdCAgLCBCVUdHWSAgICAgICAgICA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKSAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG5cdCAgLCBGRl9JVEVSQVRPUiAgICA9ICdAQGl0ZXJhdG9yJ1xuXHQgICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcblx0ICAsIFZBTFVFUyAgICAgICAgID0gJ3ZhbHVlcyc7XG5cdFxuXHR2YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpe1xuXHQgICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblx0ICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG5cdCAgICBpZighQlVHR1kgJiYga2luZCBpbiBwcm90bylyZXR1cm4gcHJvdG9ba2luZF07XG5cdCAgICBzd2l0Y2goa2luZCl7XG5cdCAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcblx0ICB9O1xuXHQgIHZhciBUQUcgICAgICAgID0gTkFNRSArICcgSXRlcmF0b3InXG5cdCAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuXHQgICAgLCBWQUxVRVNfQlVHID0gZmFsc2Vcblx0ICAgICwgcHJvdG8gICAgICA9IEJhc2UucHJvdG90eXBlXG5cdCAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cblx0ICAgICwgJGRlZmF1bHQgICA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpXG5cdCAgICAsICRlbnRyaWVzICAgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkXG5cdCAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG5cdCAgICAsIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG5cdCAgLy8gRml4IG5hdGl2ZVxuXHQgIGlmKCRhbnlOYXRpdmUpe1xuXHQgICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UpKTtcblx0ICAgIGlmKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKXtcblx0ICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuXHQgICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcblx0ICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG5cdCAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcblx0ICBpZihERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpe1xuXHQgICAgVkFMVUVTX0JVRyA9IHRydWU7XG5cdCAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuXHQgIH1cblx0ICAvLyBEZWZpbmUgaXRlcmF0b3Jcblx0ICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG5cdCAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuXHQgIH1cblx0ICAvLyBQbHVnIGZvciBsaWJyYXJ5XG5cdCAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG5cdCAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcblx0ICBpZihERUZBVUxUKXtcblx0ICAgIG1ldGhvZHMgPSB7XG5cdCAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuXHQgICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG5cdCAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG5cdCAgICB9O1xuXHQgICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG5cdCAgICAgIGlmKCEoa2V5IGluIHByb3RvKSlyZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuXHQgICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcblx0ICB9XG5cdCAgcmV0dXJuIG1ldGhvZHM7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB0cnVlO1xuXG4vKioqLyB9LFxuLyogMjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5cbi8qKiovIH0sXG4vKiAyOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG5cdCAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLyoqKi8gfSxcbi8qIDMxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciBjcmVhdGUgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpXG5cdCAgLCBkZXNjcmlwdG9yICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpXG5cdCAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXHRcblx0Ly8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMCkoSXRlcmF0b3JQcm90b3R5cGUsIF9fd2VicGFja19yZXF1aXJlX18oNDgpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KXtcblx0ICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG5cdCAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG5cdHZhciBhbk9iamVjdCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCBkUHMgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzMpXG5cdCAgLCBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpXG5cdCAgLCBJRV9QUk9UTyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpKCdJRV9QUk9UTycpXG5cdCAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cblx0ICAsIFBST1RPVFlQRSAgID0gJ3Byb3RvdHlwZSc7XG5cdFxuXHQvLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG5cdHZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24oKXtcblx0ICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuXHQgIHZhciBpZnJhbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KSgnaWZyYW1lJylcblx0ICAgICwgaSAgICAgID0gZW51bUJ1Z0tleXMubGVuZ3RoXG5cdCAgICAsIGx0ICAgICA9ICc8J1xuXHQgICAgLCBndCAgICAgPSAnPidcblx0ICAgICwgaWZyYW1lRG9jdW1lbnQ7XG5cdCAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXyg0NikuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblx0ICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG5cdCAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcblx0ICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG5cdCAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcblx0ICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG5cdCAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuXHQgIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG5cdCAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG5cdCAgd2hpbGUoaS0tKWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuXHQgIHJldHVybiBjcmVhdGVEaWN0KCk7XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuXHQgIHZhciByZXN1bHQ7XG5cdCAgaWYoTyAhPT0gbnVsbCl7XG5cdCAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG5cdCAgICByZXN1bHQgPSBuZXcgRW1wdHk7XG5cdCAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcblx0ICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcblx0ICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuXHQgIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG5cdCAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAzMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRQICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSlcblx0ICAsIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIGdldEtleXMgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpe1xuXHQgIGFuT2JqZWN0KE8pO1xuXHQgIHZhciBrZXlzICAgPSBnZXRLZXlzKFByb3BlcnRpZXMpXG5cdCAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG5cdCAgICAsIGkgPSAwXG5cdCAgICAsIFA7XG5cdCAgd2hpbGUobGVuZ3RoID4gaSlkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuXHQgIHJldHVybiBPO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxuXHR2YXIgJGtleXMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KVxuXHQgICwgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKXtcblx0ICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBoYXMgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgdG9JT2JqZWN0ICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIGFycmF5SW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMzkpKGZhbHNlKVxuXHQgICwgSUVfUFJPVE8gICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MikoJ0lFX1BST1RPJyk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgbmFtZXMpe1xuXHQgIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuXHQgICAgLCBpICAgICAgPSAwXG5cdCAgICAsIHJlc3VsdCA9IFtdXG5cdCAgICAsIGtleTtcblx0ICBmb3Ioa2V5IGluIE8paWYoa2V5ICE9IElFX1BST1RPKWhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG5cdCAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuXHQgIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKXtcblx0ICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfVxuXHQgIHJldHVybiByZXN1bHQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG5cdHZhciBJT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNylcblx0ICAsIGRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5cdHZhciBjb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAzOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcblx0Ly8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcblx0dmFyIHRvSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b0xlbmd0aCAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQwKVxuXHQgICwgdG9JbmRleCAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuXHQgIHJldHVybiBmdW5jdGlvbigkdGhpcywgZWwsIGZyb21JbmRleCl7XG5cdCAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuXHQgICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuXHQgICAgICAsIGluZGV4ICA9IHRvSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpXG5cdCAgICAgICwgdmFsdWU7XG5cdCAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG5cdCAgICBpZihJU19JTkNMVURFUyAmJiBlbCAhPSBlbCl3aGlsZShsZW5ndGggPiBpbmRleCl7XG5cdCAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcblx0ICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG5cdCAgICAvLyBBcnJheSN0b0luZGV4IGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG5cdCAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcblx0ICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuXHQgICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuXHQgIH07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjE1IFRvTGVuZ3RoXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgbWluICAgICAgID0gTWF0aC5taW47XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpXG5cdCAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuXHQgICwgbWluICAgICAgID0gTWF0aC5taW47XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG5cdCAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuXHQgIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKSgna2V5cycpXG5cdCAgLCB1aWQgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuXHQgIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG5cdCAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHR2YXIgaWQgPSAwXG5cdCAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcblx0bW9kdWxlLmV4cG9ydHMgPSAoXG5cdCAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcblx0KS5zcGxpdCgnLCcpO1xuXG4vKioqLyB9LFxuLyogNDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbi8qKiovIH0sXG4vKiA0NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRlZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpLmZcblx0ICAsIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBUQUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgndG9TdHJpbmdUYWcnKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIHRhZywgc3RhdCl7XG5cdCAgaWYoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSlkZWYoaXQsIFRBRywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZ30pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBzdG9yZSAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MykoJ3drcycpXG5cdCAgLCB1aWQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NClcblx0ICAsIFN5bWJvbCAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLlN5bWJvbFxuXHQgICwgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblx0XG5cdHZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XG5cdCAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG5cdCAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xuXHR9O1xuXHRcblx0JGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcblxuLyoqKi8gfSxcbi8qIDQ5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxuXHR2YXIgaGFzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgdG9PYmplY3QgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKVxuXHQgICwgSUVfUFJPVE8gICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKSgnSUVfUFJPVE8nKVxuXHQgICwgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oTyl7XG5cdCAgTyA9IHRvT2JqZWN0KE8pO1xuXHQgIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuXHQgIGlmKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3Ipe1xuXHQgICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuXHQgIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxuXHR2YXIgZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDUxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDUyKTtcblx0dmFyIGdsb2JhbCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBoaWRlICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMClcblx0ICAsIEl0ZXJhdG9ycyAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgVE9fU1RSSU5HX1RBRyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpKCd0b1N0cmluZ1RhZycpO1xuXHRcblx0Zm9yKHZhciBjb2xsZWN0aW9ucyA9IFsnTm9kZUxpc3QnLCAnRE9NVG9rZW5MaXN0JywgJ01lZGlhTGlzdCcsICdTdHlsZVNoZWV0TGlzdCcsICdDU1NSdWxlTGlzdCddLCBpID0gMDsgaSA8IDU7IGkrKyl7XG5cdCAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuXHQgICAgLCBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdXG5cdCAgICAsIHByb3RvICAgICAgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuXHQgIGlmKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSloaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcblx0ICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDUyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdHZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mylcblx0ICAsIHN0ZXAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0KVxuXHQgICwgSXRlcmF0b3JzICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzApXG5cdCAgLCB0b0lPYmplY3QgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7XG5cdFxuXHQvLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG5cdC8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG5cdC8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcblx0Ly8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNikoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcblx0ICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG5cdCAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcblx0ICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuXHQvLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcblx0fSwgZnVuY3Rpb24oKXtcblx0ICB2YXIgTyAgICAgPSB0aGlzLl90XG5cdCAgICAsIGtpbmQgID0gdGhpcy5fa1xuXHQgICAgLCBpbmRleCA9IHRoaXMuX2krKztcblx0ICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG5cdCAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuXHQgICAgcmV0dXJuIHN0ZXAoMSk7XG5cdCAgfVxuXHQgIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuXHQgIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuXHQgIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcblx0fSwgJ3ZhbHVlcycpO1xuXHRcblx0Ly8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuXHRJdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXHRcblx0YWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuXHRhZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcblx0YWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG4vKioqLyB9LFxuLyogNTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfTtcblxuLyoqKi8gfSxcbi8qIDU0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcblx0ICByZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDU1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KTtcblxuLyoqKi8gfSxcbi8qIDU2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oNTcpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiA1NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1OCk7XG5cdHZhciAkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5PYmplY3Q7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1OSkoJ2dldE93blByb3BlcnR5TmFtZXMnLCBmdW5jdGlvbigpe1xuXHQgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwKS5mO1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDU5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCBjb3JlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuXHQgICwgZmFpbHMgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG5cdCAgdmFyIGZuICA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXVxuXHQgICAgLCBleHAgPSB7fTtcblx0ICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuXHQgICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24oKXsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG5cdHZhciB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KVxuXHQgICwgZ09QTiAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MSkuZlxuXHQgICwgdG9TdHJpbmcgID0ge30udG9TdHJpbmc7XG5cdFxuXHR2YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuXHQgID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXHRcblx0dmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHRyeSB7XG5cdCAgICByZXR1cm4gZ09QTihpdCk7XG5cdCAgfSBjYXRjaChlKXtcblx0ICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuXHQgIH1cblx0fTtcblx0XG5cdG1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcblx0ICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiA2MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuXHR2YXIgJGtleXMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzUpXG5cdCAgLCBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSkuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cdFxuXHRleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pe1xuXHQgIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDYyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG5cdCAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcblx0ICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNjMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHRcblx0dmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZpbmVQcm9wZXJ0eSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuXHQgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuXHQgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG5cdCAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcblx0ICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcblx0ICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG5cdCAgICB9XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuXHQgICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcblx0ICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuXHQgICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuXHQgIH07XG5cdH0oKTtcblxuLyoqKi8gfSxcbi8qIDY0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHQvKipcclxuXHQgKiBBcnJheS5maW5kXHJcblx0ICovXG5cdGlmICghQXJyYXkucHJvdG90eXBlLmZpbmQpIHtcblx0ICBBcnJheS5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHtcblx0ICAgICd1c2Ugc3RyaWN0Jztcblx0XG5cdCAgICBpZiAodGhpcyA9PSBudWxsKSB7XG5cdCAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5maW5kIGNhbGxlZCBvbiBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHQgICAgfVxuXHQgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHQgICAgfVxuXHQgICAgdmFyIGxpc3QgPSBPYmplY3QodGhpcyk7XG5cdCAgICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGggPj4+IDA7XG5cdCAgICB2YXIgdGhpc0FyZyA9IGFyZ3VtZW50c1sxXTtcblx0ICAgIHZhciB2YWx1ZTtcblx0XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIHZhbHVlID0gbGlzdFtpXTtcblx0ICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpLCBsaXN0KSkge1xuXHQgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHVuZGVmaW5lZDtcblx0ICB9O1xuXHR9XG5cdFxuXHQvKlxyXG5cdCAqIGNsYXNzTGlzdC5qczogQ3Jvc3MtYnJvd3NlciBmdWxsIGVsZW1lbnQuY2xhc3NMaXN0IGltcGxlbWVudGF0aW9uLlxyXG5cdCAqIDEuMS4yMDE1MDMxMlxyXG5cdCAqXHJcblx0ICogQnkgRWxpIEdyZXksIGh0dHA6Ly9lbGlncmV5LmNvbVxyXG5cdCAqIExpY2Vuc2U6IERlZGljYXRlZCB0byB0aGUgcHVibGljIGRvbWFpbi5cclxuXHQgKiAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZFxyXG5cdCAqL1xuXHQvKmdsb2JhbCBzZWxmLCBkb2N1bWVudCwgRE9NRXhjZXB0aW9uICovXG5cdC8qISBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvY2xhc3NMaXN0LmpzICovXG5cdGlmIChcImRvY3VtZW50XCIgaW4gc2VsZikge1xuXHQgIC8vIEZ1bGwgcG9seWZpbGwgZm9yIGJyb3dzZXJzIHdpdGggbm8gY2xhc3NMaXN0IHN1cHBvcnRcblx0ICAvLyBJbmNsdWRpbmcgSUUgPCBFZGdlIG1pc3NpbmcgU1ZHRWxlbWVudC5jbGFzc0xpc3Rcblx0ICBpZiAoIShcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJfXCIpKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgJiYgIShcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKSkpIHtcblx0XG5cdCAgICAoZnVuY3Rpb24gKHZpZXcpIHtcblx0XG5cdCAgICAgIFwidXNlIHN0cmljdFwiO1xuXHRcblx0ICAgICAgaWYgKCEoJ0VsZW1lbnQnIGluIHZpZXcpKSByZXR1cm47XG5cdFxuXHQgICAgICB2YXIgY2xhc3NMaXN0UHJvcCA9IFwiY2xhc3NMaXN0XCIsXG5cdCAgICAgICAgICBwcm90b1Byb3AgPSBcInByb3RvdHlwZVwiLFxuXHQgICAgICAgICAgZWxlbUN0clByb3RvID0gdmlldy5FbGVtZW50W3Byb3RvUHJvcF0sXG5cdCAgICAgICAgICBvYmpDdHIgPSBPYmplY3QsXG5cdCAgICAgICAgICBzdHJUcmltID0gU3RyaW5nW3Byb3RvUHJvcF0udHJpbSB8fCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgXCJcIik7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBhcnJJbmRleE9mID0gQXJyYXlbcHJvdG9Qcm9wXS5pbmRleE9mIHx8IGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICAgICAgdmFyIGkgPSAwLFxuXHQgICAgICAgICAgICBsZW4gPSB0aGlzLmxlbmd0aDtcblx0ICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICBpZiAoaSBpbiB0aGlzICYmIHRoaXNbaV0gPT09IGl0ZW0pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgfVxuXHQgICAgICAvLyBWZW5kb3JzOiBwbGVhc2UgYWxsb3cgY29udGVudCBjb2RlIHRvIGluc3RhbnRpYXRlIERPTUV4Y2VwdGlvbnNcblx0ICAgICAgLFxuXHQgICAgICAgICAgRE9NRXggPSBmdW5jdGlvbiBET01FeCh0eXBlLCBtZXNzYWdlKSB7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gdHlwZTtcblx0ICAgICAgICB0aGlzLmNvZGUgPSBET01FeGNlcHRpb25bdHlwZV07XG5cdCAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0ICAgICAgfSxcblx0ICAgICAgICAgIGNoZWNrVG9rZW5BbmRHZXRJbmRleCA9IGZ1bmN0aW9uIGNoZWNrVG9rZW5BbmRHZXRJbmRleChjbGFzc0xpc3QsIHRva2VuKSB7XG5cdCAgICAgICAgaWYgKHRva2VuID09PSBcIlwiKSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXCJTWU5UQVhfRVJSXCIsIFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkXCIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoL1xccy8udGVzdCh0b2tlbikpIHtcblx0ICAgICAgICAgIHRocm93IG5ldyBET01FeChcIklOVkFMSURfQ0hBUkFDVEVSX0VSUlwiLCBcIlN0cmluZyBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3RlclwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGFyckluZGV4T2YuY2FsbChjbGFzc0xpc3QsIHRva2VuKTtcblx0ICAgICAgfSxcblx0ICAgICAgICAgIENsYXNzTGlzdCA9IGZ1bmN0aW9uIENsYXNzTGlzdChlbGVtKSB7XG5cdCAgICAgICAgdmFyIHRyaW1tZWRDbGFzc2VzID0gc3RyVHJpbS5jYWxsKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiksXG5cdCAgICAgICAgICAgIGNsYXNzZXMgPSB0cmltbWVkQ2xhc3NlcyA/IHRyaW1tZWRDbGFzc2VzLnNwbGl0KC9cXHMrLykgOiBbXSxcblx0ICAgICAgICAgICAgaSA9IDAsXG5cdCAgICAgICAgICAgIGxlbiA9IGNsYXNzZXMubGVuZ3RoO1xuXHQgICAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgIHRoaXMucHVzaChjbGFzc2VzW2ldKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLnRvU3RyaW5nKCkpO1xuXHQgICAgICAgIH07XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBjbGFzc0xpc3RQcm90byA9IENsYXNzTGlzdFtwcm90b1Byb3BdID0gW10sXG5cdCAgICAgICAgICBjbGFzc0xpc3RHZXR0ZXIgPSBmdW5jdGlvbiBjbGFzc0xpc3RHZXR0ZXIoKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0xpc3QodGhpcyk7XG5cdCAgICAgIH07XG5cdCAgICAgIC8vIE1vc3QgRE9NRXhjZXB0aW9uIGltcGxlbWVudGF0aW9ucyBkb24ndCBhbGxvdyBjYWxsaW5nIERPTUV4Y2VwdGlvbidzIHRvU3RyaW5nKClcblx0ICAgICAgLy8gb24gbm9uLURPTUV4Y2VwdGlvbnMuIEVycm9yJ3MgdG9TdHJpbmcoKSBpcyBzdWZmaWNpZW50IGhlcmUuXG5cdCAgICAgIERPTUV4W3Byb3RvUHJvcF0gPSBFcnJvcltwcm90b1Byb3BdO1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5pdGVtID0gZnVuY3Rpb24gKGkpIHtcblx0ICAgICAgICByZXR1cm4gdGhpc1tpXSB8fCBudWxsO1xuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5jb250YWlucyA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIHRva2VuICs9IFwiXCI7XG5cdCAgICAgICAgcmV0dXJuIGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbikgIT09IC0xO1xuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by5hZGQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHRva2VucyA9IGFyZ3VtZW50cyxcblx0ICAgICAgICAgICAgaSA9IDAsXG5cdCAgICAgICAgICAgIGwgPSB0b2tlbnMubGVuZ3RoLFxuXHQgICAgICAgICAgICB0b2tlbixcblx0ICAgICAgICAgICAgdXBkYXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIGRvIHtcblx0ICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcblx0ICAgICAgICAgIGlmIChjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pID09PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLnB1c2godG9rZW4pO1xuXHQgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IHdoaWxlICgrK2kgPCBsKTtcblx0XG5cdCAgICAgICAgaWYgKHVwZGF0ZWQpIHtcblx0ICAgICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbnMgPSBhcmd1bWVudHMsXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsID0gdG9rZW5zLmxlbmd0aCxcblx0ICAgICAgICAgICAgdG9rZW4sXG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcblx0ICAgICAgICAgICAgaW5kZXg7XG5cdCAgICAgICAgZG8ge1xuXHQgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV0gKyBcIlwiO1xuXHQgICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgd2hpbGUgKGluZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLnNwbGljZShpbmRleCwgMSk7XG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSB3aGlsZSAoKytpIDwgbCk7XG5cdFxuXHQgICAgICAgIGlmICh1cGRhdGVkKSB7XG5cdCAgICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIGNsYXNzTGlzdFByb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uICh0b2tlbiwgZm9yY2UpIHtcblx0ICAgICAgICB0b2tlbiArPSBcIlwiO1xuXHRcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jb250YWlucyh0b2tlbiksXG5cdCAgICAgICAgICAgIG1ldGhvZCA9IHJlc3VsdCA/IGZvcmNlICE9PSB0cnVlICYmIFwicmVtb3ZlXCIgOiBmb3JjZSAhPT0gZmFsc2UgJiYgXCJhZGRcIjtcblx0XG5cdCAgICAgICAgaWYgKG1ldGhvZCkge1xuXHQgICAgICAgICAgdGhpc1ttZXRob2RdKHRva2VuKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIGlmIChmb3JjZSA9PT0gdHJ1ZSB8fCBmb3JjZSA9PT0gZmFsc2UpIHtcblx0ICAgICAgICAgIHJldHVybiBmb3JjZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5qb2luKFwiIFwiKTtcblx0ICAgICAgfTtcblx0XG5cdCAgICAgIGlmIChvYmpDdHIuZGVmaW5lUHJvcGVydHkpIHtcblx0ICAgICAgICB2YXIgY2xhc3NMaXN0UHJvcERlc2MgPSB7XG5cdCAgICAgICAgICBnZXQ6IGNsYXNzTGlzdEdldHRlcixcblx0ICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBvYmpDdHIuZGVmaW5lUHJvcGVydHkoZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyk7XG5cdCAgICAgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgICAgIC8vIElFIDggZG9lc24ndCBzdXBwb3J0IGVudW1lcmFibGU6dHJ1ZVxuXHQgICAgICAgICAgaWYgKGV4Lm51bWJlciA9PT0gLTB4N0ZGNUVDNTQpIHtcblx0ICAgICAgICAgICAgY2xhc3NMaXN0UHJvcERlc2MuZW51bWVyYWJsZSA9IGZhbHNlO1xuXHQgICAgICAgICAgICBvYmpDdHIuZGVmaW5lUHJvcGVydHkoZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2UgaWYgKG9iakN0cltwcm90b1Byb3BdLl9fZGVmaW5lR2V0dGVyX18pIHtcblx0ICAgICAgICBlbGVtQ3RyUHJvdG8uX19kZWZpbmVHZXR0ZXJfXyhjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RHZXR0ZXIpO1xuXHQgICAgICB9XG5cdCAgICB9KShzZWxmKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgLy8gVGhlcmUgaXMgZnVsbCBvciBwYXJ0aWFsIG5hdGl2ZSBjbGFzc0xpc3Qgc3VwcG9ydCwgc28ganVzdCBjaGVjayBpZiB3ZSBuZWVkXG5cdCAgICAvLyB0byBub3JtYWxpemUgdGhlIGFkZC9yZW1vdmUgYW5kIHRvZ2dsZSBBUElzLlxuXHRcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgIFwidXNlIHN0cmljdFwiO1xuXHRcblx0ICAgICAgdmFyIHRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIl9cIik7XG5cdFxuXHQgICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYzFcIiwgXCJjMlwiKTtcblx0XG5cdCAgICAgIC8vIFBvbHlmaWxsIGZvciBJRSAxMC8xMSBhbmQgRmlyZWZveCA8MjYsIHdoZXJlIGNsYXNzTGlzdC5hZGQgYW5kXG5cdCAgICAgIC8vIGNsYXNzTGlzdC5yZW1vdmUgZXhpc3QgYnV0IHN1cHBvcnQgb25seSBvbmUgYXJndW1lbnQgYXQgYSB0aW1lLlxuXHQgICAgICBpZiAoIXRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImMyXCIpKSB7XG5cdCAgICAgICAgdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZChtZXRob2QpIHtcblx0ICAgICAgICAgIHZhciBvcmlnaW5hbCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGVbbWV0aG9kXTtcblx0XG5cdCAgICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICAgICAgdmFyIGksXG5cdCAgICAgICAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcblx0ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgdG9rZW4gPSBhcmd1bWVudHNbaV07XG5cdCAgICAgICAgICAgICAgb3JpZ2luYWwuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBjcmVhdGVNZXRob2QoJ2FkZCcpO1xuXHQgICAgICAgIGNyZWF0ZU1ldGhvZCgncmVtb3ZlJyk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHRlc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoXCJjM1wiLCBmYWxzZSk7XG5cdFxuXHQgICAgICAvLyBQb2x5ZmlsbCBmb3IgSUUgMTAgYW5kIEZpcmVmb3ggPDI0LCB3aGVyZSBjbGFzc0xpc3QudG9nZ2xlIGRvZXMgbm90XG5cdCAgICAgIC8vIHN1cHBvcnQgdGhlIHNlY29uZCBhcmd1bWVudC5cblx0ICAgICAgaWYgKHRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImMzXCIpKSB7XG5cdCAgICAgICAgdmFyIF90b2dnbGUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZTtcblx0XG5cdCAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4sIGZvcmNlKSB7XG5cdCAgICAgICAgICBpZiAoMSBpbiBhcmd1bWVudHMgJiYgIXRoaXMuY29udGFpbnModG9rZW4pID09PSAhZm9yY2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZvcmNlO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIF90b2dnbGUuY2FsbCh0aGlzLCB0b2tlbik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdGVzdEVsZW1lbnQgPSBudWxsO1xuXHQgICAgfSkoKTtcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0ZXhwb3J0cy5nZXRKU09OID0gZ2V0SlNPTjtcblx0ZXhwb3J0cy5nZXRTY3JvbGxCYXJXaWR0aCA9IGdldFNjcm9sbEJhcldpZHRoO1xuXHRleHBvcnRzLnRyYW5zbGF0aW9ucyA9IHRyYW5zbGF0aW9ucztcblx0ZXhwb3J0cy5kZWxheWVyID0gZGVsYXllcjtcblx0ZXhwb3J0cy5WdWVGaXhlciA9IFZ1ZUZpeGVyO1xuXHQvLyBjb2VyY2UgY29udmVydCBzb20gdHlwZXMgb2YgZGF0YSBpbnRvIGFub3RoZXIgdHlwZVxuXHR2YXIgY29lcmNlID0gZXhwb3J0cy5jb2VyY2UgPSB7XG5cdCAgLy8gQ29udmVydCBhIHN0cmluZyB0byBib29sZWFtLiBPdGhlcndpc2UsIHJldHVybiB0aGUgdmFsdWUgd2l0aG91dCBtb2RpZmljYXRpb24sIHNvIGlmIGlzIG5vdCBib29sZWFuLCBWdWUgdGhyb3cgYSB3YXJuaW5nLlxuXHQgIGJvb2xlYW46IGZ1bmN0aW9uIGJvb2xlYW4odmFsKSB7XG5cdCAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwgPT09ICcnIHx8IHZhbCA9PT0gJ3RydWUnID8gdHJ1ZSA6IHZhbCA9PT0gJ2ZhbHNlJyB8fCB2YWwgPT09ICdudWxsJyB8fCB2YWwgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiB2YWwgOiB2YWw7XG5cdCAgfSxcblx0ICAvLyBBdHRlbXB0IHRvIGNvbnZlcnQgYSBzdHJpbmcgdmFsdWUgdG8gYSBOdW1iZXIuIE90aGVyd2lzZSwgcmV0dXJuIDAuXG5cdCAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsKSB7XG5cdCAgICB2YXIgYWx0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuXHQgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInID8gdmFsIDogdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsIHx8IGlzTmFOKE51bWJlcih2YWwpKSA/IGFsdCA6IE51bWJlcih2YWwpO1xuXHQgIH0sXG5cdCAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IHRvIHN0cmluZyBhbnkgdmFsdWUsIGV4Y2VwdCBmb3IgbnVsbCBvciB1bmRlZmluZWQuXG5cdCAgc3RyaW5nOiBmdW5jdGlvbiBzdHJpbmcodmFsKSB7XG5cdCAgICByZXR1cm4gdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsID8gJycgOiB2YWwgKyAnJztcblx0ICB9LFxuXHQgIC8vIFBhdHRlcm4gYWNjZXB0IFJlZ0V4cCwgZnVuY3Rpb24sIG9yIHN0cmluZyAoY29udmVydGVkIHRvIFJlZ0V4cCkuIE90aGVyd2lzZSByZXR1cm4gbnVsbC5cblx0ICBwYXR0ZXJuOiBmdW5jdGlvbiBwYXR0ZXJuKHZhbCkge1xuXHQgICAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IHZhbCBpbnN0YW5jZW9mIFJlZ0V4cCA/IHZhbCA6IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gbmV3IFJlZ0V4cCh2YWwpIDogbnVsbDtcblx0ICB9XG5cdH07XG5cdFxuXHRmdW5jdGlvbiBnZXRKU09OKHVybCkge1xuXHQgIHZhciByZXF1ZXN0ID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHQgIHZhciBkYXRhID0ge307XG5cdCAgLy8gcCAoLXNpbXVsYXRlZC0gcHJvbWlzZSlcblx0ICB2YXIgcCA9IHtcblx0ICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4oZm4xLCBmbjIpIHtcblx0ICAgICAgcmV0dXJuIHAuZG9uZShmbjEpLmZhaWwoZm4yKTtcblx0ICAgIH0sXG5cdCAgICBjYXRjaDogZnVuY3Rpb24gX2NhdGNoKGZuKSB7XG5cdCAgICAgIHJldHVybiBwLmZhaWwoZm4pO1xuXHQgICAgfSxcblx0ICAgIGFsd2F5czogZnVuY3Rpb24gYWx3YXlzKGZuKSB7XG5cdCAgICAgIHJldHVybiBwLmRvbmUoZm4pLmZhaWwoZm4pO1xuXHQgICAgfVxuXHQgIH07XG5cdCAgWydkb25lJywgJ2ZhaWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICBkYXRhW25hbWVdID0gW107XG5cdCAgICBwW25hbWVdID0gZnVuY3Rpb24gKGZuKSB7XG5cdCAgICAgIGlmIChmbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSBkYXRhW25hbWVdLnB1c2goZm4pO1xuXHQgICAgICByZXR1cm4gcDtcblx0ICAgIH07XG5cdCAgfSk7XG5cdCAgcC5kb25lKEpTT04ucGFyc2UpO1xuXHQgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSA9PT0gNCkge1xuXHQgICAgICB2YXIgcmVzcG9uc2U7XG5cdCAgICAgIHZhciBpO1xuXHQgICAgICB2YXIgdmFsdWU7XG5cdFxuXHQgICAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBlID0geyBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzIH07XG5cdCAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0ICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIHJlc3BvbnNlID0gcmVxdWVzdC5yZXNwb25zZVRleHQ7XG5cdFxuXHQgICAgICAgICAgICBmb3IgKGkgaW4gZGF0YS5kb25lKSB7XG5cdCAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhLmRvbmVbaV0ocmVzcG9uc2UpO1xuXHRcblx0ICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB2YWx1ZTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICBkYXRhLmZhaWwuZm9yRWFjaChmdW5jdGlvbiAoZmFpbCkge1xuXHQgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBkYXRhLmZhaWwuZm9yRWFjaChmdW5jdGlvbiAoZmFpbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFpbChlKTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSkoKTtcblx0ICAgIH1cblx0ICB9O1xuXHQgIHJlcXVlc3Qub3BlbignR0VUJywgdXJsKTtcblx0ICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG5cdCAgcmVxdWVzdC5zZW5kKCk7XG5cdCAgcmV0dXJuIHA7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGdldFNjcm9sbEJhcldpZHRoKCkge1xuXHQgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IDw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpIHtcblx0ICAgIHJldHVybiAwO1xuXHQgIH1cblx0ICB2YXIgaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cdCAgaW5uZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG5cdCAgaW5uZXIuc3R5bGUuaGVpZ2h0ID0gJzIwMHB4Jztcblx0XG5cdCAgdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdCAgb3V0ZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHQgIG91dGVyLnN0eWxlLnRvcCA9ICcwcHgnO1xuXHQgIG91dGVyLnN0eWxlLmxlZnQgPSAnMHB4Jztcblx0ICBvdXRlci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cdCAgb3V0ZXIuc3R5bGUud2lkdGggPSAnMjAwcHgnO1xuXHQgIG91dGVyLnN0eWxlLmhlaWdodCA9ICcxNTBweCc7XG5cdCAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblx0ICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7XG5cdFxuXHQgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpO1xuXHQgIHZhciB3MSA9IGlubmVyLm9mZnNldFdpZHRoO1xuXHQgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG5cdCAgdmFyIHcyID0gaW5uZXIub2Zmc2V0V2lkdGg7XG5cdCAgaWYgKHcxID09PSB3MikgdzIgPSBvdXRlci5jbGllbnRXaWR0aDtcblx0XG5cdCAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChvdXRlcik7XG5cdFxuXHQgIHJldHVybiB3MSAtIHcyO1xuXHR9XG5cdFxuXHQvLyByZXR1cm4gYWxsIHRoZSB0cmFuc2xhdGlvbnMgb3IgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgKGVuZ2xpc2gpXG5cdGZ1bmN0aW9uIHRyYW5zbGF0aW9ucygpIHtcblx0ICB2YXIgbGFuZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2VuJztcblx0XG5cdCAgdmFyIHRleHQgPSB7XG5cdCAgICBkYXlzT2ZXZWVrOiBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10sXG5cdCAgICBsaW1pdDogJ0xpbWl0IHJlYWNoZWQgKHt7bGltaXR9fSBpdGVtcyBtYXgpLicsXG5cdCAgICBsb2FkaW5nOiAnTG9hZGluZy4uLicsXG5cdCAgICBtaW5MZW5ndGg6ICdNaW4uIExlbmd0aCcsXG5cdCAgICBtb250aHM6IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddLFxuXHQgICAgbm90U2VsZWN0ZWQ6ICdOb3RoaW5nIFNlbGVjdGVkJyxcblx0ICAgIHJlcXVpcmVkOiAnUmVxdWlyZWQnLFxuXHQgICAgc2VhcmNoOiAnU2VhcmNoJyxcblx0ICAgIHNlbGVjdGVkOiAne3tjb3VudH19IHNlbGVjdGVkJ1xuXHQgIH07XG5cdCAgcmV0dXJuIHdpbmRvdy5WdWVTdHJhcExhbmcgPyB3aW5kb3cuVnVlU3RyYXBMYW5nKGxhbmcpIDogdGV4dDtcblx0fVxuXHRcblx0Ly8gZGVsYXllcjogc2V0IGEgZnVuY3Rpb24gdGhhdCBleGVjdXRlIGFmdGVyIGEgZGVsYXlcblx0Ly8gQHBhcmFtcyAoZnVuY3Rpb24sIGRlbGF5X3Byb3Agb3IgdmFsdWUsIGRlZmF1bHRfdmFsdWUpXG5cdGZ1bmN0aW9uIGRlbGF5ZXIoZm4sIHZhclRpbWVyKSB7XG5cdCAgdmFyIGlmTmFOID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxMDA7XG5cdFxuXHQgIGZ1bmN0aW9uIHRvSW50KGVsKSB7XG5cdCAgICByZXR1cm4gKC9eWzAtOV0rJC8udGVzdChlbCkgPyBOdW1iZXIoZWwpIHx8IDEgOiBudWxsXG5cdCAgICApO1xuXHQgIH1cblx0ICB2YXIgdGltZXJJZDtcblx0ICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuXHQgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuXHQgICAgfVxuXHRcblx0ICAgIGlmICh0aW1lcklkKSBjbGVhclRpbWVvdXQodGltZXJJZCk7XG5cdCAgICB0aW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGZuLmFwcGx5KF90aGlzLCBhcmdzKTtcblx0ICAgIH0sIHRvSW50KHZhclRpbWVyKSB8fCB0b0ludCh0aGlzW3ZhclRpbWVyXSkgfHwgaWZOYU4pO1xuXHQgIH07XG5cdH1cblx0XG5cdC8vIEZpeCBhIHZ1ZSBpbnN0YW5jZSBMaWZlY3ljbGUgdG8gdnVlIDEvMiAoanVzdCB0aGUgYmFzaWMgZWxlbWVudHMsIGlzIG5vdCBhIHJlYWwgcGFyc2VyLCBzbyB0aGlzIHdvcmsgb25seSBpZiB5b3VyIGNvZGUgaXMgY29tcGF0aWJsZSB3aXRoIGJvdGgpXG5cdC8vIChXYWl0aW5nIGZvciB0ZXN0aW5nKVxuXHRmdW5jdGlvbiBWdWVGaXhlcih2dWUpIHtcblx0ICB2YXIgdnVlMiA9ICF3aW5kb3cuVnVlIHx8ICF3aW5kb3cuVnVlLnBhcnRpYWw7XG5cdCAgdmFyIG1peGluID0ge1xuXHQgICAgY29tcHV0ZWQ6IHtcblx0ICAgICAgdnVlMjogZnVuY3Rpb24gdnVlMigpIHtcblx0ICAgICAgICByZXR1cm4gIXRoaXMuJGRpc3BhdGNoO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfTtcblx0ICBpZiAoIXZ1ZTIpIHtcblx0ICAgIC8vdHJhbnNsYXRlIHZ1ZTIgYXR0cmlidXRlcyB0byB2dWUxXG5cdCAgICBpZiAodnVlLmJlZm9yZUNyZWF0ZSkge1xuXHQgICAgICBtaXhpbi5jcmVhdGUgPSB2dWUuYmVmb3JlQ3JlYXRlO1xuXHQgICAgICBkZWxldGUgdnVlLmJlZm9yZUNyZWF0ZTtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUuYmVmb3JlTW91bnQpIHtcblx0ICAgICAgdnVlLmJlZm9yZUNvbXBpbGUgPSB2dWUuYmVmb3JlTW91bnQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUuYmVmb3JlTW91bnQ7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLm1vdW50ZWQpIHtcblx0ICAgICAgdnVlLnJlYWR5ID0gdnVlLm1vdW50ZWQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUubW91bnRlZDtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgLy90cmFuc2xhdGUgdnVlMSBhdHRyaWJ1dGVzIHRvIHZ1ZTJcblx0ICAgIGlmICh2dWUuYmVmb3JlQ29tcGlsZSkge1xuXHQgICAgICB2dWUuYmVmb3JlTW91bnQgPSB2dWUuYmVmb3JlQ29tcGlsZTtcblx0ICAgICAgZGVsZXRlIHZ1ZS5iZWZvcmVDb21waWxlO1xuXHQgICAgfVxuXHQgICAgaWYgKHZ1ZS5jb21waWxlZCkge1xuXHQgICAgICBtaXhpbi5jb21waWxlZCA9IHZ1ZS5jb21waWxlZDtcblx0ICAgICAgZGVsZXRlIHZ1ZS5jb21waWxlZDtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUucmVhZHkpIHtcblx0ICAgICAgdnVlLm1vdW50ZWQgPSB2dWUucmVhZHk7XG5cdCAgICAgIGRlbGV0ZSB2dWUucmVhZHk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGlmICghdnVlLm1peGlucykge1xuXHQgICAgdnVlLm1peGlucyA9IFtdO1xuXHQgIH1cblx0ICB2dWUubWl4aW5zLnVuc2hpZnQobWl4aW4pO1xuXHQgIHJldHVybiB2dWU7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24ocHJvY2Vzcykgeyd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvKipcclxuXHQgKiBDbGljayBvdXRzaWRlIGRpcmVjdGl2ZVxyXG5cdCAqL1xuXHR2YXIgYmluZGVkID0gW107XG5cdFxuXHRmdW5jdGlvbiBoYW5kbGVyKGUpIHtcblx0ICBiaW5kZWQuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgIGlmICghZWwubm9kZS5jb250YWlucyhlLnRhcmdldCkpIGVsLmNhbGxiYWNrKGUpO1xuXHQgIH0pO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBhZGRMaXN0ZW5lcihub2RlLCBjYWxsYmFjaykge1xuXHQgIGlmICghYmluZGVkLmxlbmd0aCkgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG5cdCAgYmluZGVkLnB1c2goeyBub2RlOiBub2RlLCBjYWxsYmFjazogY2FsbGJhY2sgfSk7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGNhbGxiYWNrKSB7XG5cdCAgYmluZGVkID0gYmluZGVkLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgIHJldHVybiBlbC5ub2RlICE9PSBub2RlID8gdHJ1ZSA6ICFjYWxsYmFjayA/IGZhbHNlIDogZWwuY2FsbGJhY2sgIT09IGNhbGxiYWNrO1xuXHQgIH0pO1xuXHQgIGlmICghYmluZGVkLmxlbmd0aCkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG5cdH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBiaW5kOiBmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICBpZiAodHlwZW9mIGJpbmRpbmcudmFsdWUgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcblx0ICAgICAgICBWdWUudXRpbC53YXJuKCdDbGlja091dHNpZGUgb25seSB3b3JrIHdpdGggYSBmdW5jdGlvbiwgcmVjZWl2ZWQ6IHYtJyArIGJpbmRpbmcubmFtZSArICc9XCInICsgYmluZGluZy5leHByZXNzaW9uICsgJ1wiJyk7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGFkZExpc3RlbmVyKGVsLCBiaW5kaW5nLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGVsLCBiaW5kaW5nKSB7XG5cdCAgICBpZiAoYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSkge1xuXHQgICAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy5vbGRWYWx1ZSk7XG5cdCAgICAgIGFkZExpc3RlbmVyKGVsLCBiaW5kaW5nLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgICByZW1vdmVMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgfVxuXHR9O1xuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg2NykpKVxuXG4vKioqLyB9LFxuLyogNjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXHR2YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cdFxuXHQvLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcblx0Ly8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG5cdC8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcblx0Ly8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblx0XG5cdHZhciBjYWNoZWRTZXRUaW1lb3V0O1xuXHR2YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXHRcblx0ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xuXHR9XG5cdGZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcblx0fVxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHQgICAgfVxuXHQgICAgdHJ5IHtcblx0ICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcblx0ICAgICAgICB9XG5cdCAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcblx0ICAgIH1cblx0fSAoKSlcblx0ZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcblx0ICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG5cdCAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG5cdCAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH1cblx0ICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG5cdCAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcblx0ICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcblx0ICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuXHQgICAgfVxuXHQgICAgdHJ5IHtcblx0ICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG5cdCAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH0gY2F0Y2goZSl7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcblx0ICAgICAgICB9IGNhdGNoKGUpe1xuXHQgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHRcblx0XG5cdH1cblx0ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuXHQgICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG5cdCAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG5cdCAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuXHQgICAgfVxuXHQgICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXHQgICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG5cdCAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH0gY2F0Y2ggKGUpe1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG5cdCAgICAgICAgfSBjYXRjaCAoZSl7XG5cdCAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuXHQgICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0XG5cdFxuXHRcblx0fVxuXHR2YXIgcXVldWUgPSBbXTtcblx0dmFyIGRyYWluaW5nID0gZmFsc2U7XG5cdHZhciBjdXJyZW50UXVldWU7XG5cdHZhciBxdWV1ZUluZGV4ID0gLTE7XG5cdFxuXHRmdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG5cdCAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBkcmFpbmluZyA9IGZhbHNlO1xuXHQgICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcblx0ICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG5cdCAgICB9XG5cdCAgICBpZiAocXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgZHJhaW5RdWV1ZSgpO1xuXHQgICAgfVxuXHR9XG5cdFxuXHRmdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuXHQgICAgaWYgKGRyYWluaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG5cdCAgICBkcmFpbmluZyA9IHRydWU7XG5cdFxuXHQgICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICAgIHdoaWxlKGxlbikge1xuXHQgICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuXHQgICAgICAgIHF1ZXVlID0gW107XG5cdCAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuXHQgICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICAgIH1cblx0ICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG5cdCAgICBkcmFpbmluZyA9IGZhbHNlO1xuXHQgICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHR9XG5cdFxuXHRwcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuXHQgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuXHQgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcblx0ICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG5cdCAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcblx0ICAgIH1cblx0fTtcblx0XG5cdC8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcblx0ZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG5cdCAgICB0aGlzLmZ1biA9IGZ1bjtcblx0ICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcblx0fVxuXHRJdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcblx0fTtcblx0cHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcblx0cHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcblx0cHJvY2Vzcy5lbnYgPSB7fTtcblx0cHJvY2Vzcy5hcmd2ID0gW107XG5cdHByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xuXHRwcm9jZXNzLnZlcnNpb25zID0ge307XG5cdFxuXHRmdW5jdGlvbiBub29wKCkge31cblx0XG5cdHByb2Nlc3Mub24gPSBub29wO1xuXHRwcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcblx0cHJvY2Vzcy5vbmNlID0gbm9vcDtcblx0cHJvY2Vzcy5vZmYgPSBub29wO1xuXHRwcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xuXHRwcm9jZXNzLmVtaXQgPSBub29wO1xuXHRcblx0cHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0XG5cdHByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5cdHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuXHR9O1xuXHRwcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cbi8qKiovIH0sXG4vKiA2OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKHByb2Nlc3MpIHsndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0LyoqXHJcblx0ICogQ2xpY2sgb3V0c2lkZSBkaXJlY3RpdmVcclxuXHQgKi9cblx0dmFyIEhBTkRMRVIgPSAnX3Z1ZV9zY3JvbGxfaGFuZGxlcic7XG5cdHZhciBldmVudHMgPSBbJ3Jlc2l6ZScsICdzY3JvbGwnXTtcblx0XG5cdGZ1bmN0aW9uIGJpbmQoZWwsIGJpbmRpbmcpIHtcblx0ICB1bmJpbmQoZWwpO1xuXHRcblx0ICB2YXIgY2FsbGJhY2sgPSBiaW5kaW5nLnZhbHVlO1xuXHQgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG5cdCAgICAgIFZ1ZS51dGlsLndhcm4oJ0NsaWNrT3V0c2lkZSBvbmx5IHdvcmsgd2l0aCBhIGZ1bmN0aW9uIHZhbHVlLCByZWNlaXZlZDogdi0nICsgYmluZGluZy5uYW1lICsgJz1cIicgKyBiaW5kaW5nLmV4cHJlc3Npb24gKyAnXCInKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgZWxbSEFORExFUl0gPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBjYWxsYmFjayhlKTtcblx0ICAgIH07XG5cdCAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuXHQgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihlLCBlbFtIQU5ETEVSXSwgZmFsc2UpO1xuXHQgICAgfSk7XG5cdCAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICBlbFtIQU5ETEVSXSgpO1xuXHQgICAgfSwgMCk7XG5cdCAgfVxuXHR9XG5cdFxuXHRmdW5jdGlvbiB1bmJpbmQoZWwpIHtcblx0ICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICB9KTtcblx0ICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICBkZWxldGUgZWxbSEFORExFUl07XG5cdH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBiaW5kOiBiaW5kLFxuXHQgIHVuYmluZDogdW5iaW5kLFxuXHQgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGVsLCBiaW5kaW5nKSB7XG5cdCAgICBpZiAoYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSkgYmluZChlbCwgYmluZGluZyk7XG5cdCAgfVxuXHR9O1xuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg2NykpKVxuXG4vKioqLyB9LFxuLyogNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzEpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQWNjb3JkaW9uLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1kNGI3NWE5MlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtZDRiNzVhOTJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBY2NvcmRpb24udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB0eXBlOiB7XG5cdCAgICAgIHR5cGU6IFN0cmluZyxcblx0ICAgICAgZGVmYXVsdDogbnVsbFxuXHQgICAgfSxcblx0ICAgIG9uZUF0QXRpbWU6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogZmFsc2Vcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIG9wZW5DaGlsZDogZnVuY3Rpb24gb3BlbkNoaWxkKGNoaWxkKSB7XG5cdCAgICAgIGlmICh0aGlzLm9uZUF0QXRpbWUpIHtcblx0ICAgICAgICB0aGlzLiRjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG5cdCAgICAgICAgICBpZiAoY2hpbGQgIT09IGl0ZW0pIHtcblx0ICAgICAgICAgICAgaXRlbS5vcGVuID0gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9pc0FjY29yZGlvbiA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtZDRiNzVhOTJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA3MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Mylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxBZmZpeC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNWViZGRlYmZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTVlYmRkZWJmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWZmaXgudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9TY3JvbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4KTtcblx0XG5cdHZhciBfU2Nyb2xsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Njcm9sbCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIFNjcm9sbDogX1Njcm9sbDIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIG9mZnNldDoge1xuXHQgICAgICB0eXBlOiBOdW1iZXIsXG5cdCAgICAgIGRlZmF1bHQ6IDBcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhZmZpeGVkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdG9wOiBmdW5jdGlvbiB0b3AoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm9mZnNldCA+IDAgPyB0aGlzLm9mZnNldCArICdweCcgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvYWZmaXgvaW5kZXguanN4I0wyMFxuXHQgICAgY2hlY2tTY3JvbGw6IGZ1bmN0aW9uIGNoZWNrU2Nyb2xsKCkge1xuXHQgICAgICAvLyBpZiBpcyBoaWRkZW4gZG9uJ3QgY2FsY3VsYXRlIGFueXRoaW5nXG5cdCAgICAgIGlmICghKHRoaXMuJGVsLm9mZnNldFdpZHRoIHx8IHRoaXMuJGVsLm9mZnNldEhlaWdodCB8fCB0aGlzLiRlbC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgLy8gZ2V0IHdpbmRvdyBzY3JvbGwgYW5kIGVsZW1lbnQgcG9zaXRpb24gdG8gZGV0ZWN0IGlmIGhhdmUgdG8gYmUgbm9ybWFsIG9yIGFmZml4ZWRcblx0ICAgICAgdmFyIHNjcm9sbCA9IHt9O1xuXHQgICAgICB2YXIgZWxlbWVudCA9IHt9O1xuXHQgICAgICB2YXIgcmVjdCA9IHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBfYXJyID0gWydUb3AnLCAnTGVmdCddO1xuXHQgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcblx0ICAgICAgICB2YXIgdHlwZSA9IF9hcnJbX2ldO1xuXHQgICAgICAgIHZhciB0ID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgIHZhciByZXQgPSB3aW5kb3dbJ3BhZ2UnICsgKHR5cGUgPT09ICdUb3AnID8gJ1knIDogJ1gnKSArICdPZmZzZXQnXTtcblx0ICAgICAgICB2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyB0eXBlO1xuXHQgICAgICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgICAgLy8gaWU2LDcsOCBzdGFuZGFyZCBtb2RlXG5cdCAgICAgICAgICByZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbbWV0aG9kXTtcblx0ICAgICAgICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgICAgICAvLyBxdWlya3MgbW9kZVxuXHQgICAgICAgICAgICByZXQgPSBkb2N1bWVudC5ib2R5W21ldGhvZF07XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHNjcm9sbFt0XSA9IHJldDtcblx0ICAgICAgICBlbGVtZW50W3RdID0gc2Nyb2xsW3RdICsgcmVjdFt0XSAtICh0aGlzLiRlbFsnY2xpZW50JyArIHR5cGVdIHx8IGJvZHlbJ2NsaWVudCcgKyB0eXBlXSB8fCAwKTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZml4ID0gc2Nyb2xsLnRvcCA+IGVsZW1lbnQudG9wIC0gdGhpcy5vZmZzZXQ7XG5cdCAgICAgIGlmICh0aGlzLmFmZml4ZWQgIT09IGZpeCkge1xuXHQgICAgICAgIHRoaXMuYWZmaXhlZCA9IGZpeDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhpZGRlbi1wcmludCBoaWRkZW4teHMgaGlkZGVuLXNtXCJcblx0ICB9LCBbX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNjcm9sbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2Nyb2xsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNoZWNrU2Nyb2xsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjaGVja1Njcm9sbFwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLWRvY3Mtc2lkZWJhclwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgYWZmaXg6IF92bS5hZmZpeGVkXG5cdCAgICB9LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIG1hcmdpblRvcDogX3ZtLnRvcFxuXHQgICAgfSlcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNWViZGRlYmZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA3NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg3Nilcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFsZXJ0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1hZjdjMWY2YVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYWY3YzFmNmFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBbGVydC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiA3NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNzcpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWFmN2MxZjZhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9BbGVydC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWFmN2MxZjZhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9BbGVydC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA3NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZmFkZS1lbnRlci1hY3RpdmUsXFxyXFxuLmZhZGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxufVxcbi5mYWRlLWVudGVyLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBoZWlnaHQ6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcbn1cXG4uYWxlcnQudG9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMzBweDtcXHJcXG4gIG1hcmdpbjogMCBhdXRvO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMTA1MDtcXG59XFxuLmFsZXJ0LnRvcC1yaWdodCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICByaWdodDogNTBweDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQWxlcnQudnVlPzcxYTkxYzFhXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFvREE7O0VBRUEsNkJBQUE7Q0FDQTtBQUNBOztFQUVBLFVBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLGVBQUE7RUFDQSxRQUFBO0VBQ0EsU0FBQTtFQUNBLGNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLGNBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQWxlcnQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDx0cmFuc2l0aW9uIG5hbWU9XFxcImZhZGVcXFwiPlxcclxcbiAgICA8ZGl2IHYtc2hvdz1cXFwidmFsXFxcIiA6Y2xhc3M9XFxcIlsnYWxlcnQnLCAnYWxlcnQtJyt0eXBlLCBwbGFjZW1lbnRdXFxcIiA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aH1cXFwiIHJvbGU9XFxcImFsZXJ0XFxcIj5cXHJcXG4gICAgICA8YnV0dG9uIHYtc2hvdz1cXFwiZGlzbWlzc2FibGVcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9IGZhbHNlXFxcIj5cXHJcXG4gICAgICAgIDxzcGFuPiZ0aW1lczs8L3NwYW4+XFxyXFxuICAgICAgPC9idXR0b24+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gIDwvdHJhbnNpdGlvbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuXFxyXFxudmFyIERVUkFUSU9OID0gMFxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc21pc3NhYmxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBkdXJhdGlvbjoge2RlZmF1bHQ6IERVUkFUSU9OfSxcXHJcXG4gICAgcGxhY2VtZW50OiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IFN0cmluZ31cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICB2YWw6IHRoaXMudmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGR1cmF0aW9uTnVtICgpIHsgcmV0dXJuIGNvZXJjZS5udW1iZXIodGhpcy5kdXJhdGlvbiwgRFVSQVRJT04pIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICB2YWwgKHZhbCkge1xcclxcbiAgICAgIGlmICh2YWwgJiYgdGhpcy5kdXJhdGlvbk51bSA+IDApIHsgdGhpcy5fZGVsYXlDbG9zZSgpIH1cXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XFxyXFxuICAgICAgICB0aGlzLnZhbCA9IHZhbFxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9kZWxheUNsb3NlID0gZGVsYXllcihmdW5jdGlvbiAoKSB7XFxyXFxuICAgICAgdGhpcy52YWwgPSBmYWxzZVxcclxcbiAgICB9LCAnZHVyYXRpb25OdW0nKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmZhZGUtZW50ZXItYWN0aXZlLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcyBlYXNlO1xcclxcbn1cXHJcXG4uZmFkZS1lbnRlcixcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgaGVpZ2h0OiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG59XFxyXFxuLmFsZXJ0LnRvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxyXFxufVxcclxcbi5hbGVydC50b3AtcmlnaHQge1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgcmlnaHQ6IDUwcHg7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogNzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXHJcblx0XHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5cdFx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxyXG5cdCovXHJcblx0Ly8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcclxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGxpc3QgPSBbXTtcclxuXHRcclxuXHRcdC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcclxuXHRcdGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcclxuXHRcdFx0dmFyIHJlc3VsdCA9IFtdO1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpdGVtID0gdGhpc1tpXTtcclxuXHRcdFx0XHRpZihpdGVtWzJdKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaChcIkBtZWRpYSBcIiArIGl0ZW1bMl0gKyBcIntcIiArIGl0ZW1bMV0gKyBcIn1cIik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1bMV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0LmpvaW4oXCJcIik7XHJcblx0XHR9O1xyXG5cdFxyXG5cdFx0Ly8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcclxuXHRcdGxpc3QuaSA9IGZ1bmN0aW9uKG1vZHVsZXMsIG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0aWYodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpXHJcblx0XHRcdFx0bW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgXCJcIl1dO1xyXG5cdFx0XHR2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xyXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHZhciBpZCA9IHRoaXNbaV1bMF07XHJcblx0XHRcdFx0aWYodHlwZW9mIGlkID09PSBcIm51bWJlclwiKVxyXG5cdFx0XHRcdFx0YWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvcihpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaXRlbSA9IG1vZHVsZXNbaV07XHJcblx0XHRcdFx0Ly8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxyXG5cdFx0XHRcdC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IDEwMCUgcGVyZmVjdCBmb3Igd2VpcmQgbWVkaWEgcXVlcnkgY29tYmluYXRpb25zXHJcblx0XHRcdFx0Ly8gIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cclxuXHRcdFx0XHQvLyAgSSBob3BlIHRoaXMgd2lsbCBuZXZlciBvY2N1ciAoSGV5IHRoaXMgd2F5IHdlIGhhdmUgc21hbGxlciBidW5kbGVzKVxyXG5cdFx0XHRcdGlmKHR5cGVvZiBpdGVtWzBdICE9PSBcIm51bWJlclwiIHx8ICFhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XHJcblx0XHRcdFx0XHRpZihtZWRpYVF1ZXJ5ICYmICFpdGVtWzJdKSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmKG1lZGlhUXVlcnkpIHtcclxuXHRcdFx0XHRcdFx0aXRlbVsyXSA9IFwiKFwiICsgaXRlbVsyXSArIFwiKSBhbmQgKFwiICsgbWVkaWFRdWVyeSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHRcdHJldHVybiBsaXN0O1xyXG5cdH07XHJcblxuXG4vKioqLyB9LFxuLyogNzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qXG5cdFx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcblx0XHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG5cdCovXG5cdHZhciBzdHlsZXNJbkRvbSA9IHt9LFxuXHRcdG1lbW9pemUgPSBmdW5jdGlvbihmbikge1xuXHRcdFx0dmFyIG1lbW87XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIG1lbW8gPT09IFwidW5kZWZpbmVkXCIpIG1lbW8gPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0XHRyZXR1cm4gbWVtbztcblx0XHRcdH07XG5cdFx0fSxcblx0XHRpc09sZElFID0gbWVtb2l6ZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiAvbXNpZSBbNi05XVxcYi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtcblx0XHR9KSxcblx0XHRnZXRIZWFkRWxlbWVudCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO1xuXHRcdH0pLFxuXHRcdHNpbmdsZXRvbkVsZW1lbnQgPSBudWxsLFxuXHRcdHNpbmdsZXRvbkNvdW50ZXIgPSAwLFxuXHRcdHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wID0gW107XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGxpc3QsIG9wdGlvbnMpIHtcblx0XHRpZihmYWxzZSkge1xuXHRcdFx0aWYodHlwZW9mIGRvY3VtZW50ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIik7XG5cdFx0fVxuXHRcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0XHQvLyBGb3JjZSBzaW5nbGUtdGFnIHNvbHV0aW9uIG9uIElFNi05LCB3aGljaCBoYXMgYSBoYXJkIGxpbWl0IG9uIHRoZSAjIG9mIDxzdHlsZT5cblx0XHQvLyB0YWdzIGl0IHdpbGwgYWxsb3cgb24gYSBwYWdlXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zLnNpbmdsZXRvbiA9PT0gXCJ1bmRlZmluZWRcIikgb3B0aW9ucy5zaW5nbGV0b24gPSBpc09sZElFKCk7XG5cdFxuXHRcdC8vIEJ5IGRlZmF1bHQsIGFkZCA8c3R5bGU+IHRhZ3MgdG8gdGhlIGJvdHRvbSBvZiA8aGVhZD4uXG5cdFx0aWYgKHR5cGVvZiBvcHRpb25zLmluc2VydEF0ID09PSBcInVuZGVmaW5lZFwiKSBvcHRpb25zLmluc2VydEF0ID0gXCJib3R0b21cIjtcblx0XG5cdFx0dmFyIHN0eWxlcyA9IGxpc3RUb1N0eWxlcyhsaXN0KTtcblx0XHRhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcblx0XHRcdHZhciBtYXlSZW1vdmUgPSBbXTtcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXHRcdFx0XHRkb21TdHlsZS5yZWZzLS07XG5cdFx0XHRcdG1heVJlbW92ZS5wdXNoKGRvbVN0eWxlKTtcblx0XHRcdH1cblx0XHRcdGlmKG5ld0xpc3QpIHtcblx0XHRcdFx0dmFyIG5ld1N0eWxlcyA9IGxpc3RUb1N0eWxlcyhuZXdMaXN0KTtcblx0XHRcdFx0YWRkU3R5bGVzVG9Eb20obmV3U3R5bGVzLCBvcHRpb25zKTtcblx0XHRcdH1cblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtYXlSZW1vdmUubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIGRvbVN0eWxlID0gbWF5UmVtb3ZlW2ldO1xuXHRcdFx0XHRpZihkb21TdHlsZS5yZWZzID09PSAwKSB7XG5cdFx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKVxuXHRcdFx0XHRcdFx0ZG9tU3R5bGUucGFydHNbal0oKTtcblx0XHRcdFx0XHRkZWxldGUgc3R5bGVzSW5Eb21bZG9tU3R5bGUuaWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRcblx0ZnVuY3Rpb24gYWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKSB7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblx0XHRcdGlmKGRvbVN0eWxlKSB7XG5cdFx0XHRcdGRvbVN0eWxlLnJlZnMrKztcblx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0ZG9tU3R5bGUucGFydHNbal0oaXRlbS5wYXJ0c1tqXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yKDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRkb21TdHlsZS5wYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIHBhcnRzID0gW107XG5cdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0cGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3R5bGVzSW5Eb21baXRlbS5pZF0gPSB7aWQ6IGl0ZW0uaWQsIHJlZnM6IDEsIHBhcnRzOiBwYXJ0c307XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdFxuXHRmdW5jdGlvbiBsaXN0VG9TdHlsZXMobGlzdCkge1xuXHRcdHZhciBzdHlsZXMgPSBbXTtcblx0XHR2YXIgbmV3U3R5bGVzID0ge307XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gbGlzdFtpXTtcblx0XHRcdHZhciBpZCA9IGl0ZW1bMF07XG5cdFx0XHR2YXIgY3NzID0gaXRlbVsxXTtcblx0XHRcdHZhciBtZWRpYSA9IGl0ZW1bMl07XG5cdFx0XHR2YXIgc291cmNlTWFwID0gaXRlbVszXTtcblx0XHRcdHZhciBwYXJ0ID0ge2NzczogY3NzLCBtZWRpYTogbWVkaWEsIHNvdXJjZU1hcDogc291cmNlTWFwfTtcblx0XHRcdGlmKCFuZXdTdHlsZXNbaWRdKVxuXHRcdFx0XHRzdHlsZXMucHVzaChuZXdTdHlsZXNbaWRdID0ge2lkOiBpZCwgcGFydHM6IFtwYXJ0XX0pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRuZXdTdHlsZXNbaWRdLnBhcnRzLnB1c2gocGFydCk7XG5cdFx0fVxuXHRcdHJldHVybiBzdHlsZXM7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBzdHlsZUVsZW1lbnQpIHtcblx0XHR2YXIgaGVhZCA9IGdldEhlYWRFbGVtZW50KCk7XG5cdFx0dmFyIGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wID0gc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3Bbc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AubGVuZ3RoIC0gMV07XG5cdFx0aWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwidG9wXCIpIHtcblx0XHRcdGlmKCFsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCkge1xuXHRcdFx0XHRoZWFkLmluc2VydEJlZm9yZShzdHlsZUVsZW1lbnQsIGhlYWQuZmlyc3RDaGlsZCk7XG5cdFx0XHR9IGVsc2UgaWYobGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpIHtcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoc3R5bGVFbGVtZW50LCBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5wdXNoKHN0eWxlRWxlbWVudCk7XG5cdFx0fSBlbHNlIGlmIChvcHRpb25zLmluc2VydEF0ID09PSBcImJvdHRvbVwiKSB7XG5cdFx0XHRoZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciAnaW5zZXJ0QXQnLiBNdXN0IGJlICd0b3AnIG9yICdib3R0b20nLlwiKTtcblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcblx0XHRzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdHZhciBpZHggPSBzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5pbmRleE9mKHN0eWxlRWxlbWVudCk7XG5cdFx0aWYoaWR4ID49IDApIHtcblx0XHRcdHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wLnNwbGljZShpZHgsIDEpO1xuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcblx0XHR2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdHN0eWxlRWxlbWVudC50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuXHRcdGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBzdHlsZUVsZW1lbnQpO1xuXHRcdHJldHVybiBzdHlsZUVsZW1lbnQ7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFkZFN0eWxlKG9iaiwgb3B0aW9ucykge1xuXHRcdHZhciBzdHlsZUVsZW1lbnQsIHVwZGF0ZSwgcmVtb3ZlO1xuXHRcblx0XHRpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcblx0XHRcdHZhciBzdHlsZUluZGV4ID0gc2luZ2xldG9uQ291bnRlcisrO1xuXHRcdFx0c3R5bGVFbGVtZW50ID0gc2luZ2xldG9uRWxlbWVudCB8fCAoc2luZ2xldG9uRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKSk7XG5cdFx0XHR1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCBmYWxzZSk7XG5cdFx0XHRyZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3R5bGVFbGVtZW50ID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuXHRcdFx0dXBkYXRlID0gYXBwbHlUb1RhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCk7XG5cdFx0XHRyZW1vdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XG5cdFx0dXBkYXRlKG9iaik7XG5cdFxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGVTdHlsZShuZXdPYmopIHtcblx0XHRcdGlmKG5ld09iaikge1xuXHRcdFx0XHRpZihuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXApXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR1cGRhdGUob2JqID0gbmV3T2JqKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0XG5cdHZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHRleHRTdG9yZSA9IFtdO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gKGluZGV4LCByZXBsYWNlbWVudCkge1xuXHRcdFx0dGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xuXHRcdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG5cdFx0fTtcblx0fSkoKTtcblx0XG5cdGZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcoc3R5bGVFbGVtZW50LCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcblx0XHR2YXIgY3NzID0gcmVtb3ZlID8gXCJcIiA6IG9iai5jc3M7XG5cdFxuXHRcdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcyk7XG5cdFx0XHR2YXIgY2hpbGROb2RlcyA9IHN0eWxlRWxlbWVudC5jaGlsZE5vZGVzO1xuXHRcdFx0aWYgKGNoaWxkTm9kZXNbaW5kZXhdKSBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdFx0aWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHN0eWxlRWxlbWVudC5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGNzc05vZGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gYXBwbHlUb1RhZyhzdHlsZUVsZW1lbnQsIG9iaikge1xuXHRcdHZhciBjc3MgPSBvYmouY3NzO1xuXHRcdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcblx0XHR2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblx0XG5cdFx0aWYgKG1lZGlhKSB7XG5cdFx0XHRzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEpO1xuXHRcdH1cblx0XG5cdFx0aWYgKHNvdXJjZU1hcCkge1xuXHRcdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kZXZ0b29scy9kb2NzL2phdmFzY3JpcHQtZGVidWdnaW5nXG5cdFx0XHQvLyB0aGlzIG1ha2VzIHNvdXJjZSBtYXBzIGluc2lkZSBzdHlsZSB0YWdzIHdvcmsgcHJvcGVybHkgaW4gQ2hyb21lXG5cdFx0XHRjc3MgKz0gJ1xcbi8qIyBzb3VyY2VVUkw9JyArIHNvdXJjZU1hcC5zb3VyY2VzWzBdICsgJyAqLyc7XG5cdFx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNjYwMzg3NVxuXHRcdFx0Y3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIiArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSkgKyBcIiAqL1wiO1xuXHRcdH1cblx0XG5cdFx0aWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG5cdFx0XHRzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aGlsZShzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuXHRcdFx0XHRzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuXHRcdFx0fVxuXHRcdFx0c3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuXHRcdH1cblx0fVxuXG5cbi8qKiovIH0sXG4vKiA4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgRFVSQVRJT04gPSAwOyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBkaXNtaXNzYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZHVyYXRpb246IHsgZGVmYXVsdDogRFVSQVRJT04gfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB2YWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICB3aWR0aDogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHZhbDogdGhpcy52YWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgZHVyYXRpb25OdW06IGZ1bmN0aW9uIGR1cmF0aW9uTnVtKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5udW1iZXIodGhpcy5kdXJhdGlvbiwgRFVSQVRJT04pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwpIHtcblx0ICAgICAgaWYgKF92YWwgJiYgdGhpcy5kdXJhdGlvbk51bSA+IDApIHtcblx0ICAgICAgICB0aGlzLl9kZWxheUNsb3NlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9kZWxheUNsb3NlID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMudmFsID0gZmFsc2U7XG5cdCAgICB9LCAnZHVyYXRpb25OdW0nKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IFwiZmFkZVwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLnZhbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwidmFsXCJcblx0ICAgIH1dLFxuXHQgICAgY2xhc3M6IFsnYWxlcnQnLCAnYWxlcnQtJyArIF92bS50eXBlLCBfdm0ucGxhY2VtZW50XSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImFsZXJ0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzbWlzc2FibGUpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc21pc3NhYmxlXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gZmFsc2Vcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1hZjdjMWY2YVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDgyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDgzKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODYpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQXNpZGUudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTNhNGJkZTI3XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zYTRiZGUyN1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEFzaWRlLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NCk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtM2E0YmRlMjchLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0FzaWRlLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtM2E0YmRlMjchLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0FzaWRlLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5hc2lkZS1vcGVuIHtcXHJcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzO1xcbn1cXG4uYXNpZGUtb3Blbi5oYXMtcHVzaC1yaWdodCB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTMwMHB4KTtcXG59XFxuLmFzaWRlIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDk7XFxyXFxuICBvdmVyZmxvdzogYXV0bztcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxufVxcbi5hc2lkZS5sZWZ0IHtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogYXV0bztcXG59XFxuLmFzaWRlLnJpZ2h0IHtcXHJcXG4gIGxlZnQ6IGF1dG87XFxyXFxuICByaWdodDogMDtcXG59XFxuLnNsaWRlbGVmdC1lbnRlciB7XFxyXFxuICB0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7XFxufVxcbi5zbGlkZWxlZnQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZWxlZnQtaW4gLjNzO1xcbn1cXG4uc2xpZGVsZWZ0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LW91dCAuM3M7XFxufVxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcbi5zbGlkZXJpZ2h0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVyaWdodC1pbiAuM3M7XFxufVxcbi5zbGlkZXJpZ2h0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVyaWdodC1vdXQgLjNzO1xcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlcmlnaHQtaW4ge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LW91dCB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXG4uYXNpZGU6Zm9jdXMge1xcclxcbiAgICBvdXRsaW5lOiAwO1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcXG4uYXNpZGUge1xcclxcbiAgICBtaW4td2lkdGg6IDI0MHB4O1xcbn1cXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciB7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDE2LjQzcHg7XFxyXFxuICBwYWRkaW5nOiA2cHggMTVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICMzMzdhYjc7XFxyXFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciAuY2xvc2Uge1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAtOHB4O1xcclxcbiAgcGFkZGluZzogNHB4IDhweDtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbiAgZm9udC1zaXplOiAyNXB4O1xcclxcbiAgb3BhY2l0eTogLjg7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1ib2R5IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIge1xcclxcbiAgcGFkZGluZzogMTVweDtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tYmxvY2srLmJ0bi1ibG9jayB7XFxyXFxuICBtYXJnaW4tbGVmdDogMDtcXG59XFxuLmFzaWRlLWJhY2tkcm9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYm90dG9tOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxufVxcbi5hc2lkZS1iYWNrZHJvcC5pbiB7XFxyXFxuICBvcGFjaXR5OiAuNTtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT01MCk7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQXNpZGUudnVlPzU3Mzk2MjFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrRkE7RUFDQSwyQkFBQTtDQUNBO0FBQ0E7RUFDQSw4QkFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLE9BQUE7RUFDQSxVQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7RUFDQSxRQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsU0FBQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7RUFDQSwyQkFBQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLDZCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLHlCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSw2QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSw0QkFBQTtDQUNBO0FBQ0E7RUFDQSw2QkFBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLDRCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLHlCQUFBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7SUFDQSw0QkFBQTtJQUNBLFdBQUE7Q0FDQTtDQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtBQUNBO0lBQ0EsaUJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxpQ0FBQTtFQUNBLG9CQUFBO0VBQ0Esa0JBQUE7RUFDQSxvQkFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtFQUNBLFlBQUE7RUFDQSxnQkFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxjQUFBO0NBQ0E7QUFDQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLDhCQUFBO0NBQ0E7QUFDQTtFQUNBLGlCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7Q0FDQTtBQUNBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLFFBQUE7RUFDQSxjQUFBO0VBQ0EsV0FBQTtFQUNBLDZCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLDBCQUFBO0NBQ0FcIixcImZpbGVcIjpcIkFzaWRlLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8dHJhbnNpdGlvbiA6bmFtZT1cXFwiJ3NsaWRlJyArIHBsYWNlbWVudFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlXFxcIiB2LWlmPVxcXCJzaG93XFxcIiA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aCsncHgnfVxcXCIgOmNsYXNzPVxcXCJwbGFjZW1lbnRcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWRpYWxvZ1xcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1jb250ZW50XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXNpZGUtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9J3RyaWdnZXJfY2xvc2UnPjxzcGFuPiZ0aW1lczs8L3NwYW4+PC9idXR0b24+XFxyXFxuICAgICAgICAgICAgPGg0IGNsYXNzPVxcXCJhc2lkZS10aXRsZVxcXCI+PHNsb3QgbmFtZT1cXFwiaGVhZGVyXFxcIj57eyBoZWFkZXIgfX08L3Nsb3Q+PC9oND5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWJvZHlcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gIDwvdHJhbnNpdGlvbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtnZXRTY3JvbGxCYXJXaWR0aH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGhlYWRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHBsYWNlbWVudDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ3JpZ2h0J30sXFxyXFxuICAgIHNob3c6IHt0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZX0sXFxyXFxuICAgIHdpZHRoOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzMjB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgc2hvdyAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KHRoaXMuc2hvdyA/ICdvcGVuJyA6ICdjbG9zZScpXFxyXFxuICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHlcXHJcXG4gICAgICBjb25zdCBzY3JvbGxCYXJXaWR0aCA9IGdldFNjcm9sbEJhcldpZHRoKClcXHJcXG4gICAgICBpZiAodmFsKSB7XFxyXFxuICAgICAgICBpZiAoIXRoaXMuX2JhY2tkcm9wKSB7XFxyXFxuICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCdcXHJcXG4gICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fYmFja2Ryb3ApXFxyXFxuICAgICAgICBib2R5LmNsYXNzTGlzdC5hZGQoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XFxyXFxuICAgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gc2Nyb2xsQmFyV2lkdGggKyAncHgnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XFxyXFxuICAgICAgICB2YXIgeCA9IHRoaXMuX2JhY2tkcm9wLmNsaWVudEhlaWdodFxcclxcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZCgnaW4nKVxcclxcbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkub24oJ2NsaWNrJywgKCkgPT4gdGhpcy50cmlnZ2VyX2Nsb3NlKCkpXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLm9uKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xcclxcbiAgICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vZmYoKVxcclxcbiAgICAgICAgICB0cnkge1xcclxcbiAgICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMCdcXHJcXG4gICAgICAgICAgICBib2R5LnJlbW92ZUNoaWxkKHRoaXMuX2JhY2tkcm9wKVxcclxcbiAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gbnVsbFxcclxcbiAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCdcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHRyaWdnZXIgKCkge1xcclxcbiAgICAgIHJldHVybiB7XFxyXFxuICAgICAgICBjbG9zZTogKCkgPT4gdGhpcy50cmlnZ2VyX2Nsb3NlKCksXFxyXFxuICAgICAgICBvcGVuOiAoKSA9PiB0aGlzLnRyaWdnZXJfb3BlbigpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB0cmlnZ2VyX2Nsb3NlICgpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCAnY2xvc2UnIClcXHJcXG4gICAgfSxcXHJcXG4gICAgdHJpZ2dlcl9vcGVuKCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoICdvcGVuJyApXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgdGhpcy4kZW1pdCgndHJpZ2dlcicsICgpID0+IHRoaXMudHJpZ2dlcilcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5hc2lkZS1vcGVuIHtcXHJcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzO1xcclxcbn1cXHJcXG4uYXNpZGUtb3Blbi5oYXMtcHVzaC1yaWdodCB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTMwMHB4KTtcXHJcXG59XFxyXFxuLmFzaWRlIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDk7XFxyXFxuICBvdmVyZmxvdzogYXV0bztcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxyXFxufVxcclxcbi5hc2lkZS5sZWZ0IHtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogYXV0bztcXHJcXG59XFxyXFxuLmFzaWRlLnJpZ2h0IHtcXHJcXG4gIGxlZnQ6IGF1dG87XFxyXFxuICByaWdodDogMDtcXHJcXG59XFxyXFxuLnNsaWRlbGVmdC1lbnRlciB7XFxyXFxuICB0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxufVxcclxcbi5zbGlkZWxlZnQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZWxlZnQtaW4gLjNzO1xcclxcbn1cXHJcXG4uc2xpZGVsZWZ0LWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LW91dCAuM3M7XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVsZWZ0LW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG4uc2xpZGVyaWdodC1lbnRlci1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtaW4gLjNzO1xcclxcbn1cXHJcXG4uc2xpZGVyaWdodC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtb3V0IC4zcztcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxufVxcclxcbi5hc2lkZTpmb2N1cyB7XFxyXFxuICAgIG91dGxpbmU6IDA7XFxyXFxufVxcclxcbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xcclxcbiAgLmFzaWRlIHtcXHJcXG4gICAgbWluLXdpZHRoOiAyNDBweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciB7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDE2LjQzcHg7XFxyXFxuICBwYWRkaW5nOiA2cHggMTVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICMzMzdhYjc7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWhlYWRlciAuY2xvc2Uge1xcclxcbiAgbWFyZ2luLXJpZ2h0OiAtOHB4O1xcclxcbiAgcGFkZGluZzogNHB4IDhweDtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbiAgZm9udC1zaXplOiAyNXB4O1xcclxcbiAgb3BhY2l0eTogLjg7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1ib2R5IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIge1xcclxcbiAgcGFkZGluZzogMTVweDtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1mb290ZXIgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tZ3JvdXAgLmJ0bisuYnRuIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4tYmxvY2srLmJ0bi1ibG9jayB7XFxyXFxuICBtYXJnaW4tbGVmdDogMDtcXHJcXG59XFxyXFxuLmFzaWRlLWJhY2tkcm9wIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYm90dG9tOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxyXFxufVxcclxcbi5hc2lkZS1iYWNrZHJvcC5pbiB7XFxyXFxuICBvcGFjaXR5OiAuNTtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT01MCk7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiA4NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdyaWdodCcgfSxcblx0ICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMzIwIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCwgb2xkKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQodGhpcy5zaG93ID8gJ29wZW4nIDogJ2Nsb3NlJyk7XG5cdCAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcblx0ICAgICAgdmFyIHNjcm9sbEJhcldpZHRoID0gKDAsIF91dGlscy5nZXRTY3JvbGxCYXJXaWR0aCkoKTtcblx0ICAgICAgaWYgKHZhbCkge1xuXHQgICAgICAgIGlmICghdGhpcy5fYmFja2Ryb3ApIHtcblx0ICAgICAgICAgIHRoaXMuX2JhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTmFtZSA9ICdhc2lkZS1iYWNrZHJvcCc7XG5cdCAgICAgICAgYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9iYWNrZHJvcCk7XG5cdCAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XG5cdCAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4Jztcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxuXHQgICAgICAgIHZhciB4ID0gdGhpcy5fYmFja2Ryb3AuY2xpZW50SGVpZ2h0O1xuXHQgICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ2luJyk7XG5cdCAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fYmFja2Ryb3ApLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpcy50cmlnZ2VyX2Nsb3NlKCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fYmFja2Ryb3ApLm9uKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoX3RoaXMuX2JhY2tkcm9wKS5vZmYoKTtcblx0ICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpO1xuXHQgICAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcwJztcblx0ICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZChfdGhpcy5fYmFja2Ryb3ApO1xuXHQgICAgICAgICAgICBfdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuXHQgICAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICB0cmlnZ2VyOiBmdW5jdGlvbiB0cmlnZ2VyKCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzMi50cmlnZ2VyX2Nsb3NlKCk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBvcGVuOiBmdW5jdGlvbiBvcGVuKCkge1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzMi50cmlnZ2VyX29wZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICB9LFxuXHQgICAgdHJpZ2dlcl9jbG9zZTogZnVuY3Rpb24gdHJpZ2dlcl9jbG9zZSgpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnY2xvc2UnKTtcblx0ICAgIH0sXG5cdCAgICB0cmlnZ2VyX29wZW46IGZ1bmN0aW9uIHRyaWdnZXJfb3BlbigpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnb3BlbicpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgIHRoaXMuJGVtaXQoJ3RyaWdnZXInLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJldHVybiBfdGhpczMudHJpZ2dlcjtcblx0ICAgIH0pO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogJ3NsaWRlJyArIF92bS5wbGFjZW1lbnRcblx0ICAgIH1cblx0ICB9LCBbKF92bS5zaG93KSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGVcIixcblx0ICAgIGNsYXNzOiBfdm0ucGxhY2VtZW50LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ud2lkdGggKyAncHgnXG5cdCAgICB9KVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWRpYWxvZ1wiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtY29udGVudFwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtaGVhZGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS50cmlnZ2VyX2Nsb3NlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnaDQnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhc2lkZS10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl92KF92bS5fcyhfdm0uaGVhZGVyKSldKV0sIDIpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtYm9keVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXSldKSA6IF92bS5fZSgpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtM2E0YmRlMjdcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA4NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OClcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxCdXR0b25Hcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMTI1ZWIwYzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTEyNWViMGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQnV0dG9uR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBidXR0b25zOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBqdXN0aWZpZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZlcnRpY2FsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBidG5Hcm91cDogZnVuY3Rpb24gYnRuR3JvdXAoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIC8vIHRoaXMgd2lsbCB1cGRhdGUgRVhURVJOQUwgdi1tb2RlbCB3aGVuIG91ciB2YWwgY2hhbmdlc1xuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIF92YWwpO1xuXHQgICAgfSxcblx0XG5cdCAgICAvLyB0aGlzIHdpbGwgdXBkYXRlIG91ciBJTlRFUk5BTCB2YWwsIHdoZW4gc29tZXRoaW5nIGV4dGVybmFsIGNoYW5nZXMgb3VyIHYtbW9kZWxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogODkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgJ2J0bi1ncm91cCc6IF92bS5idXR0b25zLCAnYnRuLWdyb3VwLWp1c3RpZmllZCc6IF92bS5qdXN0aWZpZWQsICdidG4tZ3JvdXAtdmVydGljYWwnOiBfdm0udmVydGljYWxcblx0ICAgIH0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImRhdGEtdG9nZ2xlXCI6IF92bS5idXR0b25zICYmICdidXR0b25zJ1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMTI1ZWIwYzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA5MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg5MSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXENhcm91c2VsLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtMzIyZGVlNDFcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTMyMmRlZTQxXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zMjJkZWU0MVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIENhcm91c2VsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDkxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMzIyZGVlNDEmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0Nhcm91c2VsLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMzIyZGVlNDEmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0Nhcm91c2VsLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDkyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5jYXJvdXNlbC1jb250cm9sW2RhdGEtdi0zMjJkZWU0MV0ge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0Nhcm91c2VsLnZ1ZT8yZjQ0NjM0MlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBNEdBO0VBQ0EsZ0JBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2Fyb3VzZWwudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG48ZGl2IGNsYXNzPVxcXCJjYXJvdXNlbCBzbGlkZVxcXCIgZGF0YS1yaWRlPVxcXCJjYXJvdXNlbFxcXCI+XFxyXFxuICA8IS0tIEluZGljYXRvcnMgLS0+XFxyXFxuICA8b2wgY2xhc3M9XFxcImNhcm91c2VsLWluZGljYXRvcnNcXFwiIHYtc2hvdz1cXFwiaW5kaWNhdG9yc1xcXCI+XFxyXFxuICAgIDxsaSB2LWZvcj1cXFwiKGluZGljYXRvcixpKSBpbiBpbmRpY2F0b3JfbGlzdFxcXCIgQGNsaWNrPVxcXCJpbmRpY2F0b3JDbGljayhpKVxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmkgPT09IGluZGV4fVxcXCI+PHNwYW4+PC9zcGFuPjwvbGk+XFxyXFxuICA8L29sPlxcclxcbiAgPCEtLSBXcmFwcGVyIGZvciBzbGlkZXMgLS0+XFxyXFxuICA8ZGl2IGNsYXNzPVxcXCJjYXJvdXNlbC1pbm5lclxcXCIgcm9sZT1cXFwibGlzdGJveFxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gIDwvZGl2PlxcclxcbiAgPCEtLSBDb250cm9scyAtLT5cXHJcXG4gIDxkaXYgdi1zaG93PVxcXCJjb250cm9sc1xcXCIgY2xhc3M9XFxcImNhcm91c2VsLWNvbnRyb2xzIGhpZGRlbi14c1xcXCI+XFxyXFxuICAgIDxhIGNsYXNzPVxcXCJsZWZ0IGNhcm91c2VsLWNvbnRyb2xcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCIgQGNsaWNrPVxcXCJwcmV2XFxcIj5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnRcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvYT5cXHJcXG4gICAgPGEgY2xhc3M9XFxcInJpZ2h0IGNhcm91c2VsLWNvbnRyb2xcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCIgQGNsaWNrPVxcXCJuZXh0XFxcIj5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0XFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICA8L2E+XFxyXFxuICA8L2Rpdj5cXHJcXG48L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG4vLyBsZXQgY29lcmNlID0ge1xcclxcbi8vICAgaW50ZXJ2YWw6ICdudW1iZXInXFxyXFxuLy8gfVxcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGluZGljYXRvcnM6IHtcXHJcXG4gICAgICB0eXBlOiBCb29sZWFuLFxcclxcbiAgICAgIGRlZmF1bHQ6IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgY29udHJvbHM6IHtcXHJcXG4gICAgICB0eXBlOiBCb29sZWFuLFxcclxcbiAgICAgIGRlZmF1bHQ6IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgaW50ZXJ2YWw6IHtcXHJcXG4gICAgICB0eXBlOiBOdW1iZXIsXFxyXFxuICAgICAgZGVmYXVsdDogNTAwMFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgaW5kaWNhdG9yX2xpc3Q6IFtdLFxcclxcbiAgICAgIGluZGV4OiAwLFxcclxcbiAgICAgIGlzQW5pbWF0aW5nOiBmYWxzZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKG5ld1ZhbCwgb2xkVmFsKSB7XFxyXFxuICAgICAgdGhpcy5zbGlkZShuZXdWYWwgPiBvbGRWYWwgPyAnbGVmdCcgOiAncmlnaHQnLCBuZXdWYWwsIG9sZFZhbClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaW5kaWNhdG9yQ2xpY2sgKGluZGV4KSB7XFxyXFxuICAgICAgaWYgKHRoaXMuaXNBbmltYXRpbmcgfHwgdGhpcy5pbmRleCA9PT0gaW5kZXgpIHJldHVybiBmYWxzZVxcclxcbiAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5pbmRleCA9IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIHNsaWRlIChkaXJlY3Rpb24sIG5leHQsIHByZXYpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuJGVsKSB7IHJldHVybiB9XFxyXFxuICAgICAgY29uc3QgJHNsaWRlciA9ICQoJy5pdGVtJywgdGhpcy4kZWwpXFxyXFxuICAgICAgaWYgKCEkc2xpZGVyLmxlbmd0aCkgeyByZXR1cm4gfVxcclxcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gJHNsaWRlcltuZXh0XSB8fCAkc2xpZGVyWzBdXFxyXFxuICAgICAgJChzZWxlY3RlZCkuYWRkQ2xhc3MoZGlyZWN0aW9uID09PSAnbGVmdCcgPyAnbmV4dCcgOiAncHJldicpXFxyXFxuICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxcclxcbiAgICAgIHZhciB4ID0gc2VsZWN0ZWQuY2xpZW50SGVpZ2h0XFxyXFxuICAgICAgJChbJHNsaWRlcltwcmV2XSwgc2VsZWN0ZWRdKS5hZGRDbGFzcyhkaXJlY3Rpb24pLm9uKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xcclxcbiAgICAgICAgJHNsaWRlci5vZmYoJ3RyYW5zaXRpb25lbmQnKS5jbGFzc05hbWUgPSAnaXRlbSdcXHJcXG4gICAgICAgICQoc2VsZWN0ZWQpLmFkZENsYXNzKCdhY3RpdmUnKVxcclxcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgbmV4dCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ICsgMSA8ICQoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCA/IHRoaXMuaW5kZXggKz0gMSA6IHRoaXMuaW5kZXggPSAwXFxyXFxuICAgIH0sXFxyXFxuICAgIHByZXYgKCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwgfHwgdGhpcy5pc0FuaW1hdGluZykgeyByZXR1cm4gZmFsc2UgfVxcclxcbiAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5pbmRleCA9PT0gMCA/IHRoaXMuaW5kZXggPSAkKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggLSAxIDogdGhpcy5pbmRleCAtPSAxXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZUludGVydmFsICh2YWwpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdmFsID0gdGhpcy5faW50ZXJ2YWxJRCB9XFxyXFxuICAgICAgaWYodGhpcy5faW50ZXJ2YWxJRCkge1xcclxcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbElEKVxcclxcbiAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVydmFsSURcXHJcXG4gICAgICB9XFxyXFxuICAgICAgaWYodmFsICYmIHRoaXMuaW50ZXJ2YWwgPiAwKSB7XFxyXFxuICAgICAgICB0aGlzLl9pbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwodGhpcy5uZXh0LCB0aGlzLmludGVydmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpXFxyXFxuICAgICQodGhpcy4kZWwpLm9uKCdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSkpLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy50b2dnbGVJbnRlcnZhbCh0cnVlKSlcXHJcXG4gIH0sXFxyXFxuICBiZWZvcmVEZXN0cm95ICgpIHtcXHJcXG4gICAgdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSlcXHJcXG4gICAgJCh0aGlzLiRlbCkub2ZmKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5jYXJvdXNlbC1jb250cm9sIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDkzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly8gbGV0IGNvZXJjZSA9IHtcblx0Ly8gICBpbnRlcnZhbDogJ251bWJlcidcblx0Ly8gfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBpbmRpY2F0b3JzOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IHRydWVcblx0ICAgIH0sXG5cdCAgICBjb250cm9sczoge1xuXHQgICAgICB0eXBlOiBCb29sZWFuLFxuXHQgICAgICBkZWZhdWx0OiB0cnVlXG5cdCAgICB9LFxuXHQgICAgaW50ZXJ2YWw6IHtcblx0ICAgICAgdHlwZTogTnVtYmVyLFxuXHQgICAgICBkZWZhdWx0OiA1MDAwXG5cdCAgICB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kaWNhdG9yX2xpc3Q6IFtdLFxuXHQgICAgICBpbmRleDogMCxcblx0ICAgICAgaXNBbmltYXRpbmc6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBpbmRleDogZnVuY3Rpb24gaW5kZXgobmV3VmFsLCBvbGRWYWwpIHtcblx0ICAgICAgdGhpcy5zbGlkZShuZXdWYWwgPiBvbGRWYWwgPyAnbGVmdCcgOiAncmlnaHQnLCBuZXdWYWwsIG9sZFZhbCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBpbmRpY2F0b3JDbGljazogZnVuY3Rpb24gaW5kaWNhdG9yQ2xpY2soaW5kZXgpIHtcblx0ICAgICAgaWYgKHRoaXMuaXNBbmltYXRpbmcgfHwgdGhpcy5pbmRleCA9PT0gaW5kZXgpIHJldHVybiBmYWxzZTtcblx0ICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcblx0ICAgIH0sXG5cdCAgICBzbGlkZTogZnVuY3Rpb24gc2xpZGUoZGlyZWN0aW9uLCBuZXh0LCBwcmV2KSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMuJGVsKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciAkc2xpZGVyID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5pdGVtJywgdGhpcy4kZWwpO1xuXHQgICAgICBpZiAoISRzbGlkZXIubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBzZWxlY3RlZCA9ICRzbGlkZXJbbmV4dF0gfHwgJHNsaWRlclswXTtcblx0ICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoc2VsZWN0ZWQpLmFkZENsYXNzKGRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJ25leHQnIDogJ3ByZXYnKTtcblx0ICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxuXHQgICAgICB2YXIgeCA9IHNlbGVjdGVkLmNsaWVudEhlaWdodDtcblx0ICAgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoWyRzbGlkZXJbcHJldl0sIHNlbGVjdGVkXSkuYWRkQ2xhc3MoZGlyZWN0aW9uKS5vbigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAkc2xpZGVyLm9mZigndHJhbnNpdGlvbmVuZCcpLmNsYXNzTmFtZSA9ICdpdGVtJztcblx0ICAgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShzZWxlY3RlZCkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXHQgICAgICAgIF90aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG5cdCAgICAgIGlmICghdGhpcy4kZWwgfHwgdGhpcy5pc0FuaW1hdGluZykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5pbmRleCArIDEgPCAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLml0ZW0nLCB0aGlzLiRlbCkubGVuZ3RoID8gdGhpcy5pbmRleCArPSAxIDogdGhpcy5pbmRleCA9IDA7XG5cdCAgICB9LFxuXHQgICAgcHJldjogZnVuY3Rpb24gcHJldigpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLmluZGV4ID09PSAwID8gdGhpcy5pbmRleCA9ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggLSAxIDogdGhpcy5pbmRleCAtPSAxO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZUludGVydmFsOiBmdW5jdGlvbiB0b2dnbGVJbnRlcnZhbCh2YWwpIHtcblx0ICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgdmFsID0gdGhpcy5faW50ZXJ2YWxJRDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5faW50ZXJ2YWxJRCkge1xuXHQgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWxJRCk7XG5cdCAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVydmFsSUQ7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbCAmJiB0aGlzLmludGVydmFsID4gMCkge1xuXHQgICAgICAgIHRoaXMuX2ludGVydmFsSUQgPSBzZXRJbnRlcnZhbCh0aGlzLm5leHQsIHRoaXMuaW50ZXJ2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgdGhpcy50b2dnbGVJbnRlcnZhbCh0cnVlKTtcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuJGVsKS5vbignbW91c2VlbnRlcicsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzMi50b2dnbGVJbnRlcnZhbChmYWxzZSk7XG5cdCAgICB9KS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzMi50b2dnbGVJbnRlcnZhbCh0cnVlKTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIHRoaXMudG9nZ2xlSW50ZXJ2YWwoZmFsc2UpO1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy4kZWwpLm9mZignbW91c2VlbnRlciBtb3VzZWxlYXZlJyk7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogOTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2Fyb3VzZWwgc2xpZGVcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiZGF0YS1yaWRlXCI6IFwiY2Fyb3VzZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ29sJywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmluZGljYXRvcnMpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImluZGljYXRvcnNcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1pbmRpY2F0b3JzXCJcblx0ICB9LCBfdm0uX2woKF92bS5pbmRpY2F0b3JfbGlzdCksIGZ1bmN0aW9uKGluZGljYXRvciwgaSkge1xuXHQgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgYWN0aXZlOiBpID09PSBfdm0uaW5kZXhcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLmluZGljYXRvckNsaWNrKGkpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdzcGFuJyldKVxuXHQgIH0pKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1pbm5lclwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwibGlzdGJveFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY29udHJvbHMpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNvbnRyb2xzXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2Fyb3VzZWwtY29udHJvbHMgaGlkZGVuLXhzXCJcblx0ICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibGVmdCBjYXJvdXNlbC1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnByZXZcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2EnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJyaWdodCBjYXJvdXNlbC1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLm5leHRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0XCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIyZGVlNDFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA5NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg5Nilcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXENoZWNrYm94LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtNjkyMmJmMjRcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTY5MjJiZjI0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi02OTIyYmYyNFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIENoZWNrYm94LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDk2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Nyk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjkyMmJmMjQmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0NoZWNrYm94LnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjkyMmJmMjQmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0NoZWNrYm94LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDk3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbmxhYmVsLmNoZWNrYm94W2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxOHB4O1xcbn1cXG5sYWJlbC5jaGVja2JveCA+IGlucHV0W2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHotaW5kZXg6IC0xO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICBtYXJnaW46IDA7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4ycmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgbGluZS1oZWlnaHQ6MXJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjM1cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxufVxcbmxhYmVsLmNoZWNrYm94Om5vdCguYWN0aXZlKSA+IC5pY29uW2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjNjZhZmU5O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxubGFiZWwuY2hlY2tib3guYWN0aXZlID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCM2FXUjBhRDBpTnlJZ2FHVnBaMmgwUFNJM0lqNDhjR0YwYUNCbWFXeHNQU0lqWm1abUlpQmtQU0p0TlM0M015d3dMalV5YkMwekxqRXlOREl5TERNdU16UXhOakZzTFRFdU16TTRPVFVzTFRFdU5ETXlNVEpzTFRFdU1qUTVOamtzTVM0ek16WTJOV3d5TGpVNE9EWXpMREl1TnpZNE56WnNOQzR6TnpNNUxDMDBMalkzT0RJMmJDMHhMakkwT1RZNUxDMHhMak16TmpZMWJEQXNNR3d3TGpBd01EQXlMREF1TURBd01ERjZJaTgrUEM5emRtYyspO1xcbn1cXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgLmJ0bi1kZWZhdWx0W2RhdGEtdi02OTIyYmYyNF0geyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTtcXG59XFxubGFiZWwuY2hlY2tib3guZGlzYWJsZWRbZGF0YS12LTY5MjJiZjI0XSxcXHJcXG5sYWJlbC5jaGVja2JveC5yZWFkb25seVtkYXRhLXYtNjkyMmJmMjRdLFxcclxcbi5idG4ucmVhZG9ubHlbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NjUpO1xcclxcbiAgYm94LXNoYWRvdzogbm9uZTtcXHJcXG4gIG9wYWNpdHk6IC42NTtcXG59XFxubGFiZWwuYnRuID4gaW5wdXRbdHlwZT1jaGVja2JveF1bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQ2hlY2tib3gudnVlPzU4YTFlNWM0XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF1RkE7RUFDQSxtQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSxVQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFFBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtFQUNBLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSxzQkFBQTtFQUNBLDZCQUFBO0VBQ0EsbUNBQUE7RUFDQSx5QkFBQTtDQUNBO0FBQ0E7RUFDQSx1QkFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7RUFDQSwwQkFBQTtFQUNBLDBFQUFBO0NBQ0E7QUFDQTtFQUNBLDJCQUFBO0VBQ0Esa1pBQUE7Q0FDQTtBQUNBLHNEQUFBLHdCQUFBO0NBQUE7QUFFQTs7O0VBR0EsMEJBQUE7RUFDQSxpQkFBQTtFQUNBLGFBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFQUNBLHFCQUFBO0NBQ0FcIixcImZpbGVcIjpcIkNoZWNrYm94LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8YSA6aXM9XFxcImlzQnV0dG9uPydhJzonbGFiZWwnXFxcIiBAY2xpY2s9XFxcInRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbaXNCdXR0b24/J2J0biBidG4tJyt0eXBlQ29sb3I6J29wZW4gY2hlY2tib3ggJyt0eXBlQ29sb3Ise2FjdGl2ZTpjaGVja2VkLGRpc2FibGVkOmRpc2FibGVkLHJlYWRvbmx5OnJlYWRvbmx5fV1cXFwiPlxcclxcbiAgICA8aW5wdXQgdi1pZj1cXFwibmFtZVxcXCIgdHlwZT1cXFwiaGlkZGVuXFxcIiA6bmFtZT1cXFwibmFtZVxcXCIgOnZhbHVlPVxcXCJjaGVja2VkP3RydWVWYWx1ZTpmYWxzZVZhbHVlXFxcIiAvPlxcclxcbiAgICA8c3BhbiB2LWlmPVxcXCIhaXNCdXR0b25cXFwiIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbY2hlY2tlZD8nYnRuLScrdHlwZUNvbG9yOicnLHtiZzp0eXBlQ29sb3I9PT0nZGVmYXVsdCd9XVxcXCI+PC9zcGFuPlxcclxcbiAgICA8c3BhbiB2LWlmPVxcXCIhaXNCdXR0b24mJmNoZWNrZWQmJnR5cGVDb2xvcj09PSdkZWZhdWx0J1xcXCIgY2xhc3M9XFxcImljb25cXFwiPjwvc3Bhbj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgPC9hPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBidXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBmYWxzZVZhbHVlOiB7ZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHRydWVWYWx1ZToge2RlZmF1bHQ6IHRydWV9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBmYWxzZX1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjaGVja2VkOiAodGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWUpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBpbkdyb3VwICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuYnRuR3JvdXAgJiYgIXRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCB9LFxcclxcbiAgICBpc0J1dHRvbiAoKSB7IHJldHVybiB0aGlzLmJ1dHRvbiB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucykgfSxcXHJcXG4gICAgaXNGYWxzZSAoKSB7IHJldHVybiB0aGlzLnZhbHVlID09PSB0aGlzLmZhbHNlVmFsdWUgfSxcXHJcXG4gICAgaXNUcnVlICgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT09IHRoaXMudHJ1ZVZhbHVlIH0sXFxyXFxuICAgIHBhcmVudFZhbHVlICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC52YWwgfSxcXHJcXG4gICAgdHlwZUNvbG9yICgpIHsgcmV0dXJuICh0aGlzLnR5cGUgfHwgKHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSkpIHx8ICdkZWZhdWx0JyB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgY2hlY2tlZCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB2YXIgdmFsdWUgPSB2YWwgPyB0aGlzLnRydWVWYWx1ZSA6IHRoaXMuZmFsc2VWYWx1ZVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB2YWwpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XFxyXFxuICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJlbnRWYWx1ZSAodmFsKSB7XFxyXFxuICAgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICAgIHBhcmVudC5fY2hlY2tib3hHcm91cCA9IHRydWVcXHJcXG4gICAgICBpZiAoIShwYXJlbnQudmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7IHBhcmVudC52YWwgPSBbXSB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICAvLyBjYWxsZWQgQCBtb3VudGVkKCksIG9yIHdoZW5ldmVyICRwYXJlbnQudmFsIGNoYW5nZXNcXHJcXG4gICAgLy8gc3luYyBvdXIgc3RhdGUgd2l0aCB0aGUgJHBhcmVudC52YWxcXHJcXG4gICAgdXBkYXRlRnJvbVBhcmVudCgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XFxyXFxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodGhpcy50cnVlVmFsdWUpXFxyXFxuICAgICAgICB0aGlzLmNoZWNrZWQgPSB+aW5kZXhcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIC8vIGNhbGxlZCB3aGVuIG91ciBjaGVja2VkIHN0YXRlIGNoYW5nZXNcXHJcXG4gICAgdXBkYXRlUGFyZW50KCkge1xcclxcbiAgICAgIGlmICh0aGlzLmluR3JvdXApIHtcXHJcXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuJHBhcmVudC52YWwuaW5kZXhPZih0aGlzLnRydWVWYWx1ZSlcXHJcXG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWQgJiYgIX5pbmRleCkgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHRoaXMudHJ1ZVZhbHVlKVxcclxcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWRcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbmxhYmVsLmNoZWNrYm94IHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmctbGVmdDogMThweDtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3ggPiBpbnB1dCB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3ggPiAuaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4ycmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgbGluZS1oZWlnaHQ6MXJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjM1cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94Om5vdCguYWN0aXZlKSA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCM2FXUjBhRDBpTnlJZ2FHVnBaMmgwUFNJM0lqNDhjR0YwYUNCbWFXeHNQU0lqWm1abUlpQmtQU0p0TlM0M015d3dMalV5YkMwekxqRXlOREl5TERNdU16UXhOakZzTFRFdU16TTRPVFVzTFRFdU5ETXlNVEpzTFRFdU1qUTVOamtzTVM0ek16WTJOV3d5TGpVNE9EWXpMREl1TnpZNE56WnNOQzR6TnpNNUxDMDBMalkzT0RJMmJDMHhMakkwT1RZNUxDMHhMak16TmpZMWJEQXNNR3d3TGpBd01EQXlMREF1TURBd01ERjZJaTgrUEM5emRtYyspO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgLmJ0bi1kZWZhdWx0IHsgZmlsdGVyOiBicmlnaHRuZXNzKDc1JSk7IH1cXHJcXG5cXHJcXG5sYWJlbC5jaGVja2JveC5kaXNhYmxlZCxcXHJcXG5sYWJlbC5jaGVja2JveC5yZWFkb25seSxcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcclxcbn1cXHJcXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPWNoZWNrYm94XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiA5OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGZhbHNlVmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdHJ1ZVZhbHVlOiB7IGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB2YWx1ZTogeyBkZWZhdWx0OiBmYWxzZSB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2hlY2tlZDogdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluR3JvdXA6IGZ1bmN0aW9uIGluR3JvdXAoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LmJ0bkdyb3VwICYmICF0aGlzLiRwYXJlbnQuX3JhZGlvR3JvdXA7XG5cdCAgICB9LFxuXHQgICAgaXNCdXR0b246IGZ1bmN0aW9uIGlzQnV0dG9uKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICBpc0ZhbHNlOiBmdW5jdGlvbiBpc0ZhbHNlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5mYWxzZVZhbHVlO1xuXHQgICAgfSxcblx0ICAgIGlzVHJ1ZTogZnVuY3Rpb24gaXNUcnVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LnZhbDtcblx0ICAgIH0sXG5cdCAgICB0eXBlQ29sb3I6IGZ1bmN0aW9uIHR5cGVDb2xvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIGNoZWNrZWQ6IGZ1bmN0aW9uIGNoZWNrZWQodmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gdmFsID8gdGhpcy50cnVlVmFsdWUgOiB0aGlzLmZhbHNlVmFsdWU7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcblx0ICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJlbnRWYWx1ZTogZnVuY3Rpb24gcGFyZW50VmFsdWUodmFsKSB7XG5cdCAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgY2hlY2tlZCA9IHZhbCA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcblx0ICAgICAgICB0aGlzLmNoZWNrZWQgPSBjaGVja2VkO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgICBwYXJlbnQuX2NoZWNrYm94R3JvdXAgPSB0cnVlO1xuXHQgICAgICBpZiAoIShwYXJlbnQudmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7XG5cdCAgICAgICAgcGFyZW50LnZhbCA9IFtdO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KCk7XG5cdCAgfSxcblx0XG5cdCAgbWV0aG9kczoge1xuXHQgICAgLy8gY2FsbGVkIEAgbW91bnRlZCgpLCBvciB3aGVuZXZlciAkcGFyZW50LnZhbCBjaGFuZ2VzXG5cdCAgICAvLyBzeW5jIG91ciBzdGF0ZSB3aXRoIHRoZSAkcGFyZW50LnZhbFxuXHQgICAgdXBkYXRlRnJvbVBhcmVudDogZnVuY3Rpb24gdXBkYXRlRnJvbVBhcmVudCgpIHtcblx0ICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICAgIHZhciBpbmRleCA9IHRoaXMuJHBhcmVudC52YWwuaW5kZXhPZih0aGlzLnRydWVWYWx1ZSk7XG5cdCAgICAgICAgdGhpcy5jaGVja2VkID0gfmluZGV4O1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHRcblx0ICAgIC8vIGNhbGxlZCB3aGVuIG91ciBjaGVja2VkIHN0YXRlIGNoYW5nZXNcblx0ICAgIHVwZGF0ZVBhcmVudDogZnVuY3Rpb24gdXBkYXRlUGFyZW50KCkge1xuXHQgICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudHJ1ZVZhbHVlKTtcblx0ICAgICAgICBpZiAodGhpcy5jaGVja2VkICYmICF+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwucHVzaCh0aGlzLnRydWVWYWx1ZSk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnNwbGljZShpbmRleCwgMSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcblx0ICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDk5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoX3ZtLmlzQnV0dG9uID8gJ2EnIDogJ2xhYmVsJywge1xuXHQgICAgdGFnOiBcImFcIixcblx0ICAgIGNsYXNzOiBbX3ZtLmlzQnV0dG9uID8gJ2J0biBidG4tJyArIF92bS50eXBlQ29sb3IgOiAnb3BlbiBjaGVja2JveCAnICsgX3ZtLnR5cGVDb2xvciwge1xuXHQgICAgICBhY3RpdmU6IF92bS5jaGVja2VkLFxuXHQgICAgICBkaXNhYmxlZDogX3ZtLmRpc2FibGVkLFxuXHQgICAgICByZWFkb25seTogX3ZtLnJlYWRvbmx5XG5cdCAgICB9XSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnRvZ2dsZVxuXHQgICAgfVxuXHQgIH0sIFsoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5jaGVja2VkID8gX3ZtLnRydWVWYWx1ZSA6IF92bS5mYWxzZVZhbHVlXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKCFfdm0uaXNCdXR0b24pID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbiBkcm9wZG93bi10b2dnbGVcIixcblx0ICAgIGNsYXNzOiBbX3ZtLmNoZWNrZWQgPyAnYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJycsIHtcblx0ICAgICAgYmc6IF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0J1xuXHQgICAgfV1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoIV92bS5pc0J1dHRvbiAmJiBfdm0uY2hlY2tlZCAmJiBfdm0udHlwZUNvbG9yID09PSAnZGVmYXVsdCcpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY5MjJiZjI0XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcRGF0ZXBpY2tlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNDc3YjhlNWRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTQ3N2I4ZTVkXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRGF0ZXBpY2tlci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDc3YjhlNWQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0RhdGVwaWNrZXIudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi00NzdiOGU1ZCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vRGF0ZXBpY2tlci52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmRhdGVwaWNrZXIge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5pbnB1dC5kYXRlcGlja2VyLWlucHV0LndpdGgtcmVzZXQtYnV0dG9uIHtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDI1cHg7XFxufVxcbi5kYXRlcGlja2VyID4gYnV0dG9uLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5kYXRlcGlja2VyID4gYnV0dG9uLmNsb3NlOmZvY3VzIHtcXHJcXG4gIG9wYWNpdHk6IC4yO1xcbn1cXG4uZGF0ZXBpY2tlci1wb3B1cCB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgYmFja2dyb3VuZDogI2ZmZjtcXHJcXG4gIG1hcmdpbi10b3A6IDJweDtcXHJcXG4gIHotaW5kZXg6IDEwMDA7XFxyXFxuICBib3gtc2hhZG93OiAwIDZweCAxMnB4IHJnYmEoMCwwLDAsMC4xNzUpO1xcbn1cXG4uZGF0ZXBpY2tlci1pbm5lciB7XFxyXFxuICB3aWR0aDogMjE4cHg7XFxufVxcbi5kYXRlcGlja2VyLWJvZHkge1xcclxcbiAgcGFkZGluZzogMTBweCAxMHB4O1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHAsXFxyXFxuLmRhdGVwaWNrZXItY3RybCBzcGFuLFxcclxcbi5kYXRlcGlja2VyLWJvZHkgc3BhbiB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICB3aWR0aDogMjhweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyOHB4O1xcclxcbiAgaGVpZ2h0OiAyOHB4O1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHAge1xcclxcbiAgd2lkdGg6IDY1JTtcXG59XFxuLmRhdGVwaWNrZXItY3RybCBzcGFuIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuIHtcXHJcXG4gIHdpZHRoOiA0OHB4O1xcclxcbiAgaGVpZ2h0OiA1MHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDQ1cHg7XFxufVxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7XFxyXFxuICBjdXJzb3I6IG5vdC1hbGxvd2VkIWltcG9ydGFudDtcXG59XFxuLmRlY2FkZVJhbmdlIHNwYW46Zmlyc3QtY2hpbGQsXFxyXFxuLmRlY2FkZVJhbmdlIHNwYW46bGFzdC1jaGlsZCxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUsXFxyXFxuLmRhdGVwaWNrZXItaXRlbS1ncmF5IHtcXHJcXG4gIGNvbG9yOiAjOTk5O1xcbn1cXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmU6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlIHtcXHJcXG4gIGJhY2tncm91bmQ6IHJnYig1MCwgMTE4LCAxNzcpIWltcG9ydGFudDtcXHJcXG4gIGNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Uge1xcclxcbiAgbWFyZ2luLXRvcDogMTBweFxcbn1cXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBzcGFuLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2Ugc3BhbiB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3Bhbjpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHA6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItY3RybCBpOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWhvdmVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3IgOiAjZWVlZWVlO1xcbn1cXG4uZGF0ZXBpY2tlci13ZWVrUmFuZ2Ugc3BhbiB7XFxyXFxuICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuLmRhdGVwaWNrZXItbGFiZWwge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxyXFxuICBwYWRkaW5nOiA3cHggMDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItY3RybCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBoZWlnaHQ6IDMwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzBweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4ubW9udGgtYnRuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDpub25lO1xcclxcbiAgLW1vei11c2VyLXNlbGVjdDpub25lO1xcclxcbiAgLW1zLXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICB1c2VyLXNlbGVjdDpub25lO1xcbn1cXG4uZGF0ZXBpY2tlci1wcmVCdG4ge1xcclxcbiAgbGVmdDogMnB4O1xcbn1cXG4uZGF0ZXBpY2tlci1uZXh0QnRuIHtcXHJcXG4gIHJpZ2h0OiAycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvRGF0ZXBpY2tlci52dWU/NTIwMDZmNmNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQWlWQTtFQUNBLG1CQUFBO0VBQ0Esc0JBQUE7Q0FDQTtBQUNBO0VBQ0Esb0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLGlCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxjQUFBO0VBQ0EseUNBQUE7Q0FDQTtBQUNBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7OztFQUdBLHNCQUFBO0VBQ0EsWUFBQTtFQUNBLGtCQUFBO0VBQ0EsYUFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtDQUNBO0FBQ0E7RUFDQSxrQ0FBQTtFQUNBLDhCQUFBO0NBQ0E7QUFDQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUVBOztFQUVBLHdDQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBOzs7O0VBSUEsZ0JBQUE7Q0FDQTtBQUNBOzs7OztFQUtBLDJCQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLDBCQUFBO0VBQ0EsaUJBQUE7RUFDQSxlQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0VBQ0EseUJBQUE7RUFDQSxzQkFBQTtFQUNBLHFCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0EsVUFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0NBQ0FcIixcImZpbGVcIjpcIkRhdGVwaWNrZXIudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXJcXFwiPlxcclxcbiAgICA8aW5wdXQgY2xhc3M9XFxcImZvcm0tY29udHJvbCBkYXRlcGlja2VyLWlucHV0XFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIlxcclxcbiAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICA6Y2xhc3M9XFxcInsnd2l0aC1yZXNldC1idXR0b24nOiBjbGVhckJ1dHRvbn1cXFwiXFxyXFxuICAgICAgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICA6c3R5bGU9XFxcInt3aWR0aDp3aWR0aH1cXFwiXFxyXFxuICAgICAgQGNsaWNrPVxcXCJpbnB1dENsaWNrXFxcIlxcclxcbiAgICAvPlxcclxcbiAgICA8YnV0dG9uIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWxcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9ICcnXFxcIj5cXHJcXG4gICAgICA8c3Bhbj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICA8L2J1dHRvbj5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1wb3B1cFxcXCIgdi1zaG93PVxcXCJkaXNwbGF5RGF5Vmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dE1vbnRoQ2xpY2soMClcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcIm5leHRCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0TW9udGhDbGljaygxKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxwIEBjbGljaz1cXFwic3dpdGNoTW9udGhWaWV3XFxcIj57e3N0cmluZ2lmeURheUhlYWRlcihjdXJyRGF0ZSl9fTwvcD5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItd2Vla1JhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiB2LWZvcj1cXFwidyBpbiB0ZXh0LmRheXNPZldlZWtcXFwiPnt7d319PC9zcGFuPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1kYXRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIHYtZm9yPVxcXCJkIGluIGRhdGVSYW5nZVxcXCIgOmNsYXNzPVxcXCJkLnNjbGFzc1xcXCIgQGNsaWNrPVxcXCJkYXlTZWxlY3QoZClcXFwiPnt7ZC50ZXh0fX08L3NwYW4+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlNb250aFZpZXdcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItaW5uZXJcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1jdHJsXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcInByZUJ0bkNsYXNzZXNcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIiBAY2xpY2s9XFxcInByZU5leHRZZWFyQ2xpY2soMClcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcIm5leHRCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0WWVhckNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHAgQGNsaWNrPVxcXCJzd2l0Y2hEZWNhZGVWaWV3XFxcIj57e3N0cmluZ2lmeVllYXJIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiKG0sIGluZGV4KSBpbiB0ZXh0Lm1vbnRoc1xcXCI+XFxyXFxuICAgICAgICAgICAgICA8c3BhbiB2LXRleHQ9XFxcIm0uc3Vic3RyKDAsMylcXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6XFxyXFxuICAgICAgICAgICAgICAgICAgKHRleHQubW9udGhzW3BhcnNlKHZhbCkuZ2V0TW9udGgoKV0gPT09IG0pICYmXFxyXFxuICAgICAgICAgICAgICAgICAgY3VyckRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gcGFyc2UodmFsKS5nZXRGdWxsWWVhcigpfVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgQGNsaWNrPVxcXCJtb250aFNlbGVjdChpbmRleClcXFwiXFxyXFxuICAgICAgICAgICAgICA+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlZZWFyVmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHA+e3tzdHJpbmdpZnlEZWNhZGVIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2UgZGVjYWRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiZGVjYWRlIGluIGRlY2FkZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6cGFyc2UodmFsKS5nZXRGdWxsWWVhcigpID09PSBkZWNhZGUudGV4dH1cXFwiXFxyXFxuICAgICAgICAgICAgICAgIHYtdGV4dD1cXFwiZGVjYWRlLnRleHRcXFwiXFxyXFxuICAgICAgICAgICAgICAgIEBjbGljay5zdG9wPVxcXCJ5ZWFyU2VsZWN0KGRlY2FkZS50ZXh0KVxcXCJcXHJcXG4gICAgICAgICAgICAgID48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHt0cmFuc2xhdGlvbnN9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuLy8gaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICB2YWx1ZToge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGZvcm1hdDoge2RlZmF1bHQ6ICdNTS9kZC95eXl5J30sXFxyXFxuICAgIGRpc2FibGVkRGF5c09mV2Vlazoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGNsZWFyQnV0dG9uOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIGljb25zRm9udDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2dseXBoaWNvbid9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgY3VyckRhdGU6IG5ldyBEYXRlKCksXFxyXFxuICAgICAgZGF0ZVJhbmdlOiBbXSxcXHJcXG4gICAgICBkZWNhZGVSYW5nZTogW10sXFxyXFxuICAgICAgZGlzcGxheURheVZpZXc6IGZhbHNlLFxcclxcbiAgICAgIGRpc3BsYXlNb250aFZpZXc6IGZhbHNlLFxcclxcbiAgICAgIGRpc3BsYXlZZWFyVmlldzogZmFsc2UsXFxyXFxuICAgICAgdmFsOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjdXJyRGF0ZSAoKSB7XFxyXFxuICAgICAgdGhpcy5nZXREYXRlUmFuZ2UoKVxcclxcbiAgICB9LFxcclxcbiAgICBmb3JtYXQgKCkge1xcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICB9LFxcclxcbiAgICB2YWx1ZSAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsICE9PSB2YWwpIHsgdGhpcy52YWwgPSB2YWwgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgdGV4dCAoKSB7XFxyXFxuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpXFxyXFxuICAgIH0sXFxyXFxuICAgIHByZUJ0bkNsYXNzZXMgKCkge1xcclxcbiAgICAgIHJldHVybiBgZGF0ZXBpY2tlci1wcmVCdG4gJHt0aGlzLmljb25zRm9udH0gJHt0aGlzLmljb25zRm9udH0tY2hldnJvbi1sZWZ0YFxcclxcbiAgICB9LFxcclxcbiAgICBuZXh0QnRuQ2xhc3NlcyAoKSB7XFxyXFxuICAgICAgcmV0dXJuIGBkYXRlcGlja2VyLW5leHRCdG4gJHt0aGlzLmljb25zRm9udH0gJHt0aGlzLmljb25zRm9udH0tY2hldnJvbi1yaWdodGBcXHJcXG4gICAgfSxcXHJcXG4gICAgZGlzYWJsZWREYXlzQXJyYXkgKCkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF5c09mV2Vlay5tYXAoZCA9PiBwYXJzZUludChkLCAxMCkpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGNsb3NlICgpIHtcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICB9LFxcclxcbiAgICBpbnB1dENsaWNrICgpIHtcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbCkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKVxcclxcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlNb250aFZpZXcgfHwgdGhpcy5kaXNwbGF5WWVhclZpZXcpIHtcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gIXRoaXMuZGlzcGxheURheVZpZXdcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHByZU5leHREZWNhZGVDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKClcXHJcXG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKClcXHJcXG5cXHJcXG4gICAgICBpZiAoZmxhZyA9PT0gMCkge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgLSAxMCwgbW9udGhzLCBkYXRlKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEwLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0TW9udGhDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICBjb25zdCBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZShwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCwgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0WWVhckNsaWNrIChmbGFnKSB7XFxyXFxuICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciAtIDEsIG1vbnRocywgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB5ZWFyU2VsZWN0ICh5ZWFyKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZGF5U2VsZWN0IChkYXkpIHtcXHJcXG4gICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBkYXkuZGF0ZVxcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKVxcclxcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzd2l0Y2hNb250aFZpZXcgKCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgc3dpdGNoRGVjYWRlVmlldyAoKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgbW9udGhTZWxlY3QgKGluZGV4KSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksIGluZGV4LCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZ2V0WWVhck1vbnRoICh5ZWFyLCBtb250aCkge1xcclxcbiAgICAgIGlmIChtb250aCA+IDExKSB7XFxyXFxuICAgICAgICB5ZWFyKytcXHJcXG4gICAgICAgIG1vbnRoID0gMFxcclxcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XFxyXFxuICAgICAgICB5ZWFyLS1cXHJcXG4gICAgICAgIG1vbnRoID0gMTFcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIHt5ZWFyOiB5ZWFyLCBtb250aDogbW9udGh9XFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeURlY2FkZUhlYWRlciAoZGF0ZSkge1xcclxcbiAgICAgIGNvbnN0IHllYXJTdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKVxcclxcbiAgICAgIGNvbnN0IGZpcnN0WWVhck9mRGVjYWRlID0geWVhclN0ci5zdWJzdHJpbmcoMCwgeWVhclN0ci5sZW5ndGggLSAxKSArIDBcXHJcXG4gICAgICBjb25zdCBsYXN0WWVhck9mRGVjYWRlID0gcGFyc2VJbnQoZmlyc3RZZWFyT2ZEZWNhZGUsIDEwKSArIDEwXFxyXFxuICAgICAgcmV0dXJuIGZpcnN0WWVhck9mRGVjYWRlICsgJy0nICsgbGFzdFllYXJPZkRlY2FkZVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlEYXlIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldICsgJyAnICsgZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgIH0sXFxyXFxuICAgIHBhcnNlTW9udGggKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldXFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeVllYXJIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgIH0sXFxyXFxuICAgIHN0cmluZ2lmeSAoZGF0ZSwgZm9ybWF0ID0gdGhpcy5mb3JtYXQpIHtcXHJcXG4gICAgICBpZiAoIWRhdGUpIGRhdGUgPSB0aGlzLnBhcnNlKClcXHJcXG4gICAgICBpZiAoIWRhdGUpIHJldHVybiAnJ1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDFcXHJcXG4gICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRoTmFtZSA9IHRoaXMucGFyc2VNb250aChkYXRlKVxcclxcbiAgICAgIHJldHVybiBmb3JtYXRcXHJcXG4gICAgICAgIC5yZXBsYWNlKC95eXl5L2csIHllYXIpXFxyXFxuICAgICAgICAucmVwbGFjZSgveXkvZywgeWVhcilcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTU1NL2csIG1vbnRoTmFtZSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTU0vZywgbW9udGhOYW1lLnN1YnN0cmluZygwLCAzKSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSlcXHJcXG4gICAgICAgIC5yZXBsYWNlKC9NKD8hYSkvZywgbW9udGgpXFxyXFxuICAgICAgICAucmVwbGFjZSgvZGQvZywgKCcwJyArIGRheSkuc2xpY2UoLTIpKVxcclxcbiAgICAgICAgLnJlcGxhY2UoL2QvZywgZGF5KVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZSAoc3RyKSB7XFxyXFxuICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkIHx8IHN0ciA9PT0gbnVsbCkgeyBzdHIgPSB0aGlzLnZhbCB9XFxyXFxuICAgICAgbGV0IGRhdGUgPSBzdHIubGVuZ3RoID09PSAxMCAmJiAodGhpcy5mb3JtYXQgPT09ICdkZC1NTS15eXl5JyB8fCB0aGlzLmZvcm1hdCA9PT0gJ2RkL01NL3l5eXknKSA/XFxyXFxuICAgICAgICBuZXcgRGF0ZShzdHIuc3Vic3RyaW5nKDYsIDEwKSwgc3RyLnN1YnN0cmluZygzLCA1KS0xLCBzdHIuc3Vic3RyaW5nKDAsIDIpKSA6XFxyXFxuICAgICAgICBuZXcgRGF0ZShzdHIpXFxyXFxuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0RnVsbFllYXIoKSkgPyBuZXcgRGF0ZSgpIDogZGF0ZVxcclxcbiAgICB9LFxcclxcbiAgICBnZXREYXlDb3VudCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBjb25zdCBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdXFxyXFxuICAgICAgaWYgKG1vbnRoID09PSAxKSB7XFxyXFxuICAgICAgICBpZiAoKHllYXIgJSA0MDAgPT09IDApIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSkge1xcclxcbiAgICAgICAgICByZXR1cm4gMjlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGRpY3RbbW9udGhdXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldERhdGVSYW5nZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIGNvbnN0IHRpbWUgPSB7XFxyXFxuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXFxyXFxuICAgICAgICBtb250aDogdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLFxcclxcbiAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9ICh5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCkgLSAxXFxyXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XFxyXFxuICAgICAgICB0aGlzLmRlY2FkZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKVxcclxcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcXHJcXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XFxyXFxuICAgICAgICBmaXJzdERheVdlZWsgPSA3XFxyXFxuICAgICAgfVxcclxcbiAgICAgIGNvbnN0IGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpXFxyXFxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcXHJcXG4gICAgICAgIGNvbnN0IHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSlcXHJcXG4gICAgICAgIGNvbnN0IHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aClcXHJcXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF5VGV4dCA9IHByZXZNb250aERheUNvdW50IC0gZmlyc3REYXlXZWVrICsgaSArIDFcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KVxcclxcbiAgICAgICAgICBsZXQgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7dGV4dDogZGF5VGV4dCwgZGF0ZSwgc2NsYXNzIH0pXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRheUNvdW50OyBpKyspIHtcXHJcXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIGkpXFxyXFxuICAgICAgICBsZXQgc2NsYXNzID0gJydcXHJcXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICBpZiAoaSA9PSB0aW1lLmRheSAmJiBkYXRlLmdldEZ1bGxZZWFyKCkgPT0gdGltZS55ZWFyICYmIGRhdGUuZ2V0TW9udGgoKSA9PSB0aW1lLm1vbnRoKXtcXHJcXG4gICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlJ1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7dGV4dDogaSwgZGF0ZSwgc2NsYXNzfSlcXHJcXG4gICAgICB9XFxyXFxuXFxyXFxuICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlLmxlbmd0aCA8IDQyKSB7XFxyXFxuICAgICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcXHJcXG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpXFxyXFxuXFxyXFxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXFxyXFxuICAgICAgICAgIGxldCBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXFxyXFxuICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSdcXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHt0ZXh0OiBpLCBkYXRlLCBzY2xhc3N9KVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcylcXHJcXG4gICAgdGhpcy5jdXJyRGF0ZSA9IHRoaXMucGFyc2UodGhpcy52YWwpIHx8IHRoaXMucGFyc2UobmV3IERhdGUoKSlcXHJcXG4gICAgdGhpcy5fYmx1ciA9IGUgPT4ge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKVxcclxcbiAgICAgICAgdGhpcy5jbG9zZSgpXFxyXFxuICAgIH1cXHJcXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JsdXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxufVxcclxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDEwMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHQvLyBpbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB2YWx1ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGZvcm1hdDogeyBkZWZhdWx0OiAnTU0vZGQveXl5eScgfSxcblx0ICAgIGRpc2FibGVkRGF5c09mV2VlazogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG5cdCAgICAgICAgcmV0dXJuIFtdO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBpY29uc0ZvbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZ2x5cGhpY29uJyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY3VyckRhdGU6IG5ldyBEYXRlKCksXG5cdCAgICAgIGRhdGVSYW5nZTogW10sXG5cdCAgICAgIGRlY2FkZVJhbmdlOiBbXSxcblx0ICAgICAgZGlzcGxheURheVZpZXc6IGZhbHNlLFxuXHQgICAgICBkaXNwbGF5TW9udGhWaWV3OiBmYWxzZSxcblx0ICAgICAgZGlzcGxheVllYXJWaWV3OiBmYWxzZSxcblx0ICAgICAgdmFsOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBjdXJyRGF0ZTogZnVuY3Rpb24gY3VyckRhdGUoKSB7XG5cdCAgICAgIHRoaXMuZ2V0RGF0ZVJhbmdlKCk7XG5cdCAgICB9LFxuXHQgICAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQoKSB7XG5cdCAgICAgIHRoaXMudmFsID0gdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSk7XG5cdCAgICB9LFxuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdGV4dDogZnVuY3Rpb24gdGV4dCgpIHtcblx0ICAgICAgcmV0dXJuICgwLCBfdXRpbHMudHJhbnNsYXRpb25zKSh0aGlzLmxhbmcpO1xuXHQgICAgfSxcblx0ICAgIHByZUJ0bkNsYXNzZXM6IGZ1bmN0aW9uIHByZUJ0bkNsYXNzZXMoKSB7XG5cdCAgICAgIHJldHVybiAnZGF0ZXBpY2tlci1wcmVCdG4gJyArIHRoaXMuaWNvbnNGb250ICsgJyAnICsgdGhpcy5pY29uc0ZvbnQgKyAnLWNoZXZyb24tbGVmdCc7XG5cdCAgICB9LFxuXHQgICAgbmV4dEJ0bkNsYXNzZXM6IGZ1bmN0aW9uIG5leHRCdG5DbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gJ2RhdGVwaWNrZXItbmV4dEJ0biAnICsgdGhpcy5pY29uc0ZvbnQgKyAnICcgKyB0aGlzLmljb25zRm9udCArICctY2hldnJvbi1yaWdodCc7XG5cdCAgICB9LFxuXHQgICAgZGlzYWJsZWREYXlzQXJyYXk6IGZ1bmN0aW9uIGRpc2FibGVkRGF5c0FycmF5KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERheXNPZldlZWsubWFwKGZ1bmN0aW9uIChkKSB7XG5cdCAgICAgICAgcmV0dXJuIHBhcnNlSW50KGQsIDEwKTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIGlucHV0Q2xpY2s6IGZ1bmN0aW9uIGlucHV0Q2xpY2soKSB7XG5cdCAgICAgIHRoaXMuY3VyckRhdGUgPSB0aGlzLnBhcnNlKHRoaXMudmFsKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgICBpZiAodGhpcy5kaXNwbGF5TW9udGhWaWV3IHx8IHRoaXMuZGlzcGxheVllYXJWaWV3KSB7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSAhdGhpcy5kaXNwbGF5RGF5Vmlldztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHREZWNhZGVDbGljazogZnVuY3Rpb24gcHJlTmV4dERlY2FkZUNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMTAsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxMCwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHRNb250aENsaWNrOiBmdW5jdGlvbiBwcmVOZXh0TW9udGhDbGljayhmbGFnKSB7XG5cdCAgICAgIHZhciB5ZWFyID0gdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgICB2YXIgbW9udGggPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSk7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKTtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwcmVOZXh0WWVhckNsaWNrOiBmdW5jdGlvbiBwcmVOZXh0WWVhckNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMSwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB5ZWFyU2VsZWN0OiBmdW5jdGlvbiB5ZWFyU2VsZWN0KHllYXIpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpO1xuXHQgICAgfSxcblx0ICAgIGRheVNlbGVjdDogZnVuY3Rpb24gZGF5U2VsZWN0KGRheSkge1xuXHQgICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gZGF5LmRhdGU7XG5cdCAgICAgICAgdGhpcy52YWwgPSB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKTtcblx0ICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzd2l0Y2hNb250aFZpZXc6IGZ1bmN0aW9uIHN3aXRjaE1vbnRoVmlldygpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHN3aXRjaERlY2FkZVZpZXc6IGZ1bmN0aW9uIHN3aXRjaERlY2FkZVZpZXcoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlZZWFyVmlldyA9IHRydWU7XG5cdCAgICB9LFxuXHQgICAgbW9udGhTZWxlY3Q6IGZ1bmN0aW9uIG1vbnRoU2VsZWN0KGluZGV4KSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKSwgaW5kZXgsIHRoaXMuY3VyckRhdGUuZ2V0RGF0ZSgpKTtcblx0ICAgIH0sXG5cdCAgICBnZXRZZWFyTW9udGg6IGZ1bmN0aW9uIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuXHQgICAgICBpZiAobW9udGggPiAxMSkge1xuXHQgICAgICAgIHllYXIrKztcblx0ICAgICAgICBtb250aCA9IDA7XG5cdCAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XG5cdCAgICAgICAgeWVhci0tO1xuXHQgICAgICAgIG1vbnRoID0gMTE7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHsgeWVhcjogeWVhciwgbW9udGg6IG1vbnRoIH07XG5cdCAgICB9LFxuXHQgICAgc3RyaW5naWZ5RGVjYWRlSGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlEZWNhZGVIZWFkZXIoZGF0ZSkge1xuXHQgICAgICB2YXIgeWVhclN0ciA9IGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpO1xuXHQgICAgICB2YXIgZmlyc3RZZWFyT2ZEZWNhZGUgPSB5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMDtcblx0ICAgICAgdmFyIGxhc3RZZWFyT2ZEZWNhZGUgPSBwYXJzZUludChmaXJzdFllYXJPZkRlY2FkZSwgMTApICsgMTA7XG5cdCAgICAgIHJldHVybiBmaXJzdFllYXJPZkRlY2FkZSArICctJyArIGxhc3RZZWFyT2ZEZWNhZGU7XG5cdCAgICB9LFxuXHQgICAgc3RyaW5naWZ5RGF5SGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlEYXlIZWFkZXIoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldICsgJyAnICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgfSxcblx0ICAgIHBhcnNlTW9udGg6IGZ1bmN0aW9uIHBhcnNlTW9udGgoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0Lm1vbnRoc1tkYXRlLmdldE1vbnRoKCldO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeVllYXJIZWFkZXI6IGZ1bmN0aW9uIHN0cmluZ2lmeVllYXJIZWFkZXIoZGF0ZSkge1xuXHQgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGRhdGUpIHtcblx0ICAgICAgdmFyIGZvcm1hdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdGhpcy5mb3JtYXQ7XG5cdFxuXHQgICAgICBpZiAoIWRhdGUpIGRhdGUgPSB0aGlzLnBhcnNlKCk7XG5cdCAgICAgIGlmICghZGF0ZSkgcmV0dXJuICcnO1xuXHQgICAgICB2YXIgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgICAgdmFyIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcblx0ICAgICAgdmFyIGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHQgICAgICB2YXIgbW9udGhOYW1lID0gdGhpcy5wYXJzZU1vbnRoKGRhdGUpO1xuXHQgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoL3l5eXkvZywgeWVhcikucmVwbGFjZSgveXkvZywgeWVhcikucmVwbGFjZSgvTU1NTS9nLCBtb250aE5hbWUpLnJlcGxhY2UoL01NTS9nLCBtb250aE5hbWUuc3Vic3RyaW5nKDAsIDMpKS5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSkucmVwbGFjZSgvTSg/IWEpL2csIG1vbnRoKS5yZXBsYWNlKC9kZC9nLCAoJzAnICsgZGF5KS5zbGljZSgtMikpLnJlcGxhY2UoL2QvZywgZGF5KTtcblx0ICAgIH0sXG5cdCAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG5cdCAgICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCB8fCBzdHIgPT09IG51bGwpIHtcblx0ICAgICAgICBzdHIgPSB0aGlzLnZhbDtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZGF0ZSA9IHN0ci5sZW5ndGggPT09IDEwICYmICh0aGlzLmZvcm1hdCA9PT0gJ2RkLU1NLXl5eXknIHx8IHRoaXMuZm9ybWF0ID09PSAnZGQvTU0veXl5eScpID8gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSkgLSAxLCBzdHIuc3Vic3RyaW5nKDAsIDIpKSA6IG5ldyBEYXRlKHN0cik7XG5cdCAgICAgIHJldHVybiBpc05hTihkYXRlLmdldEZ1bGxZZWFyKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG5cdCAgICB9LFxuXHQgICAgZ2V0RGF5Q291bnQ6IGZ1bmN0aW9uIGdldERheUNvdW50KHllYXIsIG1vbnRoKSB7XG5cdCAgICAgIHZhciBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuXHQgICAgICBpZiAobW9udGggPT09IDEpIHtcblx0ICAgICAgICBpZiAoeWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB7XG5cdCAgICAgICAgICByZXR1cm4gMjk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBkaWN0W21vbnRoXTtcblx0ICAgIH0sXG5cdCAgICBnZXREYXRlUmFuZ2U6IGZ1bmN0aW9uIGdldERhdGVSYW5nZSgpIHtcblx0ICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXTtcblx0ICAgICAgdGhpcy5kZWNhZGVSYW5nZSA9IFtdO1xuXHQgICAgICB2YXIgdGltZSA9IHtcblx0ICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXG5cdCAgICAgICAgbW9udGg6IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSxcblx0ICAgICAgICBkYXk6IHRoaXMuY3VyckRhdGUuZ2V0RGF0ZSgpXG5cdCAgICAgIH07XG5cdCAgICAgIHZhciB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKCk7XG5cdCAgICAgIHZhciBmaXJzdFllYXJPZkRlY2FkZSA9IHllYXJTdHIuc3Vic3RyaW5nKDAsIHllYXJTdHIubGVuZ3RoIC0gMSkgKyAwIC0gMTtcblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG5cdCAgICAgICAgdGhpcy5kZWNhZGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgIHRleHQ6IGZpcnN0WWVhck9mRGVjYWRlICsgaVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIDEpO1xuXHQgICAgICB2YXIgZmlyc3REYXlXZWVrID0gY3Vyck1vbnRoRmlyc3REYXkuZ2V0RGF5KCkgKyAxO1xuXHQgICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XG5cdCAgICAgICAgZmlyc3REYXlXZWVrID0gNztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZGF5Q291bnQgPSB0aGlzLmdldERheUNvdW50KHRpbWUueWVhciwgdGltZS5tb250aCk7XG5cdCAgICAgIGlmIChmaXJzdERheVdlZWsgPiAxKSB7XG5cdCAgICAgICAgdmFyIHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSk7XG5cdCAgICAgICAgdmFyIHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCk7XG5cdCAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGZpcnN0RGF5V2VlazsgX2krKykge1xuXHQgICAgICAgICAgdmFyIGRheVRleHQgPSBwcmV2TW9udGhEYXlDb3VudCAtIGZpcnN0RGF5V2VlayArIF9pICsgMTtcblx0ICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUocHJlTW9udGgueWVhciwgcHJlTW9udGgubW9udGgsIGRheVRleHQpO1xuXHQgICAgICAgICAgdmFyIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZ3JheSc7XG5cdCAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcblx0ICAgICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goeyB0ZXh0OiBkYXlUZXh0LCBkYXRlOiBkYXRlLCBzY2xhc3M6IHNjbGFzcyB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8PSBkYXlDb3VudDsgX2kyKyspIHtcblx0ICAgICAgICB2YXIgX2RhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIF9pMik7XG5cdCAgICAgICAgdmFyIF9zY2xhc3MgPSAnJztcblx0ICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICBfc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKF9pMiA9PSB0aW1lLmRheSAmJiBfZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBfZGF0ZS5nZXRNb250aCgpID09IHRpbWUubW9udGgpIHtcblx0ICAgICAgICAgIF9zY2xhc3MgPSAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHsgdGV4dDogX2kyLCBkYXRlOiBfZGF0ZSwgc2NsYXNzOiBfc2NsYXNzIH0pO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBpZiAodGhpcy5kYXRlUmFuZ2UubGVuZ3RoIDwgNDIpIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoTmVlZCA9IDQyIC0gdGhpcy5kYXRlUmFuZ2UubGVuZ3RoO1xuXHQgICAgICAgIHZhciBuZXh0TW9udGggPSB0aGlzLmdldFllYXJNb250aCh0aW1lLnllYXIsIHRpbWUubW9udGggKyAxKTtcblx0XG5cdCAgICAgICAgZm9yICh2YXIgX2kzID0gMTsgX2kzIDw9IG5leHRNb250aE5lZWQ7IF9pMysrKSB7XG5cdCAgICAgICAgICB2YXIgX2RhdGUyID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgX2kzKTtcblx0ICAgICAgICAgIHZhciBfc2NsYXNzMiA9ICdkYXRlcGlja2VyLWl0ZW0tZ3JheSc7XG5cdCAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlMi5nZXREYXkoKSkgPiAtMSkge1xuXHQgICAgICAgICAgICBfc2NsYXNzMiA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSc7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHsgdGV4dDogX2kzLCBkYXRlOiBfZGF0ZTIsIHNjbGFzczogX3NjbGFzczIgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcyk7XG5cdCAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbCkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKTtcblx0ICAgIHRoaXMuX2JsdXIgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZiAoIV90aGlzLiRlbC5jb250YWlucyhlLnRhcmdldCkpIF90aGlzLmNsb3NlKCk7XG5cdCAgICB9O1xuXHQgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2wgZGF0ZXBpY2tlci1pbnB1dFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgJ3dpdGgtcmVzZXQtYnV0dG9uJzogX3ZtLmNsZWFyQnV0dG9uXG5cdCAgICB9LFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ud2lkdGhcblx0ICAgIH0pLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwidGV4dFwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlclxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uaW5wdXRDbGljayxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS52YWwgPSAnJ1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzcGxheURheVZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlEYXlWaWV3XCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1wb3B1cFwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1pbm5lclwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1ib2R5XCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWN0cmxcIlxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLnByZUJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dE1vbnRoQ2xpY2soMClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLm5leHRCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRNb250aENsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywge1xuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uc3dpdGNoTW9udGhWaWV3XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURheUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItd2Vla1JhbmdlXCJcblx0ICB9LCBfdm0uX2woKF92bS50ZXh0LmRheXNPZldlZWspLCBmdW5jdGlvbih3KSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdihfdm0uX3ModykpXSlcblx0ICB9KSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1kYXRlUmFuZ2VcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLmRhdGVSYW5nZSksIGZ1bmN0aW9uKGQpIHtcblx0ICAgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGNsYXNzOiBkLnNjbGFzcyxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLmRheVNlbGVjdChkKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3MoZC50ZXh0KSldKVxuXHQgIH0pKV0pXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uZGlzcGxheU1vbnRoVmlldyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiZGlzcGxheU1vbnRoVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRZZWFyQ2xpY2soMClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBjbGFzczogX3ZtLm5leHRCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRZZWFyQ2xpY2soMSlcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3AnLCB7XG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5zd2l0Y2hEZWNhZGVWaWV3XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeVllYXJIZWFkZXIoX3ZtLmN1cnJEYXRlKSkpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2VcIlxuXHQgIH0sIFtfdm0uX2woKF92bS50ZXh0Lm1vbnRocyksIGZ1bmN0aW9uKG0sIGluZGV4KSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOlxuXHQgICAgICAgIChfdm0udGV4dC5tb250aHNbX3ZtLnBhcnNlKF92bS52YWwpLmdldE1vbnRoKCldID09PSBtKSAmJlxuXHQgICAgICAgIF92bS5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpID09PSBfdm0ucGFyc2UoX3ZtLnZhbCkuZ2V0RnVsbFllYXIoKVxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidGV4dENvbnRlbnRcIjogX3ZtLl9zKG0uc3Vic3RyKDAsIDMpKVxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICBfdm0ubW9udGhTZWxlY3QoaW5kZXgpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9KV1cblx0ICB9KV0sIDIpXSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5kaXNwbGF5WWVhclZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlZZWFyVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHREZWNhZGVDbGljaygwKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ubmV4dEJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dERlY2FkZUNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURlY2FkZUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItbW9udGhSYW5nZSBkZWNhZGVSYW5nZVwiXG5cdCAgfSwgW192bS5fbCgoX3ZtLmRlY2FkZVJhbmdlKSwgZnVuY3Rpb24oZGVjYWRlKSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOiBfdm0ucGFyc2UoX3ZtLnZhbCkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHRcblx0ICAgICAgfSxcblx0ICAgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgICBcInRleHRDb250ZW50XCI6IF92bS5fcyhkZWNhZGUudGV4dClcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICAgX3ZtLnllYXJTZWxlY3QoZGVjYWRlLnRleHQpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9KV1cblx0ICB9KV0sIDIpXSldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDc3YjhlNWRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA2KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxEcm9wZG93bi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzliZTEwNzJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTM5YmUxMDcyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRHJvcGRvd24udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBzaXplOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICB2YXIgc2hvdyA9IHRoaXMudmFsdWU7XG5cdCAgICByZXR1cm4geyBzaG93OiBzaG93IH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHNob3c6IGZ1bmN0aW9uIHNob3codmFsKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBidXR0b25TaXplOiBmdW5jdGlvbiBidXR0b25TaXplKCkge1xuXHQgICAgICByZXR1cm4gflsnbGcnLCAnc20nLCAneHMnXS5pbmRleE9mKHRoaXMuc2l6ZSkgPyAnYnRuLScgKyB0aGlzLnNpemUgOiAnJztcblx0ICAgIH0sXG5cdCAgICBpbklucHV0OiBmdW5jdGlvbiBpbklucHV0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50Ll9pbnB1dDtcblx0ICAgIH0sXG5cdCAgICBpc0xpOiBmdW5jdGlvbiBpc0xpKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50Ll9pc1RhYnMgfHwgdGhpcy4kcGFyZW50Ll9uYXZiYXIgfHwgdGhpcy4kcGFyZW50Lm1lbnU7XG5cdCAgICB9LFxuXHQgICAgbWVudTogZnVuY3Rpb24gbWVudSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLiRwYXJlbnQgfHwgdGhpcy4kcGFyZW50Lm5hdmJhcjtcblx0ICAgIH0sXG5cdCAgICBzbG90czogZnVuY3Rpb24gc2xvdHMoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zbG90Q29udGVudHM7XG5cdCAgICB9LFxuXHQgICAgc3VibWVudTogZnVuY3Rpb24gc3VibWVudSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiAodGhpcy4kcGFyZW50Lm1lbnUgfHwgdGhpcy4kcGFyZW50LnN1Ym1lbnUpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcblx0ICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuXHQgICAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3c7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCd1bCcsIHRoaXMuJGVsKS5vbignY2xpY2snLCAnbGk+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIF90aGlzLnNob3cgPSBmYWxzZTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCd1bCcsIHRoaXMuJGVsKS5vZmYoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uaXNMaSA/ICdsaScgOiAnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJjbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1jbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmJsdXIpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImJsdXJcIlxuXHQgICAgfV0sXG5cdCAgICB0YWc6IFwiZGl2XCIsXG5cdCAgICBjbGFzczogW3tcblx0ICAgICAgb3BlbjogX3ZtLnNob3csXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIGRyb3Bkb3duOiBfdm0uaXNMaSxcblx0ICAgICAgJ2lucHV0LWdyb3VwLWJ0bic6IF92bS5pbklucHV0LFxuXHQgICAgICAnYnRuLWdyb3VwJzogIV92bS5pc0xpICYmICFfdm0uaW5JbnB1dFxuXHQgICAgfV1cblx0ICB9LCBbX3ZtLl90KFwiYmVmb3JlXCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmlzTGkpID8gX3ZtLl9jKCdhJywge1xuXHQgICAgY2xhc3M6IFsnZHJvcGRvd24tdG9nZ2xlJywgX3ZtLmJ1dHRvblNpemUsIHtcblx0ICAgICAgZGlzYWJsZWQ6IF92bS5kaXNhYmxlZFxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwia2V5dXBcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5zaG93ID0gZmFsc2Vcblx0ICAgICAgfSxcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJidXR0b25cIiwgW192bS5fdihfdm0uX3MoX3ZtLnRleHQpKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJldFwiXG5cdCAgfSldLCAyKSA6IF92bS5fYygnYnV0dG9uJywge1xuXHQgICAgY2xhc3M6IFsnYnRuIGJ0bi0nICsgX3ZtLnR5cGUsIF92bS5idXR0b25TaXplLCAnZHJvcGRvd24tdG9nZ2xlJ10sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJidXR0b25cIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZXNjXCIsIDI3KSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uc2hvdyA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiYnV0dG9uXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50ZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2FyZXRcIlxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRyb3Bkb3duLW1lbnVcIiwgW192bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zOWJlMTA3MlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEwOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEZvcm1Hcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzllYjQwMGFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTc5ZWI0MDBhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gRm9ybUdyb3VwLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vIGxldCBjb2VyY2UgPSB7XG5cdC8vICAgICBlbnRlclN1Ym1pdDogJ2Jvb2xlYW4nLFxuXHQvLyAgICAgaWNvbjogJ2Jvb2xlYW4nXG5cdC8vIH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZW50ZXJTdWJtaXQ6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogZmFsc2Vcblx0ICAgIH0sXG5cdCAgICBpY29uOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9LFxuXHQgICAgbGFuZzoge1xuXHQgICAgICB0eXBlOiBTdHJpbmcsXG5cdCAgICAgIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoaWxkcmVuOiBbXSxcblx0ICAgICAgdmFsaWQ6IG51bGwsXG5cdCAgICAgIHRpbWVvdXQ6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbGlkOiBmdW5jdGlvbiB2YWxpZCh2YWwsIG9sZCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuXHQgICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuXHQgICAgICB0aGlzLmNoaWxkcmVuLnNvbWUoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgdmFyIHYgPSBlbC52YWxpZGF0ZSA/IGVsLnZhbGlkYXRlKCkgOiBlbC52YWxpZCAhPT0gdW5kZWZpbmVkID8gZWwudmFsaWQgOiBlbC5yZXF1aXJlZCAmJiAhflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKGVsLnZhbHVlKTtcblx0ICAgICAgICBpZiAoIXYpIHZhbGlkID0gZmFsc2U7XG5cdCAgICAgICAgcmV0dXJuICF2YWxpZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMudmFsaWQgPSB2YWxpZDtcblx0ICAgICAgcmV0dXJuIHZhbGlkID09PSB0cnVlO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2Zvcm1Hcm91cCA9IHRydWU7XG5cdCAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtR3JvdXApIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybUdyb3VwKSB7XG5cdCAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy52YWxpZGF0ZSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDExMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03OWViNDAwYVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEzKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEZvcm1WYWxpZGF0b3IudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWI5ZjU3YzQ2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1iOWY1N2M0NlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEZvcm1WYWxpZGF0b3IudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTEyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBlbnRlclN1Ym1pdDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgaWNvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgdmFsdWU6IG51bGxcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGlsZHJlbjogW10sXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuXHQgICAgICB2YXIgaW52YWxpZCA9ICF0aGlzLmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbC52YWxpZGF0ZSA/IGVsLnZhbGlkYXRlKCkgOiBlbC52YWxpZCAhPT0gdW5kZWZpbmVkID8gZWwudmFsaWQgOiBlbC5yZXF1aXJlZCAmJiAhflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKGVsLnZhbHVlKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMudmFsaWQgPSAhaW52YWxpZDtcblx0ICAgICAgcmV0dXJuICFpbnZhbGlkO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2Zvcm1WYWxpZGF0b3IgPSB0cnVlO1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcblx0ICAgIH1cblx0ICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdGhpcy52YWxpZGF0ZSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDExMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdzcGFuJywgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1iOWY1N2M0NlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMTUpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTcpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE4KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXElucHV0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtNjUyYWQ3YjlcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTY1MmFkN2I5XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi02NTJhZDdiOVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIElucHV0LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDExNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE2KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02NTJhZDdiOSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vSW5wdXQudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02NTJhZDdiOSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vSW5wdXQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTE2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5mb3JtLWdyb3VwW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5sYWJlbH4uY2xvc2VbZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICB0b3A6IDI1cHg7XFxufVxcbi5pbnB1dC1ncm91cD4uaWNvbltkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxyXFxuICB3aWR0aDowO1xcclxcbiAgei1pbmRleDogMztcXG59XFxuLmNsb3NlW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICB6LWluZGV4OiAyO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMzRweDtcXHJcXG4gIGhlaWdodDogMzRweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzNHB4O1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uaGFzLWZlZWRiYWNrIC5jbG9zZVtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHJpZ2h0OiAyMHB4O1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0lucHV0LnZ1ZT81NmNlMTY5ZFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBMFFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsVUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EsUUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiSW5wdXQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIDpjbGFzcz1cXFwie3ZhbGlkYXRlOmNhblZhbGlkYXRlLCdoYXMtZmVlZGJhY2snOmljb24sJ2hhcy1lcnJvcic6Y2FuVmFsaWRhdGUmJnZhbGlkPT09ZmFsc2UsJ2hhcy1zdWNjZXNzJzpjYW5WYWxpZGF0ZSYmdmFsaWR9XFxcIj5cXHJcXG4gICAgPHNsb3QgbmFtZT1cXFwibGFiZWxcXFwiPjxsYWJlbCB2LWlmPVxcXCJsYWJlbFxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7bGFiZWx9fTwvbGFiZWw+PC9zbG90PlxcclxcbiAgICA8ZGl2IHYtaWY9XFxcIiRzbG90cy5iZWZvcmV8fCRzbG90cy5hZnRlclxcXCIgY2xhc3M9XFxcImlucHV0LWdyb3VwXFxcIj5cXHJcXG4gICAgICA8c2xvdCBuYW1lPVxcXCJiZWZvcmVcXFwiPjwvc2xvdD5cXHJcXG4gICAgICA8dGV4dGFyZWEgOmlzPVxcXCJ0eXBlPT0ndGV4dGFyZWEnP3R5cGU6J2lucHV0J1xcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIDpjb2xzPVxcXCJjb2xzXFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAgIDpsaXN0PVxcXCJpZF9kYXRhbGlzdFxcXCJcXHJcXG4gICAgICAgIDptYXg9XFxcImF0dHIobWF4KVxcXCJcXHJcXG4gICAgICAgIDptYXhsZW5ndGg9XFxcIm1heGxlbmd0aFxcXCJcXHJcXG4gICAgICAgIDptaW49XFxcImF0dHIobWluKVxcXCJcXHJcXG4gICAgICAgIDpuYW1lPVxcXCJuYW1lXFxcIlxcclxcbiAgICAgICAgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICAgIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiXFxyXFxuICAgICAgICA6cmVxdWlyZWQ9XFxcInJlcXVpcmVkXFxcIlxcclxcbiAgICAgICAgOnJvd3M9XFxcInJvd3NcXFwiXFxyXFxuICAgICAgICA6c3RlcD1cXFwic3RlcFxcXCJcXHJcXG4gICAgICAgIDp0aXRsZT1cXFwiYXR0cih0aXRsZSlcXFwiXFxyXFxuICAgICAgICA6dHlwZT1cXFwidHlwZT09J3RleHRhcmVhJz9udWxsOnR5cGVcXFwiXFxyXFxuICAgICAgICB2LW1vZGVsPVxcXCJ2YWxcXFwiXFxyXFxuICAgICAgICBAYmx1cj1cXFwiZW1pdFxcXCIgQGZvY3VzPVxcXCJlbWl0XFxcIiBAaW5wdXQ9XFxcImVtaXRcXFwiXFxyXFxuICAgICAgICBAa2V5dXAuZW50ZXI9XFxcInR5cGUhPSd0ZXh0YXJlYScmJmVudGVyU3VibWl0JiZzdWJtaXQoKVxcXCJcXHJcXG4gICAgICA+PC90ZXh0YXJlYT5cXHJcXG4gICAgICA8ZGl2IHYtaWY9XFxcImNsZWFyQnV0dG9uICYmIHZhbHVlXFxcIiA6Y2xhc3M9XFxcIntpY29uOmljb259XFxcIj5cXHJcXG4gICAgICAgIDxzcGFuIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJ2YWx1ZSA9ICcnXFxcIj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICAgIDxkaXYgdi1pZj1cXFwiaWNvblxcXCIgY2xhc3M9XFxcImljb25cXFwiPlxcclxcbiAgICAgICAgPHNwYW4gdi1pZj1cXFwiaWNvbiYmdmFsaWQhPT1udWxsXFxcIiA6Y2xhc3M9XFxcIlsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsJ2dseXBoaWNvbi0nKyh2YWxpZD8nb2snOidyZW1vdmUnKV1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiYWZ0ZXJcXFwiPjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XFxyXFxuICAgICAgPHRleHRhcmVhIDppcz1cXFwidHlwZT09J3RleHRhcmVhJz90eXBlOidpbnB1dCdcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICA6Y29scz1cXFwiY29sc1xcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgICA6bGlzdD1cXFwiaWRfZGF0YWxpc3RcXFwiXFxyXFxuICAgICAgICA6bWF4PVxcXCJhdHRyKG1heClcXFwiXFxyXFxuICAgICAgICA6bWF4bGVuZ3RoPVxcXCJtYXhsZW5ndGhcXFwiXFxyXFxuICAgICAgICA6bWluPVxcXCJhdHRyKG1pbilcXFwiXFxyXFxuICAgICAgICA6bmFtZT1cXFwibmFtZVxcXCJcXHJcXG4gICAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOnJlcXVpcmVkPVxcXCJyZXF1aXJlZFxcXCJcXHJcXG4gICAgICAgIDpyb3dzPVxcXCJyb3dzXFxcIlxcclxcbiAgICAgICAgOnN0ZXA9XFxcInN0ZXBcXFwiXFxyXFxuICAgICAgICA6dGl0bGU9XFxcImF0dHIodGl0bGUpXFxcIlxcclxcbiAgICAgICAgOnR5cGU9XFxcInR5cGU9PSd0ZXh0YXJlYSc/bnVsbDp0eXBlXFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgICAgQGJsdXI9XFxcImVtaXRcXFwiIEBmb2N1cz1cXFwiZW1pdFxcXCIgQGlucHV0PVxcXCJlbWl0XFxcIlxcclxcbiAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ0eXBlIT0ndGV4dGFyZWEnJiZlbnRlclN1Ym1pdCYmc3VibWl0KClcXFwiXFxyXFxuICAgICAgPjwvdGV4dGFyZWE+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiY2xlYXJCdXR0b24gJiYgdmFsXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwidmFsID0gJydcXFwiPiZ0aW1lczs8L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiaWNvbiYmdmFsaWQhPT1udWxsXFxcIiA6Y2xhc3M9XFxcIlsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsJ2dseXBoaWNvbi0nKyh2YWxpZD8nb2snOidyZW1vdmUnKV1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgIDxkYXRhbGlzdCB2LWlmPVxcXCJpZF9kYXRhbGlzdFxcXCIgOmlkPVxcXCJpZF9kYXRhbGlzdFxcXCI+XFxyXFxuICAgICAgPG9wdGlvbiB2LWZvcj1cXFwib3BjIGluIG9wdGlvbnNcXFwiIDp2YWx1ZT1cXFwib3BjXFxcIj48L29wdGlvbj5cXHJcXG4gICAgPC9kYXRhbGlzdD5cXHJcXG4gICAgPGRpdiB2LWlmPVxcXCJzaG93SGVscFxcXCIgY2xhc3M9XFxcImhlbHAtYmxvY2tcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7aGVscH19PC9kaXY+XFxyXFxuICAgIDxkaXYgdi1pZj1cXFwic2hvd0Vycm9yXFxcIiBjbGFzcz1cXFwiaGVscC1ibG9jayB3aXRoLWVycm9yc1xcXCIgQGNsaWNrPVxcXCJmb2N1c1xcXCI+e3tlcnJvclRleHR9fTwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Y29lcmNlLCBkZWxheWVyLCB0cmFuc2xhdGlvbnN9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG52YXIgREVMQVkgPSAzMDBcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBjbGVhckJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgY29sczoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGRhdGFsaXN0OiB7dHlwZTogQXJyYXksIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBkaXNhYmxlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZW50ZXJTdWJtaXQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGVycm9yOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgaGVscDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGhpZGVIZWxwOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIGljb246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGxhYmVsOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgbGFuZzoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbmF2aWdhdG9yLmxhbmd1YWdlfSxcXHJcXG4gICAgbWFzazogbnVsbCxcXHJcXG4gICAgbWFza0RlbGF5OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDB9LFxcclxcbiAgICBtYXRjaDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1heDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1heGxlbmd0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1pbjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIG1pbmxlbmd0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBwYXR0ZXJuOiB7ZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHJlcXVpcmVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICByb3dzOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzfSxcXHJcXG4gICAgc3RlcDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0J30sXFxyXFxuICAgIHVybDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHVybE1hcDoge3R5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsaWRhdGlvbkRlbGF5OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAyNTB9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgb3B0aW9uczogdGhpcy5kYXRhbGlzdCxcXHJcXG4gICAgICB2YWwsXFxyXFxuICAgICAgdmFsaWQ6IG51bGwsXFxyXFxuICAgICAgdGltZW91dDogbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgY2FuVmFsaWRhdGUgKCkgeyByZXR1cm4gIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHkgJiYgKHRoaXMucmVxdWlyZWQgfHwgdGhpcy5yZWdleCB8fCB0aGlzLm5hdGl2ZVZhbGlkYXRlIHx8IHRoaXMubWF0Y2ggIT09IG51bGwpIH0sXFxyXFxuICAgIGVycm9yVGV4dCAoKSB7XFxyXFxuICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZVxcclxcbiAgICAgIGxldCBlcnJvciA9IFt0aGlzLmVycm9yXVxcclxcbiAgICAgIGlmICghdmFsdWUgJiYgdGhpcy5yZXF1aXJlZCkgZXJyb3IucHVzaCgnKCcgKyB0aGlzLnRleHQucmVxdWlyZWQudG9Mb3dlckNhc2UoKSArICcpJylcXHJcXG4gICAgICBpZiAodmFsdWUgJiYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSkgZXJyb3IucHVzaCgnKCcgKyB0aGlzLnRleHQubWluTGVuZ3RoLnRvTG93ZXJDYXNlKCkgKyAnOiAnICsgdGhpcy5taW5sZW5ndGggKyAnKScpXFxyXFxuICAgICAgcmV0dXJuIGVycm9yLmpvaW4oJyAnKVxcclxcbiAgICB9LFxcclxcbiAgICBpZF9kYXRhbGlzdCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0aGlzLmRhdGFsaXN0IGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIGlmICghdGhpcy5faWRfZGF0YWxpc3QpIHtcXHJcXG4gICAgICAgICAgaWYgKCF0aGlzLiRyb290LmlkX2RhdGFsaXN0KSB7IHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QgPSAwIH1cXHJcXG4gICAgICAgICAgdGhpcy5faWRfZGF0YWxpc3QgPSAnaW5wdXQtZGF0YWxpc3QnICsgdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCsrXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICByZXR1cm4gdGhpcy5faWRfZGF0YWxpc3RcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIG51bGxcXHJcXG4gICAgfSxcXHJcXG4gICAgaW5wdXQgKCkgeyByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dCB9LFxcclxcbiAgICBuYXRpdmVWYWxpZGF0ZSAoKSB7IHJldHVybiAodGhpcy5pbnB1dCB8fCB7fSkuY2hlY2tWYWxpZGl0eSAmJiAoflsndXJsJywgJ2VtYWlsJ10uaW5kZXhPZih0aGlzLnR5cGUudG9Mb3dlckNhc2UoKSkgfHwgdGhpcy5taW4gfHwgdGhpcy5tYXgpIH0sXFxyXFxuICAgIHJlZ2V4ICgpIHsgcmV0dXJuIGNvZXJjZS5wYXR0ZXJuKHRoaXMucGF0dGVybikgfSxcXHJcXG4gICAgc2hvd0Vycm9yICgpIHsgcmV0dXJuIHRoaXMuZXJyb3IgJiYgdGhpcy52YWxpZCA9PT0gZmFsc2UgfSxcXHJcXG4gICAgc2hvd0hlbHAgKCkgeyByZXR1cm4gdGhpcy5oZWxwICYmICghdGhpcy5zaG93RXJyb3IgfHwgIXRoaXMuaGlkZUhlbHApIH0sXFxyXFxuICAgIHRleHQgKCkgeyByZXR1cm4gdHJhbnNsYXRpb25zKHRoaXMubGFuZykgfSxcXHJcXG4gICAgdGl0bGUgKCkgeyByZXR1cm4gdGhpcy5lcnJvclRleHQgfHwgdGhpcy5oZWxwIHx8ICcnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBkYXRhbGlzdCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQgJiYgdmFsIGluc3RhbmNlb2YgQXJyYXkpIHsgdGhpcy5vcHRpb25zID0gdmFsIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgbWF0Y2ggKHZhbCkgeyB0aGlzLmV2YWwoKSB9LFxcclxcbiAgICBvcHRpb25zICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdXJsICh2YWwpIHtcXHJcXG4gICAgICB0aGlzLl91cmwoKVxcclxcbiAgICB9LFxcclxcbiAgICB2YWwgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XFxyXFxuICAgICAgICBpZiAodGhpcy5tYXNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcXHJcXG4gICAgICAgICAgdmFsID0gdGhpcy5tYXNrKHZhbCB8fCAnJylcXHJcXG4gICAgICAgICAgaWYgKHRoaXMudmFsICE9PSB2YWwpIHtcXHJcXG4gICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dC5tYXNrKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5tYXNrKVxcclxcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQubWFzayA9IHNldFRpbWVvdXQoKCkgPT4ge1xcclxcbiAgICAgICAgICAgICAgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgICAgICAgICB9LCBpc05hTih0aGlzLm1hc2tEZWxheSkgPyAwIDogdGhpcy5tYXNrRGVsYXkpXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuZXZhbCgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB2YWxpZCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpXFxyXFxuICAgICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LnZhbGlkYXRlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7IHRoaXMudmFsID0gdmFsIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgYXR0ciAodmFsdWUpIHtcXHJcXG4gICAgICByZXR1cm4gflsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gbnVsbCA6IHZhbHVlXFxyXFxuICAgIH0sXFxyXFxuICAgIGVtaXQgKGUpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KGUudHlwZSwgZS50eXBlID09ICdpbnB1dCcgPyBlLnRhcmdldC52YWx1ZSA6IGUpXFxyXFxuICAgICAgaWYgKGUudHlwZSA9PT0gJ2JsdXInICYmIHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGV2YWwgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpXFxyXFxuICAgICAgaWYgKCF0aGlzLmNhblZhbGlkYXRlKSB7XFxyXFxuICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKVxcclxcbiAgICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBudWxsXFxyXFxuICAgICAgICB9LCB0aGlzLnZhbGlkYXRpb25EZWxheSlcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGZvY3VzICgpIHsgdGhpcy5pbnB1dC5mb2N1cygpIH0sXFxyXFxuICAgIHN1Ym1pdCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuJHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICAgIGlmICh0aGlzLmlucHV0LmZvcm0pIHtcXHJcXG4gICAgICAgIGNvbnN0IGludmFsaWRzID0gJCgnLmZvcm0tZ3JvdXAudmFsaWRhdGU6bm90KC5oYXMtc3VjY2VzcyknLCB0aGlzLmlucHV0LmZvcm0pXFxyXFxuICAgICAgICBpZiAoaW52YWxpZHMubGVuZ3RoKSB7XFxyXFxuICAgICAgICAgIGludmFsaWRzLmZpbmQoJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcpWzBdLmZvY3VzKClcXHJcXG4gICAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICAgIHRoaXMuaW5wdXQuZm9ybS5zdWJtaXQoKVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWRhdGUgKCkge1xcclxcbiAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkgeyByZXR1cm4gdHJ1ZSB9XFxyXFxuICAgICAgbGV0IHZhbHVlID0gKHRoaXMudmFsIHx8ICcnKS50cmltKClcXHJcXG4gICAgICBpZiAoIXZhbHVlKSB7IHJldHVybiAhdGhpcy5yZXF1aXJlZCB9XFxyXFxuICAgICAgaWYgKHRoaXMubWF0Y2ggIT09IG51bGwpIHsgcmV0dXJuIHRoaXMubWF0Y2ggPT09IHZhbHVlIH1cXHJcXG4gICAgICBpZiAodmFsdWUubGVuZ3RoIDwgdGhpcy5taW5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICBpZiAodGhpcy5uYXRpdmVWYWxpZGF0ZSAmJiAhdGhpcy5pbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICBpZiAodGhpcy5yZWdleCkge1xcclxcbiAgICAgICAgaWYgKCEodGhpcy5yZWdleCBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdGhpcy5yZWdleCh0aGlzLnZhbCkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWwpKSkgeyByZXR1cm4gZmFsc2UgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgICByZXR1cm4gdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICByZXNldCgpIHtcXHJcXG4gICAgICB0aGlzLnZhbHVlID0gJydcXHJcXG4gICAgICB0aGlzLnZhbGlkID0gbnVsbFxcclxcbiAgICAgIGlmICh0aGlzLl90aW1lb3V0Lm1hc2spIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0Lm1hc2spXFxyXFxuICAgICAgaWYgKHRoaXMuX3RpbWVvdXQuZXZhbCkgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQuZXZhbClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9pbnB1dCA9IHRydWVcXHJcXG4gICAgdGhpcy5fdGltZW91dCA9IHt9XFxyXFxuICAgIGxldCBwYXJlbnQgPSB0aGlzLiRwYXJlbnRcXHJcXG4gICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7IHBhcmVudCA9IHBhcmVudC4kcGFyZW50IH1cXHJcXG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcXHJcXG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKVxcclxcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudFxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuX3VybCA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuJGh0dHAgfHwgdGhpcy5fbG9hZGluZykgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlXFxyXFxuICAgICAgdGhpcy4kaHR0cC5nZXQodGhpcy51cmwpLnRoZW4ocmVzcG9uc2UgPT4ge1xcclxcbiAgICAgICAgdmFyIGRhdGEgPSByZXNwb25zZS5kYXRhIGluc3RhbmNlb2YgQXJyYXkgPyByZXNwb25zZS5kYXRhIDogW11cXHJcXG4gICAgICAgIHRyeSB7IGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpIH0gY2F0Y2ggKGUpIHt9XFxyXFxuICAgICAgICBpZiAodGhpcy51cmxNYXApIHsgZGF0YSA9IGRhdGEubWFwKHRoaXMudXJsTWFwKSB9XFxyXFxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBkYXRhXFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIH0sIHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSwgREVMQVkpXFxyXFxuICAgIGlmICh0aGlzLnVybCkgdGhpcy5fdXJsKClcXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgLy8gJCh0aGlzLmlucHV0KS5vbignZm9jdXMnLCBlID0+IHsgdGhpcy4kZW1pdCgnZm9jdXMnLCBlKSB9KS5vbignYmx1cicsIGUgPT4ge1xcclxcbiAgICAvLyAgIGlmICh0aGlzLmNhblZhbGlkYXRlKSB7IHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKCkgfVxcclxcbiAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxcclxcbiAgICAvLyB9KVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXFxyXFxuICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcXHJcXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKVxcclxcbiAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpXFxyXFxuICAgIH1cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlIHNjb3BlZD5cXHJcXG4uZm9ybS1ncm91cCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxufVxcclxcbmxhYmVsfi5jbG9zZSB7XFxyXFxuICB0b3A6IDI1cHg7XFxyXFxufVxcclxcbi5pbnB1dC1ncm91cD4uaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcclxcbiAgd2lkdGg6MDtcXHJcXG4gIHotaW5kZXg6IDM7XFxyXFxufVxcclxcbi5jbG9zZSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5oYXMtZmVlZGJhY2sgLmNsb3NlIHtcXHJcXG4gIHJpZ2h0OiAyMHB4O1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTE3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfTm9kZUxpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob2RlTGlzdCk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdHZhciBERUxBWSA9IDMwMDtcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgY2xlYXJCdXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGNvbHM6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBkYXRhbGlzdDogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGVudGVyU3VibWl0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBlcnJvcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGhlbHA6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBoaWRlSGVscDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBpY29uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBsYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIG1hc2s6IG51bGwsXG5cdCAgICBtYXNrRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDAgfSxcblx0ICAgIG1hdGNoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWF4OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWF4bGVuZ3RoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWluOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbWlubGVuZ3RoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHBhdHRlcm46IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgcmVxdWlyZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHJvd3M6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAzIH0sXG5cdCAgICBzdGVwOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0JyB9LFxuXHQgICAgdXJsOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdXJsTWFwOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB2YWxpZGF0aW9uRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAyNTAgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgb3B0aW9uczogdGhpcy5kYXRhbGlzdCxcblx0ICAgICAgdmFsOiB2YWwsXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBjYW5WYWxpZGF0ZTogZnVuY3Rpb24gY2FuVmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSAmJiAodGhpcy5yZXF1aXJlZCB8fCB0aGlzLnJlZ2V4IHx8IHRoaXMubmF0aXZlVmFsaWRhdGUgfHwgdGhpcy5tYXRjaCAhPT0gbnVsbCk7XG5cdCAgICB9LFxuXHQgICAgZXJyb3JUZXh0OiBmdW5jdGlvbiBlcnJvclRleHQoKSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG5cdCAgICAgIHZhciBlcnJvciA9IFt0aGlzLmVycm9yXTtcblx0ICAgICAgaWYgKCF2YWx1ZSAmJiB0aGlzLnJlcXVpcmVkKSBlcnJvci5wdXNoKCcoJyArIHRoaXMudGV4dC5yZXF1aXJlZC50b0xvd2VyQ2FzZSgpICsgJyknKTtcblx0ICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSBlcnJvci5wdXNoKCcoJyArIHRoaXMudGV4dC5taW5MZW5ndGgudG9Mb3dlckNhc2UoKSArICc6ICcgKyB0aGlzLm1pbmxlbmd0aCArICcpJyk7XG5cdCAgICAgIHJldHVybiBlcnJvci5qb2luKCcgJyk7XG5cdCAgICB9LFxuXHQgICAgaWRfZGF0YWxpc3Q6IGZ1bmN0aW9uIGlkX2RhdGFsaXN0KCkge1xuXHQgICAgICBpZiAodGhpcy50eXBlICE9PSAndGV4dGFyZWEnICYmIHRoaXMuZGF0YWxpc3QgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIGlmICghdGhpcy5faWRfZGF0YWxpc3QpIHtcblx0ICAgICAgICAgIGlmICghdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCkge1xuXHQgICAgICAgICAgICB0aGlzLiRyb290LmlkX2RhdGFsaXN0ID0gMDtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuX2lkX2RhdGFsaXN0ID0gJ2lucHV0LWRhdGFsaXN0JyArIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QrKztcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2lkX2RhdGFsaXN0O1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfSxcblx0ICAgIGlucHV0OiBmdW5jdGlvbiBpbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgbmF0aXZlVmFsaWRhdGU6IGZ1bmN0aW9uIG5hdGl2ZVZhbGlkYXRlKCkge1xuXHQgICAgICByZXR1cm4gKHRoaXMuaW5wdXQgfHwge30pLmNoZWNrVmFsaWRpdHkgJiYgKH5bJ3VybCcsICdlbWFpbCddLmluZGV4T2YodGhpcy50eXBlLnRvTG93ZXJDYXNlKCkpIHx8IHRoaXMubWluIHx8IHRoaXMubWF4KTtcblx0ICAgIH0sXG5cdCAgICByZWdleDogZnVuY3Rpb24gcmVnZXgoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLnBhdHRlcm4odGhpcy5wYXR0ZXJuKTtcblx0ICAgIH0sXG5cdCAgICBzaG93RXJyb3I6IGZ1bmN0aW9uIHNob3dFcnJvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZXJyb3IgJiYgdGhpcy52YWxpZCA9PT0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvd0hlbHA6IGZ1bmN0aW9uIHNob3dIZWxwKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5oZWxwICYmICghdGhpcy5zaG93RXJyb3IgfHwgIXRoaXMuaGlkZUhlbHApO1xuXHQgICAgfSxcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICB0aXRsZTogZnVuY3Rpb24gdGl0bGUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmVycm9yVGV4dCB8fCB0aGlzLmhlbHAgfHwgJyc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgZGF0YWxpc3Q6IGZ1bmN0aW9uIGRhdGFsaXN0KHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB2YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIHRoaXMub3B0aW9ucyA9IHZhbDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1hdGNoOiBmdW5jdGlvbiBtYXRjaCh2YWwpIHtcblx0ICAgICAgdGhpcy5ldmFsKCk7XG5cdCAgICB9LFxuXHQgICAgb3B0aW9uczogZnVuY3Rpb24gb3B0aW9ucyh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHVybDogZnVuY3Rpb24gdXJsKHZhbCkge1xuXHQgICAgICB0aGlzLl91cmwoKTtcblx0ICAgIH0sXG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICAgIGlmIChfdmFsICE9PSBvbGQpIHtcblx0ICAgICAgICBpZiAodGhpcy5tYXNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICAgIF92YWwgPSB0aGlzLm1hc2soX3ZhbCB8fCAnJyk7XG5cdCAgICAgICAgICBpZiAodGhpcy52YWwgIT09IF92YWwpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQubWFzayA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgIF90aGlzLnZhbCA9IF92YWw7XG5cdCAgICAgICAgICAgIH0sIGlzTmFOKHRoaXMubWFza0RlbGF5KSA/IDAgOiB0aGlzLm1hc2tEZWxheSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXZhbCgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsaWQ6IGZ1bmN0aW9uIHZhbGlkKHZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lzdmFsaWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKTtcblx0ICAgICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LnZhbGlkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBhdHRyOiBmdW5jdGlvbiBhdHRyKHZhbHVlKSB7XG5cdCAgICAgIHJldHVybiB+WycnLCBudWxsLCB1bmRlZmluZWRdLmluZGV4T2YodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBudWxsIDogdmFsdWU7XG5cdCAgICB9LFxuXHQgICAgZW1pdDogZnVuY3Rpb24gZW1pdChlKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoZS50eXBlLCBlLnR5cGUgPT0gJ2lucHV0JyA/IGUudGFyZ2V0LnZhbHVlIDogZSk7XG5cdCAgICAgIGlmIChlLnR5cGUgPT09ICdibHVyJyAmJiB0aGlzLmNhblZhbGlkYXRlKSB7XG5cdCAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGV2YWw6IGZ1bmN0aW9uIF9ldmFsKCkge1xuXHQgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgICBpZiAoIXRoaXMuY2FuVmFsaWRhdGUpIHtcblx0ICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLl90aW1lb3V0LmV2YWwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIF90aGlzMi52YWxpZCA9IF90aGlzMi52YWxpZGF0ZSgpO1xuXHQgICAgICAgICAgX3RoaXMyLl90aW1lb3V0LmV2YWwgPSBudWxsO1xuXHQgICAgICAgIH0sIHRoaXMudmFsaWRhdGlvbkRlbGF5KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcblx0ICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuXHQgICAgfSxcblx0ICAgIHN1Ym1pdDogZnVuY3Rpb24gc3VibWl0KCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLmlucHV0LmZvcm0pIHtcblx0ICAgICAgICB2YXIgaW52YWxpZHMgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLmZvcm0tZ3JvdXAudmFsaWRhdGU6bm90KC5oYXMtc3VjY2VzcyknLCB0aGlzLmlucHV0LmZvcm0pO1xuXHQgICAgICAgIGlmIChpbnZhbGlkcy5sZW5ndGgpIHtcblx0ICAgICAgICAgIGludmFsaWRzLmZpbmQoJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcpWzBdLmZvY3VzKCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuaW5wdXQuZm9ybS5zdWJtaXQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG5cdCAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciB2YWx1ZSA9ICh0aGlzLnZhbCB8fCAnJykudHJpbSgpO1xuXHQgICAgICBpZiAoIXZhbHVlKSB7XG5cdCAgICAgICAgcmV0dXJuICF0aGlzLnJlcXVpcmVkO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLm1hdGNoICE9PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2ggPT09IHZhbHVlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbmxlbmd0aCkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5uYXRpdmVWYWxpZGF0ZSAmJiAhdGhpcy5pbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMucmVnZXgpIHtcblx0ICAgICAgICBpZiAoISh0aGlzLnJlZ2V4IGluc3RhbmNlb2YgRnVuY3Rpb24gPyB0aGlzLnJlZ2V4KHRoaXMudmFsKSA6IHRoaXMucmVnZXgudGVzdCh0aGlzLnZhbCkpKSB7XG5cdCAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLnZhbGlkID0gbnVsbDtcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lucHV0ID0gdHJ1ZTtcblx0ICAgIHRoaXMuX3RpbWVvdXQgPSB7fTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgICAgdGhpcy5fdXJsID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdCAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICBpZiAoX3RoaXMzLnVybE1hcCkge1xuXHQgICAgICAgICAgZGF0YSA9IGRhdGEubWFwKF90aGlzMy51cmxNYXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBfdGhpczMub3B0aW9ucyA9IGRhdGE7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LCBERUxBWSk7XG5cdCAgICBpZiAodGhpcy51cmwpIHRoaXMuX3VybCgpO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIC8vICQodGhpcy5pbnB1dCkub24oJ2ZvY3VzJywgZSA9PiB7IHRoaXMuJGVtaXQoJ2ZvY3VzJywgZSkgfSkub24oJ2JsdXInLCBlID0+IHtcblx0ICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XG5cdCAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxuXHQgICAgLy8gfSlcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1ncm91cFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgdmFsaWRhdGU6IF92bS5jYW5WYWxpZGF0ZSwgJ2hhcy1mZWVkYmFjayc6IF92bS5pY29uLCAnaGFzLWVycm9yJzogX3ZtLmNhblZhbGlkYXRlICYmIF92bS52YWxpZCA9PT0gZmFsc2UsICdoYXMtc3VjY2Vzcyc6IF92bS5jYW5WYWxpZGF0ZSAmJiBfdm0udmFsaWRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwibGFiZWxcIiwgWyhfdm0ubGFiZWwpID8gX3ZtLl9jKCdsYWJlbCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNvbnRyb2wtbGFiZWxcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmJlZm9yZSB8fCBfdm0uJHNsb3RzLmFmdGVyKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaW5wdXQtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJiZWZvcmVcIiksIF92bS5fdihcIiBcIiksIF92bS5fYyhfdm0udHlwZSA9PSAndGV4dGFyZWEnID8gX3ZtLnR5cGUgOiAnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgdGFnOiBcInRleHRhcmVhXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiY29sc1wiOiBfdm0uY29scyxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIFwibGlzdFwiOiBfdm0uaWRfZGF0YWxpc3QsXG5cdCAgICAgIFwibWF4XCI6IF92bS5hdHRyKF92bS5tYXgpLFxuXHQgICAgICBcIm1heGxlbmd0aFwiOiBfdm0ubWF4bGVuZ3RoLFxuXHQgICAgICBcIm1pblwiOiBfdm0uYXR0cihfdm0ubWluKSxcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJvd3NcIjogX3ZtLnJvd3MsXG5cdCAgICAgIFwic3RlcFwiOiBfdm0uc3RlcCxcblx0ICAgICAgXCJ0aXRsZVwiOiBfdm0uYXR0cihfdm0udGl0bGUpLFxuXHQgICAgICBcInR5cGVcIjogX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IG51bGwgOiBfdm0udHlwZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImZvY3VzXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImlucHV0XCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfSwgX3ZtLmVtaXRdLFxuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS50eXBlICE9ICd0ZXh0YXJlYScgJiYgX3ZtLmVudGVyU3VibWl0ICYmIF92bS5zdWJtaXQoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uY2xlYXJCdXR0b24gJiYgX3ZtLnZhbHVlKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgaWNvbjogX3ZtLmljb25cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbHVlID0gJydcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pY29uKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSwgWyhfdm0uaWNvbiAmJiBfdm0udmFsaWQgIT09IG51bGwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IFsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsaWQgPyAnb2snIDogJ3JlbW92ZScpXSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYWZ0ZXJcIildLCAyKSA6IFtfdm0uX2MoX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IF92bS50eXBlIDogJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIHRhZzogXCJ0ZXh0YXJlYVwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImNvbHNcIjogX3ZtLmNvbHMsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBcImxpc3RcIjogX3ZtLmlkX2RhdGFsaXN0LFxuXHQgICAgICBcIm1heFwiOiBfdm0uYXR0cihfdm0ubWF4KSxcblx0ICAgICAgXCJtYXhsZW5ndGhcIjogX3ZtLm1heGxlbmd0aCxcblx0ICAgICAgXCJtaW5cIjogX3ZtLmF0dHIoX3ZtLm1pbiksXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXIsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcInJlcXVpcmVkXCI6IF92bS5yZXF1aXJlZCxcblx0ICAgICAgXCJyb3dzXCI6IF92bS5yb3dzLFxuXHQgICAgICBcInN0ZXBcIjogX3ZtLnN0ZXAsXG5cdCAgICAgIFwidGl0bGVcIjogX3ZtLmF0dHIoX3ZtLnRpdGxlKSxcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlID09ICd0ZXh0YXJlYScgPyBudWxsIDogX3ZtLnR5cGVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0udmFsKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJmb2N1c1wiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJpbnB1dFwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH0sIF92bS5lbWl0XSxcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udHlwZSAhPSAndGV4dGFyZWEnICYmIF92bS5lbnRlclN1Ym1pdCAmJiBfdm0uc3VibWl0KClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9ICcnXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmljb24gJiYgX3ZtLnZhbGlkICE9PSBudWxsKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCAnZ2x5cGhpY29uLScgKyAoX3ZtLnZhbGlkID8gJ29rJyA6ICdyZW1vdmUnKV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKV0sIF92bS5fdihcIiBcIiksIChfdm0uaWRfZGF0YWxpc3QpID8gX3ZtLl9jKCdkYXRhbGlzdCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiaWRcIjogX3ZtLmlkX2RhdGFsaXN0XG5cdCAgICB9XG5cdCAgfSwgX3ZtLl9sKChfdm0ub3B0aW9ucyksIGZ1bmN0aW9uKG9wYykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnb3B0aW9uJywge1xuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidmFsdWVcIjogb3BjXG5cdCAgICAgIH1cblx0ICAgIH0pXG5cdCAgfSkpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uc2hvd0hlbHApID8gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoZWxwLWJsb2NrXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5mb2N1c1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWxwKSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLnNob3dFcnJvcikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmVycm9yVGV4dCkpXSkgOiBfdm0uX2UoKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY1MmFkN2I5XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcTW9kYWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWZlN2Q1ZGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1mZTdkNWRjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE1vZGFsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5tb2RhbCB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbn1cXG4ubW9kYWwuaW4ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjUpO1xcbn1cXG4ubW9kYWwuem9vbSAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdG9wOiAzMDBweDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4zcztcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzO1xcbn1cXG4ubW9kYWwuem9vbS5pbiAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgb3BhY2l0eTogMTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9Nb2RhbC52dWU/MWZkZDYyNjBcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXNHQTtFQUNBLDBCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0NBQ0E7QUFDQTtFQUNBLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSwwQkFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLDBCQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7RUFDQSx5QkFBQTtFQUNBLHdCQUFBO0VBQ0Esb0JBQUE7RUFDQSw2Q0FBQTtFQUNBLHFDQUFBO0VBQ0EsV0FBQTtDQUNBXCIsXCJmaWxlXCI6XCJNb2RhbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByb2xlPVxcXCJkaWFsb2dcXFwiIDpjbGFzcz1cXFwiWydtb2RhbCcsZWZmZWN0XVxcXCIgQGNsaWNrPVxcXCJiYWNrZHJvcCYmYWN0aW9uKGZhbHNlLDEpXFxcIiBAdHJhbnNpdGlvbmVuZD1cXFwidHJhbnNpdGlvbiA9IGZhbHNlXFxcIj5cXHJcXG4gICAgPGRpdiA6Y2xhc3M9XFxcIlsnbW9kYWwtZGlhbG9nJyx7J21vZGFsLWxnJzpsYXJnZSwnbW9kYWwtc20nOnNtYWxsfV1cXFwiIHJvbGU9XFxcImRvY3VtZW50XFxcIiA6c3R5bGU9XFxcInt3aWR0aDogb3B0aW9uYWxXaWR0aH1cXFwiIEBjbGljay5zdG9wPVxcXCJhY3Rpb24obnVsbClcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcImFjdGlvbihmYWxzZSwyKVxcXCI+PHNwYW4+JnRpbWVzOzwvc3Bhbj48L2J1dHRvbj5cXHJcXG4gICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj48c2xvdCBuYW1lPVxcXCJ0aXRsZVxcXCI+e3t0aXRsZX19PC9zbG90PjwvaDQ+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9zbG90PlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtYm9keVxcXCI+PGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+PHNsb3Q+PC9zbG90PjwvZGl2Pjwvc2xvdD5cXHJcXG4gICAgICAgIDxzbG90IG5hbWU9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIEBjbGljaz1cXFwiYWN0aW9uKGZhbHNlLDMpXFxcIj57eyBjYW5jZWxUZXh0IH19PC9idXR0b24+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwiYWN0aW9uKHRydWUsNClcXFwiPnt7IG9rVGV4dCB9fTwvYnV0dG9uPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgIDwvc2xvdD5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtnZXRTY3JvbGxCYXJXaWR0aH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBiYWNrZHJvcDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWV9LFxcclxcbiAgICBjYWxsYmFjazoge3R5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgY2FuY2VsVGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJ30sXFxyXFxuICAgIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxhcmdlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBva1RleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnfSxcXHJcXG4gICAgc21hbGw6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHRpdGxlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJ30sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWV9LFxcclxcbiAgICB3aWR0aDoge2RlZmF1bHQ6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgdHJhbnNpdGlvbjogZmFsc2UsXFxyXFxuICAgICAgdmFsOiBudWxsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBvcHRpb25hbFdpZHRoICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy53aWR0aCA9PT0gbnVsbCkge1xcclxcbiAgICAgICAgcmV0dXJuIG51bGxcXHJcXG4gICAgICB9IGVsc2UgaWYgKE51bWJlci5pc0ludGVnZXIodGhpcy53aWR0aCkpIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoICsgJ3B4J1xcclxcbiAgICAgIH1cXHJcXG4gICAgICByZXR1cm4gdGhpcy53aWR0aFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgdHJhbnNpdGlvbiAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSBvbGQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBjb25zdCBlbCA9IHRoaXMuJGVsXFxyXFxuICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHlcXHJcXG4gICAgICBpZiAodmFsKSB7Ly9zdGFydGluZ1xcclxcbiAgICAgICAgaWYgKHRoaXMudmFsKSB7XFxyXFxuICAgICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1jb250ZW50JykuZm9jdXMoKVxcclxcbiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xcclxcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGVsLmNsYXNzTGlzdC5hZGQoJ2luJyksIDApXFxyXFxuICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICAgIGlmIChnZXRTY3JvbGxCYXJXaWR0aCgpICE9PSAwKSB7XFxyXFxuICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBnZXRTY3JvbGxCYXJXaWR0aCgpICsgJ3B4J1xcclxcbiAgICAgICAgICB9XFxyXFxuICAgICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpbicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfSBlbHNlIHsvL2VuZGluZ1xcclxcbiAgICAgICAgdGhpcy4kZW1pdCh0aGlzLnZhbCA/ICdvcGVuZWQnIDogJ2Nsb3NlZCcpXFxyXFxuICAgICAgICBpZiAoIXRoaXMudmFsKSB7XFxyXFxuICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcXHJcXG4gICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsXFxyXFxuICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB2YWwgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgaWYgKG9sZCA9PT0gbnVsbCA/IHZhbCA9PT0gdHJ1ZSA6IHZhbCAhPT0gb2xkKSB0aGlzLnRyYW5zaXRpb24gPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgYWN0aW9uICh2YWwscCkge1xcclxcbiAgICAgIGlmICh2YWwgPT09IG51bGwpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBpZiAodmFsICYmIHRoaXMuY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbikgdGhpcy5jYWxsYmFjaygpXFxyXFxuICAgICAgdGhpcy4kZW1pdCh2YWwgPyAnb2snIDogJ2NhbmNlbCcscClcXHJcXG4gICAgICB0aGlzLnZhbCA9IHZhbCB8fCBmYWxzZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMudmFsID0gdGhpcy52YWx1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG48c3R5bGU+XFxyXFxuLm1vZGFsIHtcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxufVxcclxcbi5tb2RhbC5pbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7XFxyXFxufVxcclxcbi5tb2RhbC56b29tIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0b3A6IDMwMHB4O1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxuICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxufVxcclxcbi5tb2RhbC56b29tLmluIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICBvcGFjaXR5OiAxO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfaXNJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjMpO1xuXHRcblx0dmFyIF9pc0ludGVnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJbnRlZ2VyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJhY2tkcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGNhbGxiYWNrOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjYW5jZWxUZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJyB9LFxuXHQgICAgZWZmZWN0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFyZ2U6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG9rVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnIH0sXG5cdCAgICBzbWFsbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHRyYW5zaXRpb246IGZhbHNlLFxuXHQgICAgICB2YWw6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIG9wdGlvbmFsV2lkdGg6IGZ1bmN0aW9uIG9wdGlvbmFsV2lkdGgoKSB7XG5cdCAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgIH0gZWxzZSBpZiAoKDAsIF9pc0ludGVnZXIyLmRlZmF1bHQpKHRoaXMud2lkdGgpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24odmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCA9PT0gb2xkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIGlmICh2YWwpIHtcblx0ICAgICAgICAvL3N0YXJ0aW5nXG5cdCAgICAgICAgaWYgKHRoaXMudmFsKSB7XG5cdCAgICAgICAgICBlbC5xdWVyeVNlbGVjdG9yKCcubW9kYWwtY29udGVudCcpLmZvY3VzKCk7XG5cdCAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0ICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZWwuY2xhc3NMaXN0LmFkZCgnaW4nKTtcblx0ICAgICAgICAgIH0sIDApO1xuXHQgICAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgICBpZiAoKDAsIF91dGlscy5nZXRTY3JvbGxCYXJXaWR0aCkoKSAhPT0gMCkge1xuXHQgICAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCkgKyAncHgnO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpbicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAvL2VuZGluZ1xuXHQgICAgICAgIHRoaXMuJGVtaXQodGhpcy52YWwgPyAnb3BlbmVkJyA6ICdjbG9zZWQnKTtcblx0ICAgICAgICBpZiAoIXRoaXMudmFsKSB7XG5cdCAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHQgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsO1xuXHQgICAgICAgICAgYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsOiBmdW5jdGlvbiB2YWwoX3ZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICAgIGlmIChvbGQgPT09IG51bGwgPyBfdmFsID09PSB0cnVlIDogX3ZhbCAhPT0gb2xkKSB0aGlzLnRyYW5zaXRpb24gPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMudmFsID0gdmFsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYWN0aW9uOiBmdW5jdGlvbiBhY3Rpb24odmFsLCBwKSB7XG5cdCAgICAgIGlmICh2YWwgPT09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbCAmJiB0aGlzLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHRoaXMuY2FsbGJhY2soKTtcblx0ICAgICAgdGhpcy4kZW1pdCh2YWwgPyAnb2snIDogJ2NhbmNlbCcsIHApO1xuXHQgICAgICB0aGlzLnZhbCA9IHZhbCB8fCBmYWxzZTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTIzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMTI0KSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMTI0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5OdW1iZXIuaXNJbnRlZ2VyO1xuXG4vKioqLyB9LFxuLyogMTI1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcblx0dmFyICRleHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7aXNJbnRlZ2VyOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNil9KTtcblxuLyoqKi8gfSxcbi8qIDEyNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpXG5cdCAgLCBmbG9vciAgICA9IE1hdGguZmxvb3I7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KXtcblx0ICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDEyNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydtb2RhbCcsIF92bS5lZmZlY3RdLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwiZGlhbG9nXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5iYWNrZHJvcCAmJiBfdm0uYWN0aW9uKGZhbHNlLCAxKVxuXHQgICAgICB9LFxuXHQgICAgICBcInRyYW5zaXRpb25lbmRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnRyYW5zaXRpb24gPSBmYWxzZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsnbW9kYWwtZGlhbG9nJywge1xuXHQgICAgICAnbW9kYWwtbGcnOiBfdm0ubGFyZ2UsXG5cdCAgICAgICdtb2RhbC1zbSc6IF92bS5zbWFsbFxuXHQgICAgfV0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS5vcHRpb25hbFdpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRvY3VtZW50XCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICBfdm0uYWN0aW9uKG51bGwpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1jb250ZW50XCJcblx0ICB9LCBbX3ZtLl90KFwibW9kYWwtaGVhZGVyXCIsIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uYWN0aW9uKGZhbHNlLCAyKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIFtfdm0uX3YoXCLDl1wiKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnaDQnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcInRpdGxlXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXSldLCAyKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fdChcIm1vZGFsLWJvZHlcIiwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibW9kYWwtYm9keVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJtb2RhbC1mb290ZXJcIiwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibW9kYWwtZm9vdGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4gYnRuLWRlZmF1bHRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uYWN0aW9uKGZhbHNlLCAzKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmNhbmNlbFRleHQpKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJ0biBidG4tcHJpbWFyeVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5hY3Rpb24odHJ1ZSwgNClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5va1RleHQpKV0pXSldKV0sIDIpXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mZTdkNWRjOFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEyOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXE5hdmJhci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzhmMDYxOWVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTM4ZjA2MTllXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gTmF2YmFyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdkZWZhdWx0JyB9LFxuXHQgICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfSxcblx0ICAgIGNvbnRhaW5lcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpZDogJ2JzLWV4YW1wbGUtbmF2YmFyLWNvbGxhcHNlLTEnLFxuXHQgICAgICBjb2xsYXBzZWQ6IHRydWUsXG5cdCAgICAgIHN0eWxlczoge31cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHNsb3RzOiBmdW5jdGlvbiBzbG90cygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3Nsb3RDb250ZW50cztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZUNvbGxhcHNlOiBmdW5jdGlvbiB0b2dnbGVDb2xsYXBzZShlKSB7XG5cdCAgICAgIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9uYXZiYXIgPSB0cnVlO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgdHJ5IHtcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgJGRyb3Bkb3duID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bj5bZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsIF90aGlzLiRlbCkucGFyZW50KCk7XG5cdCAgICAgICAgaWYgKCRkcm9wZG93bikge1xuXHQgICAgICAgICAgJGRyb3Bkb3duLm9uKCdjbGljaycsICcuZHJvcGRvd24tdG9nZ2xlJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub24oJ2NsaWNrJywgJy5kcm9wZG93bi1tZW51PmxpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub25CbHVyKGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgICRkcm9wZG93bi5lYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG5cdCAgICAgICAgICAgICAgaWYgKCFjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KSgpO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGZpbmRpbmcgZHJvcGRvd24nKTtcblx0ICAgIH1cblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub24oJ2NsaWNrIHRvdWNoc3RhcnQnLCAnbGk6bm90KC5kcm9wZG93bik+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIF90aGlzLmNvbGxhcHNlZCA9IHRydWU7XG5cdCAgICAgIH0sIDIwMCk7XG5cdCAgICB9KS5vbkJsdXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCFfdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKSB7XG5cdCAgICAgICAgX3RoaXMuY29sbGFwc2VkID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICB2YXIgaGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0O1xuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAndG9wJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdUb3AgPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZUNvbGxhcHNlKGUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bicsIHRoaXMuJGVsKS5vZmYoJ2NsaWNrJykub2ZmQmx1cigpO1xuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub2ZmKCdjbGljaycpO1xuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXInLCAnbmF2YmFyLScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudCA9PT0gJ3N0YXRpYycgPyAnbmF2YmFyLXN0YXRpYy10b3AnIDogJ25hdmJhci1maXhlZC0nICsgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogX3ZtLmNvbnRhaW5lciA9PT0gJ2ZsdWlkJyA/ICdjb250YWluZXItZmx1aWQnIDogJ2NvbnRhaW5lcidcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXZiYXItaGVhZGVyXCJcblx0ICB9LCBbKCFfdm0uJHNsb3RzLmNvbGxhcHNlKSA/IF92bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2YmFyLXRvZ2dsZSBjb2xsYXBzZWRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiLFxuXHQgICAgICBcImFyaWEtZXhwYW5kZWRcIjogXCJmYWxzZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlQ29sbGFwc2Vcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Itb25seVwiXG5cdCAgfSwgW192bS5fdihcIlRvZ2dsZSBuYXZpZ2F0aW9uXCIpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24tYmFyXCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbi1iYXJcIlxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uLWJhclwiXG5cdCAgfSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJjb2xsYXBzZVwiKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYnJhbmRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXItY29sbGFwc2UnLCB7XG5cdCAgICAgIGNvbGxhcHNlOiBfdm0uY29sbGFwc2VkXG5cdCAgICB9XVxuXHQgIH0sIFtfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2IG5hdmJhci1uYXZcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmxlZnQpID8gX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdiBuYXZiYXItbmF2IG5hdmJhci1sZWZ0XCJcblx0ICB9LCBbX3ZtLl90KFwibGVmdFwiKV0sIDIpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLnJpZ2h0KSA/IF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXYgbmF2YmFyLW5hdiBuYXZiYXItcmlnaHRcIlxuXHQgIH0sIFtfdm0uX3QoXCJyaWdodFwiKV0sIDIpIDogX3ZtLl9lKCldKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzhmMDYxOWVcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxPcHRpb24udnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQyMDg4MTE2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00MjA4ODExNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE9wdGlvbi52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7IHZhbHVlOiBudWxsIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7IGxvYWRpbmc6IHRydWUgfTtcblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAodGhpcy4kcGFyZW50Ll9zZWxlY3QpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRwYXJlbnQub3B0aW9ucykge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC5vcHRpb25zID0gW107XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGVsID0ge307XG5cdCAgICAgIGVsW3RoaXMuJHBhcmVudC5vcHRpb25zTGFiZWxdID0gdGhpcy4kZWwuaW5uZXJIVE1MO1xuXHQgICAgICBlbFt0aGlzLiRwYXJlbnQub3B0aW9uc1ZhbHVlXSA9IHRoaXMudmFsdWU7XG5cdCAgICAgIHRoaXMuJHBhcmVudC5vcHRpb25zLnB1c2goZWwpO1xuXHQgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnNvbGUud2Fybignb3B0aW9ucyBvbmx5IHdvcmsgaW5zaWRlIGEgc2VsZWN0IGNvbXBvbmVudCcpO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gKF92bS5sb2FkaW5nKSA/IF92bS5fYygnbGknLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpIDogX3ZtLl9lKClcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDIwODgxMTZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTM1KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTM3KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzOClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQYW5lbC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWIxZTA0NjFhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUGFuZWwudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTM1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzYpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWIxZTA0NjFhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9QYW5lbC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWIxZTA0NjFhIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9QYW5lbC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmFjY29yZGlvbi10b2dnbGUge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uY29sbGFwc2UtZW50ZXItYWN0aXZlLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIC41cyBlYXNlO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuLmNvbGxhcHNlLWVudGVyLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcbn1cXHJcXG5cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1BhbmVsLnZ1ZT82MGU3OThlMlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBeUVBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBOztFQUVBLHlCQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBOztDQUdBXCIsXCJmaWxlXCI6XCJQYW5lbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiA6Y2xhc3M9XFxcIlsncGFuZWwnLHBhbmVsVHlwZV1cXFwiPlxcclxcbiAgICA8ZGl2IDpjbGFzcz1cXFwiWydwYW5lbC1oZWFkaW5nJyx7J2FjY29yZGlvbi10b2dnbGUnOmluQWNjb3JkaW9ufV1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJpbkFjY29yZGlvbiYmdG9nZ2xlKClcXFwiPlxcclxcbiAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGg0IGNsYXNzPVxcXCJwYW5lbC10aXRsZVxcXCI+e3sgaGVhZGVyIH19PC9oND48L3Nsb3Q+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8dHJhbnNpdGlvblxcclxcbiAgICAgIG5hbWU9XFxcImNvbGxhcHNlXFxcIlxcclxcbiAgICAgIEBlbnRlcj1cXFwiZW50ZXJcXFwiXFxyXFxuICAgICAgQGFmdGVyLWVudGVyPVxcXCJhZnRlckVudGVyXFxcIlxcclxcbiAgICAgIEBiZWZvcmUtbGVhdmU9XFxcImJlZm9yZUxlYXZlXFxcIlxcclxcbiAgICA+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtY29sbGFwc2VcXFwiIHYtaWY9XFxcIm9wZW5cXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtYm9keVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L3RyYW5zaXRpb24+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgaGVhZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgaXNPcGVuOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQgOiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgb3BlbjogdGhpcy5pc09wZW5cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGlzT3BlbiggdmFsICkge1xcclxcbiAgICAgIHRoaXMub3BlbiA9IHZhbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgaW5BY2NvcmRpb24gKCkgeyByZXR1cm4gdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5faXNBY2NvcmRpb24gfSxcXHJcXG4gICAgcGFuZWxUeXBlICgpIHsgcmV0dXJuICdwYW5lbC0nICsgKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSB8fCAnZGVmYXVsdCcpIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gIXRoaXMub3BlblxcclxcbiAgICAgIGlmICh0aGlzLmluQWNjb3JkaW9uKSB7XFxyXFxuICAgICAgICB0aGlzLiRwYXJlbnQub3BlbkNoaWxkKHRoaXMpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBlbnRlciAoZWwpIHtcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0bydcXHJcXG4gICAgICB2YXIgZW5kV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKGVsKS5oZWlnaHRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnMHB4J1xcclxcbiAgICAgIGVsLm9mZnNldEhlaWdodCAvLyBmb3JjZSByZXBhaW50XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZW5kV2lkdGg7XFxyXFxuICAgIH0sXFxyXFxuICAgIGFmdGVyRW50ZXIgKGVsKSB7XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXFxyXFxuICAgIH0sXFxyXFxuICAgIGJlZm9yZUxlYXZlIChlbCkge1xcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodFxcclxcbiAgICAgIGVsLm9mZnNldEhlaWdodCAvLyBmb3JjZSByZXBhaW50XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCdcXHJcXG4gICAgfSxcXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaXNPcGVuID09PSBudWxsKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gIXRoaXMuaW5BY2NvcmRpb25cXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmFjY29yZGlvbi10b2dnbGUge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG4uY29sbGFwc2UtZW50ZXItYWN0aXZlLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIC41cyBlYXNlO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG59XFxyXFxuLmNvbGxhcHNlLWVudGVyLFxcclxcbi5jb2xsYXBzZS1sZWF2ZS1hY3RpdmUge1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTM3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgaGVhZGVyOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgaXNPcGVuOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBvcGVuOiB0aGlzLmlzT3BlblxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICB3YXRjaDoge1xuXHQgICAgaXNPcGVuOiBmdW5jdGlvbiBpc09wZW4odmFsKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBpbkFjY29yZGlvbjogZnVuY3Rpb24gaW5BY2NvcmRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50Ll9pc0FjY29yZGlvbjtcblx0ICAgIH0sXG5cdCAgICBwYW5lbFR5cGU6IGZ1bmN0aW9uIHBhbmVsVHlwZSgpIHtcblx0ICAgICAgcmV0dXJuICdwYW5lbC0nICsgKHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLm9wZW4gPSAhdGhpcy5vcGVuO1xuXHQgICAgICBpZiAodGhpcy5pbkFjY29yZGlvbikge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC5vcGVuQ2hpbGQodGhpcyk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBlbnRlcjogZnVuY3Rpb24gZW50ZXIoZWwpIHtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuXHQgICAgICB2YXIgZW5kV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKGVsKS5oZWlnaHQ7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuXHQgICAgICBlbC5vZmZzZXRIZWlnaHQ7IC8vIGZvcmNlIHJlcGFpbnRcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZW5kV2lkdGg7XG5cdCAgICB9LFxuXHQgICAgYWZ0ZXJFbnRlcjogZnVuY3Rpb24gYWZ0ZXJFbnRlcihlbCkge1xuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG5cdCAgICB9LFxuXHQgICAgYmVmb3JlTGVhdmU6IGZ1bmN0aW9uIGJlZm9yZUxlYXZlKGVsKSB7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodDtcblx0ICAgICAgZWwub2Zmc2V0SGVpZ2h0OyAvLyBmb3JjZSByZXBhaW50XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIGlmICh0aGlzLmlzT3BlbiA9PT0gbnVsbCkge1xuXHQgICAgICB0aGlzLm9wZW4gPSAhdGhpcy5pbkFjY29yZGlvbjtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncGFuZWwnLCBfdm0ucGFuZWxUeXBlXVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiBbJ3BhbmVsLWhlYWRpbmcnLCB7XG5cdCAgICAgICdhY2NvcmRpb24tdG9nZ2xlJzogX3ZtLmluQWNjb3JkaW9uXG5cdCAgICB9XSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLmluQWNjb3JkaW9uICYmIF92bS50b2dnbGUoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdoNCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLXRpdGxlXCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0uaGVhZGVyKSldKV0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImNvbGxhcHNlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImVudGVyXCI6IF92bS5lbnRlcixcblx0ICAgICAgXCJhZnRlci1lbnRlclwiOiBfdm0uYWZ0ZXJFbnRlcixcblx0ICAgICAgXCJiZWZvcmUtbGVhdmVcIjogX3ZtLmJlZm9yZUxlYXZlXG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ub3BlbikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWNvbGxhcHNlXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJwYW5lbC1ib2R5XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMzkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTQwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0NClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQb3BvdmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0yNDY1YmY1NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMjQ2NWJmNTRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQb3BvdmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE0MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0yNDY1YmY1NCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vUG9wb3Zlci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTI0NjViZjU0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Qb3BvdmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4ucG9wb3Zlci50b3AsXFxyXFxuLnBvcG92ZXIubGVmdCxcXHJcXG4ucG9wb3Zlci5yaWdodCxcXHJcXG4ucG9wb3Zlci5ib3R0b20ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcbi5zY2FsZS1lbnRlciB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtaW4gMC4xNXMgZWFzZS1pbjtcXG59XFxuLnNjYWxlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtb3V0IDAuMTVzIGVhc2Utb3V0O1xcbn1cXG5Aa2V5ZnJhbWVzIHNjYWxlLWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzY2FsZS1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1BvcG92ZXIudnVlP2U2MTY5NjNhXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF5QkE7Ozs7RUFJQSxlQUFBO0NBQ0E7QUFDQTtFQUNBLGlDQUFBO0NBQ0E7QUFDQTtFQUNBLG1DQUFBO0NBQ0E7QUFDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLG9CQUFBO0lBQ0EsV0FBQTtDQUNBO0NBQ0E7QUFDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLG9CQUFBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlBvcG92ZXIudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWydwb3BvdmVyJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImFycm93XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxoMyBjbGFzcz1cXFwicG9wb3Zlci10aXRsZVxcXCIgdi1pZj1cXFwidGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcInRpdGxlXFxcIj57e3RpdGxlfX08L3Nsb3Q+PC9oMz5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInBvcG92ZXItY29udGVudFxcXCI+PHNsb3QgbmFtZT1cXFwiY29udGVudFxcXCI+PHNwYW4gdi1odG1sPVxcXCJjb250ZW50XFxcIj48L3NwYW4+PC9zbG90PjwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L3RyYW5zaXRpb24+XFxyXFxuICA8L3NwYW4+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCBQb3BvdmVyTWl4aW4gZnJvbSAnLi91dGlscy9wb3BvdmVyTWl4aW5zLmpzJ1xcclxcblxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIG1peGluczogW1BvcG92ZXJNaXhpbl0sXFxyXFxuICBwcm9wczoge1xcclxcbiAgICB0cmlnZ2VyOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLnBvcG92ZXIudG9wLFxcclxcbi5wb3BvdmVyLmxlZnQsXFxyXFxuLnBvcG92ZXIucmlnaHQsXFxyXFxuLnBvcG92ZXIuYm90dG9tIHtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbn1cXHJcXG4uc2NhbGUtZW50ZXIge1xcclxcbiAgYW5pbWF0aW9uOnNjYWxlLWluIDAuMTVzIGVhc2UtaW47XFxyXFxufVxcclxcbi5zY2FsZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNjYWxlLW91dCAwLjE1cyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzY2FsZS1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuQGtleWZyYW1lcyBzY2FsZS1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9wb3BvdmVyTWl4aW5zID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDMpO1xuXHRcblx0dmFyIF9wb3BvdmVyTWl4aW5zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BvcG92ZXJNaXhpbnMpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBtaXhpbnM6IFtfcG9wb3Zlck1peGluczIuZGVmYXVsdF0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxNDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGNvbnRlbnQ6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZmFkZScgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndG9wJyB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgdG9wOiAwLFxuXHQgICAgICBsZWZ0OiAwLFxuXHQgICAgICBzaG93OiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgZXZlbnRzOiBmdW5jdGlvbiBldmVudHMoKSB7XG5cdCAgICAgIHJldHVybiB7IGNvbnRleHRtZW51OiBbJ2NvbnRleHRtZW51J10sIGhvdmVyOiBbJ21vdXNlbGVhdmUnLCAnbW91c2VlbnRlciddLCBmb2N1czogWydibHVyJywgJ2ZvY3VzJ10gfVt0aGlzLnRyaWdnZXJdIHx8IFsnY2xpY2snXTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJlZm9yZUVudGVyOiBmdW5jdGlvbiBiZWZvcmVFbnRlcigpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMucG9zaXRpb24oKTtcblx0ICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIF90aGlzLnBvc2l0aW9uKCk7XG5cdCAgICAgIH0sIDMwKTtcblx0ICAgIH0sXG5cdCAgICBwb3NpdGlvbjogZnVuY3Rpb24gcG9zaXRpb24oKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBwb3BvdmVyID0gX3RoaXMyLiRyZWZzLnBvcG92ZXI7XG5cdCAgICAgICAgdmFyIHRyaWdnZXIgPSBfdGhpczIuJHJlZnMudHJpZ2dlci5jaGlsZHJlblswXTtcblx0ICAgICAgICBzd2l0Y2ggKF90aGlzMi5wbGFjZW1lbnQpIHtcblx0ICAgICAgICAgIGNhc2UgJ3RvcCc6XG5cdCAgICAgICAgICAgIF90aGlzMi5sZWZ0ID0gdHJpZ2dlci5vZmZzZXRMZWZ0IC0gcG9wb3Zlci5vZmZzZXRXaWR0aCAvIDIgKyB0cmlnZ2VyLm9mZnNldFdpZHRoIC8gMjtcblx0ICAgICAgICAgICAgX3RoaXMyLnRvcCA9IHRyaWdnZXIub2Zmc2V0VG9wIC0gcG9wb3Zlci5vZmZzZXRIZWlnaHQ7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAnbGVmdCc6XG5cdCAgICAgICAgICAgIF90aGlzMi5sZWZ0ID0gdHJpZ2dlci5vZmZzZXRMZWZ0IC0gcG9wb3Zlci5vZmZzZXRXaWR0aDtcblx0ICAgICAgICAgICAgX3RoaXMyLnRvcCA9IHRyaWdnZXIub2Zmc2V0VG9wICsgdHJpZ2dlci5vZmZzZXRIZWlnaHQgLyAyIC0gcG9wb3Zlci5vZmZzZXRIZWlnaHQgLyAyO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgJ3JpZ2h0Jzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgKyB0cmlnZ2VyLm9mZnNldFdpZHRoO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodCAvIDIgLSBwb3BvdmVyLm9mZnNldEhlaWdodCAvIDI7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAnYm90dG9tJzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoIC8gMiArIHRyaWdnZXIub2Zmc2V0V2lkdGggLyAyO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodDtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1dyb25nIHBsYWNlbWVudCBwcm9wJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHBvcG92ZXIuc3R5bGUudG9wID0gX3RoaXMyLnRvcCArICdweCc7XG5cdCAgICAgICAgcG9wb3Zlci5zdHlsZS5sZWZ0ID0gX3RoaXMyLmxlZnQgKyAncHgnO1xuXHQgICAgICB9KTtcblx0ICAgIH0sXG5cdCAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZShlKSB7XG5cdCAgICAgIGlmIChlICYmIHRoaXMudHJpZ2dlciA9PT0gJ2NvbnRleHRtZW51JykgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICBpZiAodGhpcy5zaG93KSB0aGlzLmJlZm9yZUVudGVyKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cdFxuXHQgICAgdmFyIHRyaWdnZXIgPSB0aGlzLiRyZWZzLnRyaWdnZXIuY2hpbGRyZW5bMF07XG5cdCAgICBpZiAoIXRyaWdnZXIpIHJldHVybiBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgZmluZCB0cmlnZ2VyIHYtZWwgaW4geW91ciBjb21wb25lbnQgdGhhdCB1c2VzIHBvcG92ZXJNaXhpbi4nKTtcblx0XG5cdCAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnICYmICF+dHJpZ2dlci50YWJJbmRleCkge1xuXHQgICAgICB0cmlnZ2VyID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJ2EsaW5wdXQsc2VsZWN0LHRleHRhcmVhLGJ1dHRvbicsIHRyaWdnZXIpO1xuXHQgICAgICBpZiAoIXRyaWdnZXIubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0cmlnZ2VyKS5vbihldmVudCwgX3RoaXMzLnRvZ2dsZSk7XG5cdCAgICB9KTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fdHJpZ2dlcikgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy5fdHJpZ2dlcikub2ZmKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTQ0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWydwb3BvdmVyJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhcnJvd1wiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0udGl0bGUpID8gX3ZtLl9jKCdoMycsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBvcG92ZXItdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3QoXCJ0aXRsZVwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJwb3BvdmVyLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJjb250ZW50XCIsIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMjQ2NWJmNTRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ2KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0Nylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxQcm9ncmVzc2Jhci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNjhhYTMzNzVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTY4YWEzMzc1XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUHJvZ3Jlc3NiYXIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQ2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYW5pbWF0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhYmVsOiB7IGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBub3c6IHsgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHN0cmlwZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBsYWJlbEJvb2w6IGZ1bmN0aW9uIGxhYmVsQm9vbCgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLmxhYmVsKTtcblx0ICAgIH0sXG5cdCAgICBub3dOdW06IGZ1bmN0aW9uIG5vd051bSgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UubnVtYmVyKHRoaXMubm93KTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxNDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncHJvZ3Jlc3MtYmFyJywgJ3Byb2dyZXNzLWJhci0nICsgX3ZtLnR5cGUsIHtcblx0ICAgICAgYWN0aXZlOiBfdm0uYW5pbWF0ZWQsXG5cdCAgICAgICdwcm9ncmVzcy1iYXItc3RyaXBlZCc6IF92bS5zdHJpcGVkXG5cdCAgICB9XSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLm5vd051bSArICclJ1xuXHQgICAgfSksXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInRleHRDb250ZW50XCI6IF92bS5fcyhfdm0ubGFiZWxCb29sID8gX3ZtLm5vd051bSArICclJyA6IG51bGwpXG5cdCAgICB9XG5cdCAgfSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNjhhYTMzNzVcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTQ5KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUxKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Milcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxSYWRpby52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzRjZmQ5MmNcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTc0Y2ZkOTJjXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gUmFkaW8udnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQ5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTApO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTc0Y2ZkOTJjIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9SYWRpby52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTc0Y2ZkOTJjIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9SYWRpby52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnJhZGlvIHsgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0IHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjE1cmVtO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEuNHJlbTtcXHJcXG4gIGhlaWdodDogMS40cmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuN3JlbTtcXHJcXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxyXFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZC1zaXplOiA1MCUgNTAlO1xcbn1cXG4ucmFkaW86bm90KC5hY3RpdmUpID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2JiYjtcXG59XFxuLnJhZGlvID4gbGFiZWwgPiBpbnB1dDpmb2N1cyB+IC5pY29uIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjNjZhZmU5O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxuLnJhZGlvLmFjdGl2ZSA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1zaXplOiAxcmVtIDFyZW07XFxyXFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p4emRtY2dkbVZ5YzJsdmJqMGlNUzR4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpUGp4amFYSmpiR1VnWTNnOUlqVWlJR041UFNJMUlpQnlQU0kwSWlCbWFXeHNQU0lqWm1abUlpOCtQQzl6ZG1jKyk7XFxufVxcbi5yYWRpby5hY3RpdmUgLmJ0bi1kZWZhdWx0IHsgZmlsdGVyOiBicmlnaHRuZXNzKDc1JSk7XFxufVxcbi5yYWRpby5kaXNhYmxlZCA+IGxhYmVsID4gLmljb24sXFxyXFxuLnJhZGlvLnJlYWRvbmx5ID4gbGFiZWwgPiAuaWNvbixcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcbn1cXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPXJhZGlvXSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUmFkaW8udnVlPzExNjI0YzQ4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUE4R0EsU0FBQSxtQkFBQTtDQUFBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLFVBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLFlBQUE7RUFDQSxRQUFBO0VBQ0EsZUFBQTtFQUNBLGNBQUE7RUFDQSxlQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtFQUNBLHFCQUFBO0VBQ0EsNkJBQUE7RUFDQSxtQ0FBQTtFQUNBLHlCQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLDBCQUFBO0VBQ0EsMEVBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7RUFDQSw4T0FBQTtDQUNBO0FBQ0EsNkJBQUEsd0JBQUE7Q0FBQTtBQUVBOzs7RUFHQSwwQkFBQTtFQUNBLGlCQUFBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiUmFkaW8udnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgOmlzPVxcXCJidXR0b25TdHlsZT8nbGFiZWwnOidkaXYnXFxcIiBAY2xpY2sucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICA6Y2xhc3M9XFxcIlsoYnV0dG9uU3R5bGU/J2J0biBidG4tJyt0eXBlQ29sb3I6J3JhZGlvICcrdHlwZUNvbG9yKSx7YWN0aXZlOmFjdGl2ZSxkaXNhYmxlZDpkaXNhYmxlZCxyZWFkb25seTpyZWFkb25seX1dXFxcIlxcclxcbiAgPlxcclxcbiAgICA8dGVtcGxhdGUgdi1pZj1cXFwiYnV0dG9uU3R5bGVcXFwiPlxcclxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJyYWRpb1xcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICB2LXNob3c9XFxcIiFyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcImNoZWNrXFxcIlxcclxcbiAgICAgICAgOnZhbHVlPVxcXCJzZWxlY3RlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPGxhYmVsIHYtZWxzZSBjbGFzcz1cXFwib3BlblxcXCI+XFxyXFxuICAgICAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcImNoZWNrXFxcIlxcclxcbiAgICAgICAgOnZhbHVlPVxcXCJzZWxlY3RlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbYWN0aXZlPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiYWN0aXZlJiZ0eXBlQ29sb3I9PT0nZGVmYXVsdCdcXFwiIGNsYXNzPVxcXCJpY29uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2xhYmVsPlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgc2VsZWN0ZWRWYWx1ZToge2RlZmF1bHQ6IHRydWV9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBmYWxzZX1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjaGVjazogdGhpcy52YWx1ZVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgYWN0aXZlICgpIHsgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZSB9LFxcclxcbiAgICBpbkdyb3VwICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuYnRuR3JvdXAgJiYgIXRoaXMuJHBhcmVudC5fY2hlY2tib3hHcm91cCB9LFxcclxcbiAgICBwYXJlbnRWYWx1ZSAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQudmFsIH0sXFxyXFxuICAgIGJ1dHRvblN0eWxlICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LmJ0bkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICB0eXBlQ29sb3IgKCkgeyByZXR1cm4gKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSkgfHwgJ2RlZmF1bHQnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjaGVjayAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdmFsKSB7XFxyXFxuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB0cnVlKVxcclxcbiAgICAgICAgdGhpcy51cGRhdGVQYXJlbnQoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHZhbCkge1xcclxcbiAgICAgICAgdGhpcy5jaGVjayA9IHZhbFxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmNoZWNrID0gZmFsc2VcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnRcXHJcXG4gICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlXFxyXFxuICAgICAgdGhpcy51cGRhdGVGcm9tUGFyZW50KClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgdXBkYXRlRnJvbVBhcmVudCgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pbkdyb3VwKSB7XFxyXFxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHRoaXMuJHBhcmVudC52YWwpIHtcXHJcXG4gICAgICAgICAgdGhpcy5jaGVjayA9IHRoaXMuc2VsZWN0ZWRWYWx1ZVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgdGhpcy5jaGVjayA9IGZhbHNlXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB1cGRhdGVQYXJlbnQoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xcclxcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdGhpcy5jaGVjaykge1xcclxcbiAgICAgICAgICB0aGlzLiRwYXJlbnQudmFsID0gdGhpcy5zZWxlY3RlZFZhbHVlXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBmb2N1cyAoKSB7XFxyXFxuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICB0aGlzLmZvY3VzKClcXHJcXG4gICAgICBpZiAodGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLnNlbGVjdGVkVmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGU+XFxyXFxuLnJhZGlvIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9XFxyXFxuLnJhZGlvID4gbGFiZWwgPiBpbnB1dCB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHotaW5kZXg6IC0xO1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuLnJhZGlvID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IC4xNXJlbTtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAxLjRyZW07XFxyXFxuICBoZWlnaHQ6IDEuNHJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgYm9yZGVyLXJhZGl1czogLjdyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXHJcXG59XFxyXFxuLnJhZGlvOm5vdCguYWN0aXZlKSA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxyXFxufVxcclxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbiB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzY2YWZlOTtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxyXFxufVxcclxcbi5yYWRpby5hY3RpdmUgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZG1WeWMybHZiajBpTVM0eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaVBqeGphWEpqYkdVZ1kzZzlJalVpSUdONVBTSTFJaUJ5UFNJMElpQm1hV3hzUFNJalptWm1JaTgrUEM5emRtYyspO1xcclxcbn1cXHJcXG4ucmFkaW8uYWN0aXZlIC5idG4tZGVmYXVsdCB7IGZpbHRlcjogYnJpZ2h0bmVzcyg3NSUpOyB9XFxyXFxuXFxyXFxuLnJhZGlvLmRpc2FibGVkID4gbGFiZWwgPiAuaWNvbixcXHJcXG4ucmFkaW8ucmVhZG9ubHkgPiBsYWJlbCA+IC5pY29uLFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxyXFxufVxcclxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9cmFkaW9dIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE1MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2VsZWN0ZWRWYWx1ZTogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcblx0ICAgIH0sXG5cdCAgICBpbkdyb3VwOiBmdW5jdGlvbiBpbkdyb3VwKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiAhdGhpcy4kcGFyZW50Ll9jaGVja2JveEdyb3VwO1xuXHQgICAgfSxcblx0ICAgIHBhcmVudFZhbHVlOiBmdW5jdGlvbiBwYXJlbnRWYWx1ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC52YWw7XG5cdCAgICB9LFxuXHQgICAgYnV0dG9uU3R5bGU6IGZ1bmN0aW9uIGJ1dHRvblN0eWxlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5idG5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICB0eXBlQ29sb3I6IGZ1bmN0aW9uIHR5cGVDb2xvcigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZSB8fCB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUgfHwgJ2RlZmF1bHQnO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIGNoZWNrOiBmdW5jdGlvbiBjaGVjayh2YWwpIHtcblx0ICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB0cnVlKTtcblx0ICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudCgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLnVwZGF0ZUZyb21QYXJlbnQoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWUgPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy5jaGVjayA9IHZhbDtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmNoZWNrID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICBpZiAodGhpcy5pbkdyb3VwKSB7XG5cdCAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICAgIHBhcmVudC5fcmFkaW9Hcm91cCA9IHRydWU7XG5cdCAgICAgIHRoaXMudXBkYXRlRnJvbVBhcmVudCgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHVwZGF0ZUZyb21QYXJlbnQ6IGZ1bmN0aW9uIHVwZGF0ZUZyb21QYXJlbnQoKSB7XG5cdCAgICAgIGlmICh0aGlzLmluR3JvdXApIHtcblx0ICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlID09IHRoaXMuJHBhcmVudC52YWwpIHtcblx0ICAgICAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLnNlbGVjdGVkVmFsdWU7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuY2hlY2sgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB1cGRhdGVQYXJlbnQ6IGZ1bmN0aW9uIHVwZGF0ZVBhcmVudCgpIHtcblx0ICAgICAgaWYgKHRoaXMuaW5Hcm91cCkge1xuXHQgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWUgPT09IHRoaXMuY2hlY2spIHtcblx0ICAgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB0aGlzLnNlbGVjdGVkVmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZm9jdXMoKTtcblx0ICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5jaGVjayA9IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uYnV0dG9uU3R5bGUgPyAnbGFiZWwnIDogJ2RpdicsIHtcblx0ICAgIHRhZzogXCJkaXZcIixcblx0ICAgIGNsYXNzOiBbKF92bS5idXR0b25TdHlsZSA/ICdidG4gYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJ3JhZGlvICcgKyBfdm0udHlwZUNvbG9yKSwge1xuXHQgICAgICBhY3RpdmU6IF92bS5hY3RpdmUsXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHlcblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFsoX3ZtLmJ1dHRvblN0eWxlKSA/IFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoIV92bS5yZWFkb25seSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiIXJlYWRvbmx5XCJcblx0ICAgIH0sIHtcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY2hlY2spLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNoZWNrXCJcblx0ICAgIH1dLFxuXHQgICAgcmVmOiBcImlucHV0XCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJyYWRpb1wiLFxuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWUsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcImRpc2FibGVkXCI6IF92bS5kaXNhYmxlZFxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLnNlbGVjdGVkVmFsdWUsXG5cdCAgICAgIFwiY2hlY2tlZFwiOiBfdm0uX3EoX3ZtLmNoZWNrLCBfdm0uc2VsZWN0ZWRWYWx1ZSlcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jaGVjayA9IF92bS5zZWxlY3RlZFZhbHVlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0gOiBfdm0uX2MoJ2xhYmVsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwib3BlblwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVjayksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInJhZGlvXCIsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uc2VsZWN0ZWRWYWx1ZSxcblx0ICAgICAgXCJjaGVja2VkXCI6IF92bS5fcShfdm0uY2hlY2ssIF92bS5zZWxlY3RlZFZhbHVlKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLmNoZWNrID0gX3ZtLnNlbGVjdGVkVmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uYWN0aXZlID8gJ2J0bi0nICsgX3ZtLnR5cGVDb2xvciA6ICcnLCB7XG5cdCAgICAgIGJnOiBfdm0udHlwZUNvbG9yID09PSAnZGVmYXVsdCdcblx0ICAgIH1dXG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uYWN0aXZlICYmIF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0JykgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uXCJcblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03NGNmZDkyY1wiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNTQpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTYpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTU3KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNlbGVjdC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdF9fdnVlX29wdGlvbnNfXy5fc2NvcGVJZCA9IFwiZGF0YS12LWU1MTRkYmM2XCJcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1lNTE0ZGJjNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtZTUxNGRiYzZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTZWxlY3QudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTU0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTUpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWU1MTRkYmM2JnNjb3BlZD10cnVlIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TZWxlY3QudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1lNTE0ZGJjNiZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU2VsZWN0LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZde1xcclxcbiAgaGVpZ2h0OiBhdXRvO1xcclxcbiAgcGFkZGluZy1yaWdodDogMjRweDtcXG59XFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGVbZGF0YS12LWU1MTRkYmM2XTphZnRlcntcXHJcXG4gIGNvbnRlbnQ6ICcgJztcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHJpZ2h0OiAxM3B4O1xcclxcbiAgdG9wOiA1MCU7XFxyXFxuICBtYXJnaW46IC0xcHggMCAwO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IGRhc2hlZDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBzb2xpZCBcXFxcOTtcXHJcXG4gIGJvcmRlci1yaWdodDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXG59XFxuLmJzLXNlYXJjaGJveFtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIG1hcmdpbjogNHB4IDhweDtcXG59XFxuLmJzLXNlYXJjaGJveCAuY2xvc2VbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5icy1zZWFyY2hib3ggaW5wdXRbZGF0YS12LWU1MTRkYmM2XTpmb2N1cyxcXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZdOmZvY3VzIHtcXHJcXG4gIG91dGxpbmU6IDA7XFxyXFxuICBib3JkZXItY29sb3I6ICM2NmFmZTkgIWltcG9ydGFudDtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxufVxcbi5zZWNyZXRbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBjbGlwOiByZWN0KDAgMCAwIDApO1xcclxcbiAgaGVpZ2h0OiAxcHg7XFxyXFxuICBtYXJnaW46IC0xcHg7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxcHg7XFxufVxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlPi5jbG9zZVtkYXRhLXYtZTUxNGRiYzZdIHsgbWFyZ2luLWxlZnQ6IDVweDtcXG59XFxuLm5vdGlmeS5vdXRbZGF0YS12LWU1MTRkYmM2XSB7IHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLm5vdGlmeS5pbltkYXRhLXYtZTUxNGRiYzZdLFxcclxcbi5ub3RpZnk+ZGl2W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDk2JTtcXHJcXG4gIG1hcmdpbjogMCAyJTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDI2cHg7XFxyXFxuICBwYWRkaW5nOiAzcHggNXB4O1xcclxcbiAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNlM2UzZTM7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcbi5ub3RpZnk+ZGl2W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgdG9wOiA1cHg7XFxyXFxuICB6LWluZGV4OiAxO1xcbn1cXG4ubm90aWZ5LmluW2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgb3BhY2l0eTogLjk7XFxyXFxuICBib3R0b206IDVweDtcXG59XFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLXRvZ2dsZT5zcGFuW2RhdGEtdi1lNTE0ZGJjNl06bm90KC5jbG9zZSkge1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDE4cHgpO1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG4gIG1hcmdpbi1ib3R0b206IC00cHg7XFxufVxcbi5idG4tZ3JvdXAtanVzdGlmaWVkIC5kcm9wZG93bi1tZW51W2RhdGEtdi1lNTE0ZGJjNl0geyB3aWR0aDogMTAwJTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9TZWxlY3QudnVlPzY4Mjk4YzEzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF1UUE7RUFDQSxhQUFBO0VBQ0Esb0JBQUE7Q0FDQTtBQUNBO0VBQ0EsYUFBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLFNBQUE7RUFDQSxpQkFBQTtFQUNBLHVCQUFBO0VBQ0EseUJBQUE7RUFDQSxvQ0FBQTtFQUNBLG1DQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTs7RUFFQSxXQUFBO0VBQ0EsaUNBQUE7RUFDQSwwRUFBQTtDQUNBO0FBQ0E7RUFDQSxVQUFBO0VBQ0Esb0JBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGlCQUFBO0VBQ0EsV0FBQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtDQUNBO0FBQ0Esd0RBQUEsaUJBQUE7Q0FBQTtBQUNBLCtCQUFBLG1CQUFBO0NBQUE7QUFDQTs7RUFFQSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxhQUFBO0VBQ0EsaUJBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0EsMEJBQUE7RUFDQSw0Q0FBQTtFQUNBLHFCQUFBO0NBQ0E7QUFDQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSxpQkFBQTtFQUNBLG9CQUFBO0VBQ0Esd0JBQUE7RUFDQSxvQkFBQTtDQUNBO0FBQ0EsdURBQUEsWUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJTZWxlY3QudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgcmVmPVxcXCJzZWxlY3RcXFwiIDpjbGFzcz1cXFwiY2xhc3Nlc1xcXCIgdi1jbGljay1vdXRzaWRlPVxcXCJjbG9zZVxcXCI+XFxyXFxuICAgIDxkaXYgcmVmPVxcXCJidG5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZHJvcGRvd24tdG9nZ2xlXFxcIiB0YWJpbmRleD1cXFwiMVxcXCIgOmRpc2FibGVkPVxcXCJkaXNhYmxlZCB8fCAhaGFzUGFyZW50XFxcIiA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgIEBibHVyPVxcXCJjYW5TZWFyY2ggPyBudWxsIDogY2xvc2UoKVxcXCJcXHJcXG4gICAgICBAY2xpY2s9XFxcInRvZ2dsZSgpXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVzYy5zdG9wLnByZXZlbnQ9XFxcImNsb3NlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLnNwYWNlLnN0b3AucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVudGVyLnN0b3AucHJldmVudD1cXFwidG9nZ2xlXFxcIlxcclxcbiAgICA+XFxyXFxuICAgICAgPHNwYW4gY2xhc3M9XFxcImJ0bi1jb250ZW50XFxcIiB2LWh0bWw9XFxcImxvYWRpbmcgPyB0ZXh0LmxvYWRpbmcgOiBzaG93UGxhY2Vob2xkZXIgfHwgKG11bHRpcGxlICYmIHNob3dDb3VudCA/IHNlbGVjdGVkVGV4dCA6IHNlbGVjdGVkKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWx1ZXMubGVuZ3RoXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwiY2xlYXIoKVxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDxzZWxlY3QgcmVmPVxcXCJzZWxcXFwiIHYtbW9kZWw9XFxcInZhbFxcXCIgOm5hbWU9XFxcIm5hbWVcXFwiIGNsYXNzPVxcXCJzZWNyZXRcXFwiIDptdWx0aXBsZT1cXFwibXVsdGlwbGVcXFwiIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1pZj1cXFwicmVxdWlyZWRcXFwiIHZhbHVlPVxcXCJcXFwiPjwvb3B0aW9uPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wdGlvbiBpbiBsaXN0XFxcIiA6dmFsdWU9XFxcIm9wdGlvbltvcHRpb25zVmFsdWVdXFxcIj57eyBvcHRpb25bb3B0aW9uc0xhYmVsXSB9fTwvb3B0aW9uPlxcclxcbiAgICA8L3NlbGVjdD5cXHJcXG4gICAgPHVsIGNsYXNzPVxcXCJkcm9wZG93bi1tZW51XFxcIj5cXHJcXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cXFwibGlzdC5sZW5ndGhcXFwiPlxcclxcbiAgICAgICAgPGxpIHYtaWY9XFxcImNhblNlYXJjaFxcXCIgY2xhc3M9XFxcImJzLXNlYXJjaGJveFxcXCI+XFxyXFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiA6cGxhY2Vob2xkZXI9XFxcInNlYXJjaFRleHR8fHRleHQuc2VhcmNoXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJzZWFyY2hcXFwiXFxyXFxuICAgICAgICAgICAgdi1tb2RlbD1cXFwic2VhcmNoVmFsdWVcXFwiXFxyXFxuICAgICAgICAgICAgQGtleXVwLmVzYz1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgICAgIC8+XFxyXFxuICAgICAgICAgIDxzcGFuIHYtc2hvdz1cXFwic2VhcmNoVmFsdWVcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJjbGVhclNlYXJjaFxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDwvbGk+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwicmVxdWlyZWQmJiFjbGVhckJ1dHRvblxcXCI+PGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJjbGVhcigpICYmIGNsb3NlKClcXFwiPnt7IHBsYWNlaG9sZGVyIHx8IHRleHQubm90U2VsZWN0ZWQgfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDxsaSB2LWZvcj1cXFwib3B0aW9uIGluIGZpbHRlcmVkT3B0aW9uc1xcXCIgOmlkPVxcXCJvcHRpb25bb3B0aW9uc1ZhbHVlXVxcXCI+XFxyXFxuICAgICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwic2VsZWN0KG9wdGlvbltvcHRpb25zVmFsdWVdKVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1odG1sPVxcXCJvcHRpb25bb3B0aW9uc0xhYmVsXVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcXFwiIHYtc2hvdz1cXFwiaXNTZWxlY3RlZChvcHRpb25bb3B0aW9uc1ZhbHVlXSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9hPlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgIWNsb3NlT25TZWxlY3RcXFwiIG5hbWU9XFxcImZhZGVpblxcXCI+PGRpdiBjbGFzcz1cXFwibm90aWZ5IGluXFxcIj57e2xpbWl0VGV4dH19PC9kaXY+PC90cmFuc2l0aW9uPlxcclxcbiAgICA8L3VsPlxcclxcbiAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgY2xvc2VPblNlbGVjdFxcXCIgbmFtZT1cXFwiZmFkZWluXFxcIj48ZGl2IGNsYXNzPVxcXCJub3RpZnkgb3V0XFxcIj48ZGl2Pnt7bGltaXRUZXh0fX08L2Rpdj48L2Rpdj48L3RyYW5zaXRpb24+XFxyXFxuICAgIDwhLS0gPHByZT5PcHRpb25zOiB7e2xpc3R9fTwvcHJlPiAtLT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge3RyYW5zbGF0aW9uc30gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgQ2xpY2tPdXRzaWRlIGZyb20gJy4vZGlyZWN0aXZlcy9DbGlja091dHNpZGUuanMnXFxyXFxuXFxyXFxudmFyIHRpbWVvdXQgPSB7fVxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIGRpcmVjdGl2ZXM6IHtcXHJcXG4gICAgQ2xpY2tPdXRzaWRlXFxyXFxuICB9LFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNsb3NlT25TZWxlY3Q6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBsaW1pdDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNH0sXFxyXFxuICAgIG1pblNlYXJjaDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG11bHRpcGxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgb3B0aW9uczoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICBvcHRpb25zTGFiZWw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCd9LFxcclxcbiAgICBvcHRpb25zVmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZSd9LFxcclxcbiAgICBwYXJlbnQ6IHtkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgcGxhY2Vob2xkZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzZWFyY2g6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHNlYXJjaFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBjb3VudFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzaG93Q291bnQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHVybDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiBudWxsXFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgbGlzdDogW10sXFxyXFxuICAgICAgbG9hZGluZzogbnVsbCxcXHJcXG4gICAgICBzZWFyY2hWYWx1ZTogbnVsbCxcXHJcXG4gICAgICBzaG93OiBmYWxzZSxcXHJcXG4gICAgICBub3RpZnk6IGZhbHNlLFxcclxcbiAgICAgIHZhbDogbnVsbCxcXHJcXG4gICAgICB2YWxpZDogbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgY2FuU2VhcmNoICgpIHsgcmV0dXJuIHRoaXMubWluU2VhcmNoID8gdGhpcy5saXN0Lmxlbmd0aCA+PSB0aGlzLm1pblNlYXJjaCA6IHRoaXMuc2VhcmNoIH0sXFxyXFxuICAgIGNsYXNzZXMgKCkgeyByZXR1cm4gW3tvcGVuOiB0aGlzLnNob3csIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkfSwgdGhpcy5jbGFzcywgdGhpcy5pc0xpID8gJ2Ryb3Bkb3duJyA6IHRoaXMuaW5JbnB1dCA/ICdpbnB1dC1ncm91cC1idG4nIDogJ2J0bi1ncm91cCddIH0sXFxyXFxuICAgIGZpbHRlcmVkT3B0aW9ucyAoKSB7XFxyXFxuICAgICAgdmFyIHNlYXJjaCA9ICh0aGlzLnNlYXJjaFZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgcmV0dXJuICFzZWFyY2ggPyB0aGlzLmxpc3QgOiB0aGlzLmxpc3QuZmlsdGVyKGVsID0+IHtcXHJcXG4gICAgICAgIHJldHVybiB+ZWxbdGhpcy5vcHRpb25zTGFiZWxdLnRvTG93ZXJDYXNlKCkuc2VhcmNoKHNlYXJjaClcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LFxcclxcbiAgICBoYXNQYXJlbnQgKCkgeyByZXR1cm4gdGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBBcnJheSA/IHRoaXMucGFyZW50Lmxlbmd0aCA6IHRoaXMucGFyZW50IH0sXFxyXFxuICAgIGluSW5wdXQgKCkgeyByZXR1cm4gdGhpcy4kcGFyZW50Ll9pbnB1dCB9LFxcclxcbiAgICBpc0xpICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0IH0sXFxyXFxuICAgIGxpbWl0VGV4dCAoKSB7IHJldHVybiB0aGlzLnRleHQubGltaXQucmVwbGFjZSgne3tsaW1pdH19JywgdGhpcy5saW1pdCkgfSxcXHJcXG4gICAgc2VsZWN0ZWQgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmxpc3QubGVuZ3RoID09PSAwKSB7IHJldHVybiAnJyB9XFxyXFxuICAgICAgdmFyIHNlbCA9IHRoaXMudmFsdWVzLm1hcCh2YWwgPT4gKHRoaXMubGlzdC5maW5kKG8gPT4gb1t0aGlzLm9wdGlvbnNWYWx1ZV0gPT09IHZhbCkgfHwge30pW3RoaXMub3B0aW9uc0xhYmVsXSkuZmlsdGVyKHZhbCA9PiB2YWwgIT09IHVuZGVmaW5lZClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdzZWxlY3RlZCcsIHNlbClcXHJcXG4gICAgICByZXR1cm4gc2VsLmpvaW4oJywgJylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ZWRUZXh0ICgpIHsgcmV0dXJuIHRoaXMuY291bnRUZXh0IHx8IHRoaXMudGV4dC5zZWxlY3RlZC5yZXBsYWNlKCd7e2NvdW50fX0nLCB0aGlzLnZhbHVlcy5sZW5ndGgpIH0sXFxyXFxuICAgIHNob3dQbGFjZWhvbGRlciAoKSB7IHJldHVybiAodGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCkgPyAodGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQpIDogbnVsbCB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHZhbHVlcyAoKSB7IHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF0gfSxcXHJcXG4gICAgdmFsT3B0aW9ucyAoKSB7IHJldHVybiB0aGlzLmxpc3QubWFwKGVsID0+IGVsW3RoaXMub3B0aW9uc1ZhbHVlXSkgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIG9wdGlvbnMgKG9wdGlvbnMpIHtcXHJcXG4gICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLnNldE9wdGlvbnMob3B0aW9ucylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAodmFsKSB7XFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAoKSB7XFxyXFxuICAgICAgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdGhpcy52YWwgPSB2YWwgPSBudWxsIH1cXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgdmFsLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcXHJcXG4gICAgICAgIHRoaXMudmFsID0gdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWVcXHJcXG4gICAgICAgIGlmICh0aW1lb3V0LmxpbWl0KSBjbGVhclRpbWVvdXQodGltZW91dC5saW1pdClcXHJcXG4gICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGltZW91dC5saW1pdCA9IGZhbHNlXFxyXFxuICAgICAgICAgIHRoaXMubm90aWZ5ID0gZmFsc2VcXHJcXG4gICAgICAgIH0sIDE1MDApXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIGNoZWNrRGF0YSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcXHJcXG4gICAgICAgIGlmICh0aGlzLmxpbWl0IDwgMSkgeyB0aGlzLmxpbWl0ID0gMSB9XFxyXFxuICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xcclxcbiAgICAgICAgICB0aGlzLnZhbCA9ICh0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkKSA/IFtdIDogW3RoaXMudmFsXVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9uc1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbC5maWx0ZXIoZWwgPT4gfnZhbHVlcy5pbmRleE9mKGVsKSlcXHJcXG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgaWYgKCF+dGhpcy52YWxPcHRpb25zLmluZGV4T2YodGhpcy52YWwpKSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBjbGVhciAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDogbnVsbFxcclxcbiAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgY2xlYXJTZWFyY2ggKCkge1xcclxcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgaXNTZWxlY3RlZCAodikge1xcclxcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTFcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ICh2KSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKVxcclxcbiAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xcclxcbiAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgbmV3VmFsLnB1c2godilcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMudmFsID0gbmV3VmFsXFxyXFxuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2XFxyXFxuICAgICAgICB0aGlzLnRvZ2dsZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzZXRPcHRpb25zIChvcHRpb25zKSB7XFxyXFxuICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZWwgPT4ge1xcclxcbiAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7IHJldHVybiBlbCB9XFxyXFxuICAgICAgICBsZXQgb2JqID0ge31cXHJcXG4gICAgICAgIG9ialt0aGlzLm9wdGlvbnNMYWJlbF0gPSBlbFxcclxcbiAgICAgICAgb2JqW3RoaXMub3B0aW9uc1ZhbHVlXSA9IGVsXFxyXFxuICAgICAgICByZXR1cm4gb2JqXFxyXFxuICAgICAgfSlcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdvcHRpb25zJywgdGhpcy5saXN0KVxcclxcbiAgICB9LFxcclxcbiAgICB0b2dnbGUgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkICYmICF0aGlzLnNob3cpIHJldHVybjtcXHJcXG4gICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93XFxyXFxuICAgICAgaWYgKCF0aGlzLnNob3cpIHRoaXMuJHJlZnMuYnRuLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdXJsQ2hhbmdlZCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihyZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXVxcclxcbiAgICAgICAgdHJ5IHsgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSkgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyhkYXRhKVxcclxcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gICAgICB9LCByZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIH0pXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbGlkYXRlICgpIHtcXHJcXG4gICAgICByZXR1cm4gIXRoaXMucmVxdWlyZWQgPyB0cnVlIDogdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IHRoaXMudmFsLmxlbmd0aCA+IDAgOiB0aGlzLnZhbCAhPT0gbnVsbFxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpXFxyXFxuICAgIHRoaXMudmFsID0gdGhpcy52YWx1ZVxcclxcbiAgICB0aGlzLl9zZWxlY3QgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLnZhbCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLnBhcmVudCkgeyB0aGlzLnZhbCA9IG51bGwgfVxcclxcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWxbMF1cXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLmNoZWNrRGF0YSgpXFxyXFxuICAgIGlmICh0aGlzLnVybCkgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgbGV0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHsgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQgfVxcclxcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcylcXHJcXG4gICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucylcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gIH0sXFxyXFxuICBiZWZvcmVEZXN0cm95ICgpIHtcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkge1xcclxcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xle1xcclxcbiAgaGVpZ2h0OiBhdXRvO1xcclxcbiAgcGFkZGluZy1yaWdodDogMjRweDtcXHJcXG59XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU6YWZ0ZXJ7XFxyXFxuICBjb250ZW50OiAnICc7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICByaWdodDogMTNweDtcXHJcXG4gIHRvcDogNTAlO1xcclxcbiAgbWFyZ2luOiAtMXB4IDAgMDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBkYXNoZWQ7XFxyXFxuICBib3JkZXItdG9wOiA0cHggc29saWQgXFxcXDk7XFxyXFxuICBib3JkZXItcmlnaHQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG4gIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3gge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgbWFyZ2luOiA0cHggOHB4O1xcclxcbn1cXHJcXG4uYnMtc2VhcmNoYm94IC5jbG9zZSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAzNHB4O1xcclxcbiAgaGVpZ2h0OiAzNHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDM0cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3ggaW5wdXQ6Zm9jdXMsXFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlci1jb2xvcjogIzY2YWZlOSAhaW1wb3J0YW50O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXHJcXG59XFxyXFxuLnNlY3JldCB7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBjbGlwOiByZWN0KDAgMCAwIDApO1xcclxcbiAgaGVpZ2h0OiAxcHg7XFxyXFxuICBtYXJnaW46IC0xcHg7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxcHg7XFxyXFxufVxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlPi5jbG9zZSB7IG1hcmdpbi1sZWZ0OiA1cHg7fVxcclxcbi5ub3RpZnkub3V0IHsgcG9zaXRpb246IHJlbGF0aXZlOyB9XFxyXFxuLm5vdGlmeS5pbixcXHJcXG4ubm90aWZ5PmRpdiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB3aWR0aDogOTYlO1xcclxcbiAgbWFyZ2luOiAwIDIlO1xcclxcbiAgbWluLWhlaWdodDogMjZweDtcXHJcXG4gIHBhZGRpbmc6IDNweCA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2UzZTNlMztcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuLm5vdGlmeT5kaXYge1xcclxcbiAgdG9wOiA1cHg7XFxyXFxuICB6LWluZGV4OiAxO1xcclxcbn1cXHJcXG4ubm90aWZ5LmluIHtcXHJcXG4gIG9wYWNpdHk6IC45O1xcclxcbiAgYm90dG9tOiA1cHg7XFxyXFxufVxcclxcbi5idG4tZ3JvdXAtanVzdGlmaWVkIC5kcm9wZG93bi10b2dnbGU+c3Bhbjpub3QoLmNsb3NlKSB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gMThweCk7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogLTRweDtcXHJcXG59XFxyXFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLW1lbnUgeyB3aWR0aDogMTAwJTsgfVxcclxcbjwvc3R5bGU+XFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdHZhciB0aW1lb3V0ID0ge307XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBDbGlja091dHNpZGU6IF9DbGlja091dHNpZGUyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgY2xvc2VPblNlbGVjdDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNCB9LFxuXHQgICAgbWluU2VhcmNoOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuXHQgICAgbXVsdGlwbGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcblx0ICAgICAgICByZXR1cm4gW107XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBvcHRpb25zTGFiZWw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbGFiZWwnIH0sXG5cdCAgICBvcHRpb25zVmFsdWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndmFsdWUnIH0sXG5cdCAgICBwYXJlbnQ6IHsgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICByZXF1aXJlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBzZWFyY2g6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHNlYXJjaFRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjb3VudFRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBzaG93Q291bnQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHVybDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgbGlzdDogW10sXG5cdCAgICAgIGxvYWRpbmc6IG51bGwsXG5cdCAgICAgIHNlYXJjaFZhbHVlOiBudWxsLFxuXHQgICAgICBzaG93OiBmYWxzZSxcblx0ICAgICAgbm90aWZ5OiBmYWxzZSxcblx0ICAgICAgdmFsOiBudWxsLFxuXHQgICAgICB2YWxpZDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgY2FuU2VhcmNoOiBmdW5jdGlvbiBjYW5TZWFyY2goKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaDtcblx0ICAgIH0sXG5cdCAgICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gW3sgb3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCB0aGlzLmNsYXNzLCB0aGlzLmlzTGkgPyAnZHJvcGRvd24nIDogdGhpcy5pbklucHV0ID8gJ2lucHV0LWdyb3VwLWJ0bicgOiAnYnRuLWdyb3VwJ107XG5cdCAgICB9LFxuXHQgICAgZmlsdGVyZWRPcHRpb25zOiBmdW5jdGlvbiBmaWx0ZXJlZE9wdGlvbnMoKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgc2VhcmNoID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cdCAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gfmVsW190aGlzLm9wdGlvbnNMYWJlbF0udG9Mb3dlckNhc2UoKS5zZWFyY2goc2VhcmNoKTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgaGFzUGFyZW50OiBmdW5jdGlvbiBoYXNQYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5wYXJlbnQubGVuZ3RoIDogdGhpcy5wYXJlbnQ7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0O1xuXHQgICAgfSxcblx0ICAgIGxpbWl0VGV4dDogZnVuY3Rpb24gbGltaXRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkOiBmdW5jdGlvbiBzZWxlY3RlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgc2VsID0gdGhpcy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICByZXR1cm4gKF90aGlzMi5saXN0LmZpbmQoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICAgIHJldHVybiBvW190aGlzMi5vcHRpb25zVmFsdWVdID09PSB2YWw7XG5cdCAgICAgICAgfSkgfHwge30pW190aGlzMi5vcHRpb25zTGFiZWxdO1xuXHQgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdGVkJywgc2VsKTtcblx0ICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkVGV4dDogZnVuY3Rpb24gc2VsZWN0ZWRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5jb3VudFRleHQgfHwgdGhpcy50ZXh0LnNlbGVjdGVkLnJlcGxhY2UoJ3t7Y291bnR9fScsIHRoaXMudmFsdWVzLmxlbmd0aCk7XG5cdCAgICB9LFxuXHQgICAgc2hvd1BsYWNlaG9sZGVyOiBmdW5jdGlvbiBzaG93UGxhY2Vob2xkZXIoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggPT09IDAgfHwgIXRoaXMuaGFzUGFyZW50ID8gdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQgOiBudWxsO1xuXHQgICAgfSxcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnZhbCA6IH5bbnVsbCwgdW5kZWZpbmVkXS5pbmRleE9mKHRoaXMudmFsKSA/IFtdIDogW3RoaXMudmFsXTtcblx0ICAgIH0sXG5cdCAgICB2YWxPcHRpb25zOiBmdW5jdGlvbiB2YWxPcHRpb25zKCkge1xuXHQgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICAgIHJldHVybiB0aGlzLmxpc3QubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbFtfdGhpczMub3B0aW9uc1ZhbHVlXTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgb3B0aW9uczogZnVuY3Rpb24gb3B0aW9ucyhfb3B0aW9ucykge1xuXHQgICAgICBpZiAoX29wdGlvbnMgaW5zdGFuY2VvZiBBcnJheSkgdGhpcy5zZXRPcHRpb25zKF9vcHRpb25zKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCkge1xuXHQgICAgICBpZiAodmFsKSB7XG5cdCAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKTtcblx0ICAgICAgICAvLyBvbkJsdXIodGhpcy4kcmVmcy5zZWxlY3QsIGUgPT4geyB0aGlzLnNob3cgPSBmYWxzZSB9KVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcblx0ICAgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdXJsOiBmdW5jdGlvbiB1cmwoKSB7XG5cdCAgICAgIHRoaXMudXJsQ2hhbmdlZCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbGlkOiBmdW5jdGlvbiB2YWxpZCh2YWwsIG9sZCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpc3ZhbGlkJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCghdmFsID8gJ2ludmFsaWQnIDogJ3ZhbGlkJyk7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IHZhbDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblx0XG5cdCAgICAgIGlmIChfdmFsID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IF92YWwgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChfdmFsICE9PSBvbGQpIHtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBfdmFsKTtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIF92YWwpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChfdmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgX3ZhbC5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSBfdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICAgIHRoaXMubm90aWZ5ID0gdHJ1ZTtcblx0ICAgICAgICBpZiAodGltZW91dC5saW1pdCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQubGltaXQpO1xuXHQgICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHRpbWVvdXQubGltaXQgPSBmYWxzZTtcblx0ICAgICAgICAgIF90aGlzNC5ub3RpZnkgPSBmYWxzZTtcblx0ICAgICAgICB9LCAxNTAwKTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBjaGVja0RhdGE6IGZ1bmN0aW9uIGNoZWNrRGF0YSgpIHtcblx0ICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcblx0ICAgICAgICBpZiAodGhpcy5saW1pdCA8IDEpIHtcblx0ICAgICAgICAgIHRoaXMubGltaXQgPSAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHQgICAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkID8gW10gOiBbdGhpcy52YWxdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy52YWxPcHRpb25zO1xuXHQgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgcmV0dXJuIH52YWx1ZXMuaW5kZXhPZihlbCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgaWYgKHRoaXMudmFsdWVzLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGlmICghfnRoaXMudmFsT3B0aW9ucy5pbmRleE9mKHRoaXMudmFsKSkge1xuXHQgICAgICAgICAgdGhpcy52YWwgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcblx0ICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyBbXSA6IG51bGw7XG5cdCAgICAgIHRoaXMudG9nZ2xlKCk7XG5cdCAgICB9LFxuXHQgICAgY2xlYXJTZWFyY2g6IGZ1bmN0aW9uIGNsZWFyU2VhcmNoKCkge1xuXHQgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG5cdCAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgaXNTZWxlY3RlZDogZnVuY3Rpb24gaXNTZWxlY3RlZCh2KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTE7XG5cdCAgICB9LFxuXHQgICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3Qodikge1xuXHQgICAgICBpZiAodGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKTtcblx0ICAgICAgICBpZiAofm5ld1ZhbC5pbmRleE9mKHYpKSB7XG5cdCAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgbmV3VmFsLnB1c2godik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMudmFsID0gbmV3VmFsO1xuXHQgICAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QpIHtcblx0ICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMudmFsID0gdjtcblx0ICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG5cdCAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7XG5cdCAgICAgICAgICByZXR1cm4gZWw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBvYmogPSB7fTtcblx0ICAgICAgICBvYmpbX3RoaXM1Lm9wdGlvbnNMYWJlbF0gPSBlbDtcblx0ICAgICAgICBvYmpbX3RoaXM1Lm9wdGlvbnNWYWx1ZV0gPSBlbDtcblx0ICAgICAgICByZXR1cm4gb2JqO1xuXHQgICAgICB9KTtcblx0ICAgICAgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHRoaXMubGlzdCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkICYmICF0aGlzLnNob3cpIHJldHVybjtcblx0ICAgICAgdGhpcy5zaG93ID0gIXRoaXMuc2hvdztcblx0ICAgICAgaWYgKCF0aGlzLnNob3cpIHRoaXMuJHJlZnMuYnRuLmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdXJsQ2hhbmdlZDogZnVuY3Rpb24gdXJsQ2hhbmdlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMudXJsIHx8ICF0aGlzLiRodHRwKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuJGh0dHAuZ2V0KHRoaXMudXJsKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHQgICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5ID8gcmVzcG9uc2UuZGF0YSA6IFtdO1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblx0ICAgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgICAgIF90aGlzNi5zZXRPcHRpb25zKGRhdGEpO1xuXHQgICAgICAgIF90aGlzNi5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgICAgX3RoaXM2LmNoZWNrRGF0YSgpO1xuXHQgICAgICB9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICBfdGhpczYubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgICB9KTtcblx0ICAgIH0sXG5cdCAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCA/IHRydWUgOiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwubGVuZ3RoID4gMCA6IHRoaXMudmFsICE9PSBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5fc2VsZWN0ID0gdHJ1ZTtcblx0ICAgIGlmICh0aGlzLnZhbCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLnBhcmVudCkge1xuXHQgICAgICB0aGlzLnZhbCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkge1xuXHQgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsWzBdO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jaGVja0RhdGEoKTtcblx0ICAgIGlmICh0aGlzLnVybCkgdGhpcy51cmxDaGFuZ2VkKCk7XG5cdCAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXHQgICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XG5cdCAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5jaGVja0RhdGEoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJjbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1jbGljay1vdXRzaWRlXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNsb3NlKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjbG9zZVwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJzZWxlY3RcIixcblx0ICAgIGNsYXNzOiBfdm0uY2xhc3Nlc1xuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJidG5cIixcblx0ICAgIHN0YXRpY0NsYXNzOiBcImZvcm0tY29udHJvbCBkcm9wZG93bi10b2dnbGVcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFiaW5kZXhcIjogXCIxXCIsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkIHx8ICFfdm0uaGFzUGFyZW50LFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0uY2FuU2VhcmNoID8gbnVsbCA6IF92bS5jbG9zZSgpXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgpXG5cdCAgICAgIH0sXG5cdCAgICAgIFwia2V5ZG93blwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uY2xvc2UoJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInNwYWNlXCIsIDMyKSkgeyByZXR1cm47IH1cblx0ICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfV1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYnRuLWNvbnRlbnRcIixcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhfdm0ubG9hZGluZyA/IF92bS50ZXh0LmxvYWRpbmcgOiBfdm0uc2hvd1BsYWNlaG9sZGVyIHx8IChfdm0ubXVsdGlwbGUgJiYgX3ZtLnNob3dDb3VudCA/IF92bS5zZWxlY3RlZFRleHQgOiBfdm0uc2VsZWN0ZWQpKVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWx1ZXMubGVuZ3RoKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jbGVhcigpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc2VsZWN0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VsXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJzZWNyZXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJtdWx0aXBsZVwiOiBfdm0ubXVsdGlwbGUsXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNoYW5nZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucywgZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgcmV0dXJuIG8uc2VsZWN0ZWRcblx0ICAgICAgICB9KS5tYXAoZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgdmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTtcblx0ICAgICAgICAgIHJldHVybiB2YWxcblx0ICAgICAgICB9KVswXVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ucmVxdWlyZWQpID8gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInZhbHVlXCI6IFwiXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2woKF92bS5saXN0KSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJ2YWx1ZVwiOiBvcHRpb25bX3ZtLm9wdGlvbnNWYWx1ZV1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3Mob3B0aW9uW192bS5vcHRpb25zTGFiZWxdKSldKVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbKF92bS5saXN0Lmxlbmd0aCkgPyBbKF92bS5jYW5TZWFyY2gpID8gX3ZtLl9jKCdsaScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLXNlYXJjaGJveFwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VhcmNoXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0uc2VhcmNoVGV4dCB8fCBfdm0udGV4dC5zZWFyY2gsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0uc2VhcmNoVmFsdWUpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmNsb3NlKCRldmVudClcblx0ICAgICAgfSxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNlYXJjaFZhbHVlID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xlYXJTZWFyY2hcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0ucmVxdWlyZWQgJiYgIV92bS5jbGVhckJ1dHRvbikgPyBfdm0uX2MoJ2xpJywgW192bS5fYygnYScsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbGVhcigpICYmIF92bS5jbG9zZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ucGxhY2Vob2xkZXIgfHwgX3ZtLnRleHQubm90U2VsZWN0ZWQpKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9sKChfdm0uZmlsdGVyZWRPcHRpb25zKSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcImlkXCI6IG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uc2VsZWN0KG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKG9wdGlvbltfdm0ub3B0aW9uc0xhYmVsXSlcblx0ICAgICAgfVxuXHQgICAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICAgIHZhbHVlOiAoX3ZtLmlzU2VsZWN0ZWQob3B0aW9uW192bS5vcHRpb25zVmFsdWVdKSksXG5cdCAgICAgICAgZXhwcmVzc2lvbjogXCJpc1NlbGVjdGVkKG9wdGlvbltvcHRpb25zVmFsdWVdKVwiXG5cdCAgICAgIH1dLFxuXHQgICAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcIlxuXHQgICAgfSldKV0pXG5cdCAgfSldIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmICFfdm0uY2xvc2VPblNlbGVjdCkgPyBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogXCJmYWRlaW5cIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5vdGlmeSBpblwiXG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKSA6IF92bS5fZSgpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmIF92bS5jbG9zZU9uU2VsZWN0KSA/IF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVpblwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibm90aWZ5IG91dFwiXG5cdCAgfSwgW192bS5fYygnZGl2JywgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKV0pIDogX3ZtLl9lKCldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1lNTE0ZGJjNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNsaWRlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIxODViODJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMTg1YjgyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gU2xpZGVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC4kY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LmluZGV4ID09PSB0aGlzLmluZGV4O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuaW5kaWNhdG9yX2xpc3QpIHtcblx0ICAgICAgdGhpcy4kcGFyZW50LmluZGljYXRvcl9saXN0LnB1c2godGhpcy5pbmRleCk7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKHRoaXMuaW5kZXggPT09IDApIHtcblx0ICAgICAgdGhpcy4kZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIml0ZW1cIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIxODViODJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTYyKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTY0KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxTcGlubmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi04YjI5OGU3MFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtOGIyOThlNzBcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTcGlubmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYzKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi04YjI5OGU3MCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU3Bpbm5lci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LThiMjk4ZTcwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TcGlubmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE2MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5Aa2V5ZnJhbWVzIHNwaW4ge1xcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbn1cXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXG59XFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvU3Bpbm5lci52dWU/NjVmYzVhOGZcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJGQTtBQUNBO0lBQ0EsMEJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLGlDQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLDRCQUFBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLDRCQUFBO0VBQ0Esb0NBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsNklBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGFBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtDQUNBXCIsXCJmaWxlXCI6XCJTcGlubmVyLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLHNwaW5uZXJTaXplLHsnc3Bpbm5lci1maXhlZCc6Zml4ZWR9XVxcXCIgdi1zaG93PVxcXCJhY3RpdmV8fGxvY2tlZFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItd3JhcHBlclxcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3Bpbm5lci1jaXJjbGVcXFwiPjwvZGl2PlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItdGV4dFxcXCI+e3t0ZXh0fX08L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuY29uc3QgTUlOX1dBSVQgPSA1MDAgLy8gaW4gbXNcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBmaXhlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZ2xvYmFsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBzaXplOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbWQnfSxcXHJcXG4gICAgdGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcXHJcXG4gICAgICBsb2NrZWQ6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBzcGlubmVyU2l6ZSAoKSB7IHJldHVybiAnc3Bpbm5lci0nICsgKHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZSA6ICdzbScpIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBhY3RpdmUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7IHRoaXNbdmFsID8gJ3Nob3cnIDogJ2hpZGUnXSgpIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaGlkZSAoKSB7XFxyXFxuICAgICAgdmFyIGRlbGF5ID0gMFxcclxcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAob3B0aW9ucykge1xcclxcbiAgICAgIGlmIChvcHRpb25zKSB7XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy50ZXh0KSB7IHRoaXMudGV4dCA9IG9wdGlvbnMudGV4dCB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7IHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZSB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5maXhlZCkgeyB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZCB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIC8vIGJsb2NrIHNjcm9sbGluZyB3aGVuIHNwaW5uZXIgaXMgb25cXHJcXG4gICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nXFxyXFxuICAgICAgLy8gYWN0aXZhdGUgc3Bpbm5lclxcclxcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpXFxyXFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5fdW5sb2NrKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9ib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WVxcclxcbiAgICB0aGlzLl91bmxvY2sgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gICAgfSwgTUlOX1dBSVQpXFxyXFxuICAgIGlmICh0aGlzLmdsb2JhbCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lcikge1xcclxcbiAgICAgICAgdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lciA9IHRydWVcXHJcXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xcclxcbiAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xcclxcbiAgICAgICAgICBoaWRlICgpIHsgc2VsZi5oaWRlKCkgfSxcXHJcXG4gICAgICAgICAgc2hvdyAoKSB7IHNlbGYuc2hvdygpIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuJHJvb3QuJG9uKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fZ2xvYmFsKSB7XFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpoaWRlJywgdGhpcy5fZ2xvYmFsLmhpZGUpXFxyXFxuICAgICAgZGVsZXRlIHRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXJcXHJcXG4gICAgfVxcclxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc3Bpbm5lckFuaW1hdGlvbilcXHJcXG4gICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbkBrZXlmcmFtZXMgc3BpbiB7XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXHJcXG59XFxyXFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIE1JTl9XQUlUID0gNTAwOyAvLyBpbiBtc1xuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZml4ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGdsb2JhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdtZCcgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcblx0ICAgICAgbG9ja2VkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgc3Bpbm5lclNpemU6IGZ1bmN0aW9uIHNwaW5uZXJTaXplKCkge1xuXHQgICAgICByZXR1cm4gJ3NwaW5uZXItJyArICh0aGlzLnNpemUgPyB0aGlzLnNpemUgOiAnc20nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpc1t2YWwgPyAnc2hvdycgOiAnaGlkZSddKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG5cdCAgICAgIHZhciBkZWxheSA9IDA7XG5cdCAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyhvcHRpb25zKSB7XG5cdCAgICAgIGlmIChvcHRpb25zKSB7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGV4dCkge1xuXHQgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG5cdCAgICAgICAgICB0aGlzLnNpemUgPSBvcHRpb25zLnNpemU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChvcHRpb25zLmZpeGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgLy8gYmxvY2sgc2Nyb2xsaW5nIHdoZW4gc3Bpbm5lciBpcyBvblxuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuXHQgICAgICAvLyBhY3RpdmF0ZSBzcGlubmVyXG5cdCAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdCAgICAgIHRoaXMubG9ja2VkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fdW5sb2NrKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WTtcblx0ICAgIHRoaXMuX3VubG9jayA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9IHRoaXMuX2JvZHlPdmVyZmxvdztcblx0ICAgIH0sIE1JTl9XQUlUKTtcblx0ICAgIGlmICh0aGlzLmdsb2JhbCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXIpIHtcblx0ICAgICAgICB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xuXHQgICAgICAgICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcblx0ICAgICAgICAgICAgc2VsZi5oaWRlKCk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgICAgICAgc2VsZi5zaG93KCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6c2hvdycsIHRoaXMuX2dsb2JhbC5zaG93KTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9nbG9iYWwpIHtcblx0ICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpO1xuXHQgICAgICB0aGlzLiRyb290LiRvZmYoJ3NwaW5uZXI6OmhpZGUnLCB0aGlzLl9nbG9iYWwuaGlkZSk7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyO1xuXHQgICAgfVxuXHQgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NwaW5uZXJBbmltYXRpb24pO1xuXHQgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3c7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5hY3RpdmUgfHwgX3ZtLmxvY2tlZCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiYWN0aXZlfHxsb2NrZWRcIlxuXHQgICAgfV0sXG5cdCAgICBjbGFzczogWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLCBfdm0uc3Bpbm5lclNpemUsIHtcblx0ICAgICAgJ3NwaW5uZXItZml4ZWQnOiBfdm0uZml4ZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci13cmFwcGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzcGlubmVyLWNpcmNsZVwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci10ZXh0XCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LThiMjk4ZTcwXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFiLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0wOTg1ZTg3OFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMDk4NWU4NzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBUYWIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGZhZGVpbjogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIGFjdGl2ZSA9ICF0aGlzLl90YWJzIHx8IHRoaXMuX3RhYnMuc2hvdyA9PT0gdGhpcztcblx0ICAgICAgdGhpcy5mYWRlaW4gPSBmYWxzZTtcblx0ICAgICAgaWYgKGFjdGl2ZSkge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMuZmFkZWluID0gdHJ1ZTtcblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYWN0aXZlO1xuXHQgICAgfSxcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3RhYnMudGFicy5pbmRleE9mKHRoaXMpO1xuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl90YWJzID8gdGhpcy5fdGFicy5lZmZlY3QgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiID0gdHJ1ZTtcblx0ICAgIHZhciB0YWJzID0gdGhpcztcblx0ICAgIHdoaWxlICghdGhpcy5fdGFicyAmJiB0YWJzLiRwYXJlbnQpIHtcblx0ICAgICAgaWYgKHRhYnMuX2lzVGFiR3JvdXApIHtcblx0ICAgICAgICB0YWJzLnRhYnMucHVzaCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl90YWJHcm91cCA9IHRhYnM7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRhYnMuX2lzVGFicykge1xuXHQgICAgICAgIHRhYnMudGFicy5wdXNoKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3RhYnMgPSB0YWJzO1xuXHQgICAgICAgIGlmICghdGhpcy5fdGFiR3JvdXApIHRhYnMuaGVhZGVycy5wdXNoKHRoaXMpO1xuXHQgICAgICB9XG5cdCAgICAgIHRhYnMgPSB0YWJzLiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuX3RhYnMpIHRocm93IEVycm9yKCd0YWIgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgaWYgKHRoaXMuX3RhYkdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX3RhYkdyb3VwLnRhYnMgPSB0aGlzLl90YWJHcm91cC50YWJzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwgIT09IF90aGlzMjtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB0aGlzLl90YWJzLnRhYnMgPSB0aGlzLl90YWJzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbCAhPT0gX3RoaXMyO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl90YWJzKSB7XG5cdCAgICAgIGlmICh0aGlzLl90YWJzLmFjdGl2ZSA9PT0gdGhpcy5pbmRleCkge1xuXHQgICAgICAgIHRoaXMuX3RhYnMuaW5kZXggPSAwO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbmdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy4kcGFyZW50LnRhYnMuaW5kZXhPZih0aGlzKTtcblx0ICAgICAgICBpZiAofmlkKSB0aGlzLiRwYXJlbnQudGFicy5zcGxpY2UoaWQsIDEpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB2YXIgX2lkID0gdGhpcy5fdGFicy50YWJzLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIGlmICh+X2lkKSB0aGlzLl90YWJzLnRhYnMuc3BsaWNlKF9pZCwgMSk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwYW5lbFwiLFxuXHQgICAgY2xhc3M6IFsndGFiLXBhbmUnLCB7XG5cdCAgICAgICdhY3RpdmUgZmFkZSc6IF92bS5hY3RpdmUsXG5cdCAgICAgICdpbic6IF92bS5mYWRlaW5cblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwidGFicGFuZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMDk4NWU4NzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTcwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTcyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Mylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUYWJHcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNTVmYWYzY2JcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTU1ZmFmM2NiXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFiR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnRhYi1jb250ZW50IC50YWItcGFuZSB7IGRpc3BsYXk6IG5vbmU7XFxufVxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVGFiR3JvdXAudnVlPzIyYWUxYzA4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrQ0EseUJBQUEsY0FBQTtDQUFBO0FBQ0EsZ0NBQUEsZUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJUYWJHcm91cC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPjxzcGFuPjxzbG90Pjwvc2xvdD48L3NwYW4+PC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgdGFiczogW11cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGFjdGl2ZSAoKSB7IHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KSB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBibHVyICgpIHsgdGhpcy5zaG93ID0gZmFsc2UgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHsgdGhpcy5zaG93ID0gIXRoaXMuc2hvdyB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLiRwYXJlbnQpIHtcXHJcXG4gICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFxcXCd0IG5lc3QgdGFiLWdyb3Vwcy4nKVxcclxcbiAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJylcXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHRoaXMuX3RhYnMuaGVhZGVycy5wdXNoKHRoaXMpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4udGFiLWNvbnRlbnQgLnRhYi1wYW5lIHsgZGlzcGxheTogbm9uZTsgfVxcclxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7IH1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTcyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHNob3c6IGZhbHNlLFxuXHQgICAgICB0YWJzOiBbXVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUoKSB7XG5cdCAgICAgIHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuJHBhcmVudCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFwndCBuZXN0IHRhYi1ncm91cHMuJyk7XG5cdCAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50O1xuXHQgICAgdGhpcy5fdGFicy5oZWFkZXJzLnB1c2godGhpcyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTU1ZmFmM2NiXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFicy52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzAxMDBkZGZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTcwMTAwZGRmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFicy52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzAxMDBkZGYhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1RhYnMudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi03MDEwMGRkZiEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vVGFicy52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1RhYnMudnVlPzQzMTdiOWFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUEwRUE7RUFDQSxlQUFBO0NBQ0FcIixcImZpbGVcIjpcIlRhYnMudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgdGFicz5cXHJcXG4gICAgPHVsIDpjbGFzcz1cXFwibmF2U3R5bGVDbGFzc1xcXCIgcm9sZT1cXFwidGFibGlzdFxcXCI+XFxyXFxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCJoZWFkZXIgaW4gaGVhZGVyc1xcXCI+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwiaGVhZGVyLl9pc1RhYlxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmhlYWRlci5hY3RpdmUsIGRpc2FibGVkOmhlYWRlci5kaXNhYmxlZH1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QoaGVhZGVyKVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGEgaHJlZj1cXFwiI1xcXCIgdi1odG1sPVxcXCJoZWFkZXIuaGVhZGVyXFxcIj48L2E+PC9zbG90PlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICAgIDxkcm9wZG93biB2LWlmPVxcXCJoZWFkZXIuX2lzVGFiR3JvdXBcXFwiIDp0ZXh0PVxcXCJoZWFkZXIuaGVhZGVyXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aGVhZGVyLmFjdGl2ZX1cXFwiIDpkaXNhYmxlZD1cXFwiaGVhZGVyLmRpc2FibGVkXFxcIj5cXHJcXG4gICAgICAgICAgPGxpIHYtZm9yPVxcXCJ0YWIgaW4gaGVhZGVyLnRhYnNcXFwiIDpjbGFzcz1cXFwie2Rpc2FibGVkOnRhYi5kaXNhYmxlZH1cXFwiPjxhIGhyZWY9XFxcIiNcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QodGFiKVxcXCI+e3t0YWIuaGVhZGVyfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDwvZHJvcGRvd24+XFxyXFxuICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPC91bD5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwidGFiLWNvbnRlbnRcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZX0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnLi9Ecm9wZG93bi52dWUnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgY29tcG9uZW50czoge1xcclxcbiAgICBkcm9wZG93blxcclxcbiAgfSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIC8vIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2ZhZGVpbid9LFxcclxcbiAgICBqdXN0aWZpZWQ6IGZhbHNlLFxcclxcbiAgICBuYXZTdHlsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgaW5kZXggPSB0aGlzLnZhbHVlIHx8IDBcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRleCxcXHJcXG4gICAgICBoZWFkZXJzOiBbXSxcXHJcXG4gICAgICB0YWJzOiBbXVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKHZhbCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2FjdGl2ZScsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMuaW5kZXggPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG5hdlN0eWxlQ2xhc3MgKCkge1xcclxcbiAgICAgIHJldHVybiBbXFxyXFxuICAgICAgICAnbmF2JyxcXHJcXG4gICAgICAgIH5bJ3BpbGxzJywgJ3N0YWNrZWQnXS5pbmRleE9mKHRoaXMubmF2U3R5bGUpID8gJ25hdi0nICsgdGhpcy5uYXZTdHlsZSA6ICduYXYtdGFicycsXFxyXFxuICAgICAgICB7XFxyXFxuICAgICAgICAgICduYXYtanVzdGlmaWVkJzogY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxcclxcbiAgICAgICAgICAnbmF2LXBpbGxzJzogdGhpcy5uYXZTdHlsZSA9PT0gJ3N0YWNrZWQnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgXVxcclxcbiAgICB9LFxcclxcbiAgICBzaG93ICgpIHsgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF0gfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2VsZWN0ICh0YWIpIHtcXHJcXG4gICAgICBpZiAoIXRhYi5kaXNhYmxlZCkge1xcclxcbiAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHRhYilcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5faXNUYWJzID0gdHJ1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTc3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfRHJvcGRvd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNSk7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGNvbXBvbmVudHM6IHtcblx0ICAgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICAvLyBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlaW4nfSxcblx0ICAgIGp1c3RpZmllZDogZmFsc2UsXG5cdCAgICBuYXZTdHlsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIGluZGV4ID0gdGhpcy52YWx1ZSB8fCAwO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kZXg6IGluZGV4LFxuXHQgICAgICBoZWFkZXJzOiBbXSxcblx0ICAgICAgdGFiczogW11cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCh2YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnYWN0aXZlJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy5pbmRleCA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBuYXZTdHlsZUNsYXNzOiBmdW5jdGlvbiBuYXZTdHlsZUNsYXNzKCkge1xuXHQgICAgICByZXR1cm4gWyduYXYnLCB+WydwaWxscycsICdzdGFja2VkJ10uaW5kZXhPZih0aGlzLm5hdlN0eWxlKSA/ICduYXYtJyArIHRoaXMubmF2U3R5bGUgOiAnbmF2LXRhYnMnLCB7XG5cdCAgICAgICAgJ25hdi1qdXN0aWZpZWQnOiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxuXHQgICAgICAgICduYXYtcGlsbHMnOiB0aGlzLm5hdlN0eWxlID09PSAnc3RhY2tlZCdcblx0ICAgICAgfV07XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF07XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdCh0YWIpIHtcblx0ICAgICAgaWYgKCF0YWIuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFicyA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFic1wiOiBcIlwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBjbGFzczogX3ZtLm5hdlN0eWxlQ2xhc3MsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJ0YWJsaXN0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9sKChfdm0uaGVhZGVycyksIGZ1bmN0aW9uKGhlYWRlcikge1xuXHQgICAgcmV0dXJuIFsoaGVhZGVyLl9pc1RhYikgPyBfdm0uX2MoJ2xpJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZSwgZGlzYWJsZWQ6IGhlYWRlci5kaXNhYmxlZFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIF92bS5zZWxlY3QoaGVhZGVyKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhoZWFkZXIuaGVhZGVyKVxuXHQgICAgICB9XG5cdCAgICB9KV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKGhlYWRlci5faXNUYWJHcm91cCkgPyBfdm0uX2MoJ2Ryb3Bkb3duJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZVxuXHQgICAgICB9LFxuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwidGV4dFwiOiBoZWFkZXIuaGVhZGVyLFxuXHQgICAgICAgIFwiZGlzYWJsZWRcIjogaGVhZGVyLmRpc2FibGVkXG5cdCAgICAgIH1cblx0ICAgIH0sIF92bS5fbCgoaGVhZGVyLnRhYnMpLCBmdW5jdGlvbih0YWIpIHtcblx0ICAgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAgIGRpc2FibGVkOiB0YWIuZGlzYWJsZWRcblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICAgICAgYXR0cnM6IHtcblx0ICAgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb246IHtcblx0ICAgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICBfdm0uc2VsZWN0KHRhYilcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX3YoX3ZtLl9zKHRhYi5oZWFkZXIpKV0pXSlcblx0ICAgIH0pKSA6IF92bS5fZSgpXVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwidGFiLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03MDEwMGRkZlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE3OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvZ2dsZUJ1dHRvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZjAzNGE1ZjJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWYwMzRhNWYyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVG9nZ2xlQnV0dG9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGZhbHNlVHlwZTogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBuYW1lOiBudWxsLFxuXHQgICAgcmVhZG9ubHk6IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHJ1ZVR5cGU6IHsgZGVmYXVsdDogJ3ByaW1hcnknIH0sXG5cdCAgICB2YWx1ZTogZmFsc2Vcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhY3RpdmU6IF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLnZhbHVlKSxcblx0ICAgICAgdHlwZXM6IHtcblx0ICAgICAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcblx0ICAgICAgICBpbmZvOiAnYnRuLWluZm8nLFxuXHQgICAgICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG5cdCAgICAgICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcblx0ICAgICAgICB3YXJuaW5nOiAnYnRuLXdhcm5pbmcnXG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZWQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQodmFsID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJyk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuYWN0aXZlID0gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMudmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYm9vbERpc2FibGVkOiBmdW5jdGlvbiBib29sRGlzYWJsZWQoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5kaXNhYmxlZCk7XG5cdCAgICB9LFxuXHQgICAgYm9vbFJlYWRvbmx5OiBmdW5jdGlvbiBib29sUmVhZG9ubHkoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5yZWFkb25seSk7XG5cdCAgICB9LFxuXHQgICAgdHlwZTogZnVuY3Rpb24gdHlwZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZXNbdGhpcy52YWx1ZSA/IHRoaXMudHJ1ZVR5cGUgOiB0aGlzLmZhbHNlVHlwZV0gfHwgJ2J0bi1kZWZhdWx0Jztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5ib29sRGlzYWJsZWQgfHwgdGhpcy5ib29sUmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG5cdCAgICB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTgxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2EnLCB7XG5cdCAgICBjbGFzczogWydidG4nLCBfdm0udHlwZSwge1xuXHQgICAgICByZWFkb25seTogX3ZtLmJvb2xSZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImhyZWZcIjogXCJqYXZhc2NyaXB0OnZvaWQoMClcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uYm9vbERpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2dseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsdWUgPyAnb2snIDogJ3JlbW92ZScpXVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5hY3RpdmUgPyAxIDogMFxuXHQgICAgfVxuXHQgIH0pIDogX3ZtLl9lKCldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mMDM0YTVmMlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxODMpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvb2x0aXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQ4ZmI1MWIyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00OGZiNTFiMlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFRvb2x0aXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ4ZmI1MWIyIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Ub29sdGlwLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDhmYjUxYjIhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1Rvb2x0aXAudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXG59XFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXG59XFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXG59XFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcbjAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG59XFxuQGtleWZyYW1lcyBmYWRlaW4tb3V0IHtcXG4wJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVG9vbHRpcC52dWU/MzdkMTgzZWNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJCQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlRvb2x0aXAudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWyd0b29sdGlwJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInRvb2x0aXAtYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1pbm5lclxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImNvbnRlbnRcXFwiPjxkaXYgdi1odG1sPVxcXCJjb250ZW50XFxcIj48L2Rpdj48L3Nsb3Q+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC90cmFuc2l0aW9uPlxcclxcbiAgPC9zcGFuPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgUG9wb3Zlck1peGluIGZyb20gJy4vdXRpbHMvcG9wb3Zlck1peGlucy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBtaXhpbnM6IFtQb3BvdmVyTWl4aW5dLFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgZWZmZWN0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnfSxcXHJcXG4gICAgdHJpZ2dlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJ31cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG59XFxyXFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXHJcXG59XFxyXFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIGZhZGVpbi1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAuOTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTg1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGlucyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQzKTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3BvdmVyTWl4aW5zKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgbWl4aW5zOiBbX3BvcG92ZXJNaXhpbnMyLmRlZmF1bHRdLFxuXHQgIHByb3BzOiB7XG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJyB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWyd0b29sdGlwJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWlubmVyXCJcblx0ICB9LCBbX3ZtLl90KFwiY29udGVudFwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDhmYjUxYjJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTg4KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNilcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUeXBlYWhlYWQudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTViNWY1ZTk0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01YjVmNWU5NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFR5cGVhaGVhZC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4OSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNWI1ZjVlOTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1R5cGVhaGVhZC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTViNWY1ZTk0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UeXBlYWhlYWQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9UeXBlYWhlYWQudnVlPzczZmNkNGJlXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrSUE7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJUeXBlYWhlYWQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgc3R5bGU9XFxcInBvc2l0aW9uOiByZWxhdGl2ZVxcXCIgOmNsYXNzPVxcXCJ7b3BlbjpzaG93RHJvcGRvd259XFxcIj5cXHJcXG4gICAgPGlucHV0IGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIlxcclxcbiAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICA6cGxhY2Vob2xkZXI9XFxcInBsYWNlaG9sZGVyXFxcIlxcclxcbiAgICAgIDp0eXBlLm9uY2U9XFxcInR5cGVcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcInNob3dEcm9wZG93biA9IGZhbHNlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmRvd24ucHJldmVudD1cXFwiZG93blxcXCJcXHJcXG4gICAgICBAa2V5ZG93bi5lbnRlcj1cXFwiaGl0XFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmVzYz1cXFwicmVzZXRcXFwiXFxyXFxuICAgICAgQGtleWRvd24udXAucHJldmVudD1cXFwidXBcXFwiXFxyXFxuICAgIC8+XFxyXFxuICAgIDx1bCBjbGFzcz1cXFwiZHJvcGRvd24tbWVudVxcXCIgcmVmPVxcXCJkcm9wZG93blxcXCI+XFxyXFxuICAgICAgPGxpIHYtZm9yPVxcXCIoaXRlbSwgaSkgaW4gaXRlbXNcXFwiIDpjbGFzcz1cXFwie2FjdGl2ZTogaXNBY3RpdmUoaSl9XFxcIj5cXHJcXG4gICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwiaGl0XFxcIiBAbW91c2Vtb3ZlPVxcXCJzZXRBY3RpdmUoaSlcXFwiPlxcclxcbiAgICAgICAgICA8Y29tcG9uZW50IDppcz1cXFwidGVtcGxhdGVDb21wXFxcIiA6aXRlbT1cXFwiaXRlbVxcXCI+PC9jb21wb25lbnQ+XFxyXFxuICAgICAgICA8L2E+XFxyXFxuICAgICAgPC9saT5cXHJcXG4gICAgPC91bD5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2RlbGF5ZXIsIGdldEpTT059IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYXN5bmM6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBkYXRhOiB7dHlwZTogQXJyYXl9LFxcclxcbiAgICBkZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogREVMQVl9LFxcclxcbiAgICBhc3luY0tleToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxpbWl0OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiA4fSxcXHJcXG4gICAgbWF0Y2hDYXNlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBtYXRjaFN0YXJ0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBvbkhpdDoge1xcclxcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxcclxcbiAgICAgIGRlZmF1bHQgKGl0ZW0pIHsgcmV0dXJuIGl0ZW0gfVxcclxcbiAgICB9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHRlbXBsYXRlOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnfSxcXHJcXG4gICAgdmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFzaWduOiAnJyxcXHJcXG4gICAgICBzaG93RHJvcGRvd246IGZhbHNlLFxcclxcbiAgICAgIG5vUmVzdWx0czogdHJ1ZSxcXHJcXG4gICAgICBjdXJyZW50OiAwLFxcclxcbiAgICAgIGl0ZW1zOiBbXSxcXHJcXG4gICAgICB2YWw6IHRoaXMudmFsdWVcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIHRlbXBsYXRlQ29tcCAoKSB7XFxyXFxuICAgICAgcmV0dXJuIHtcXHJcXG4gICAgICAgIHRlbXBsYXRlOiB0eXBlb2YgdGhpcy50ZW1wbGF0ZSA9PT0gJ3N0cmluZycgPyAnPHNwYW4+JyArIHRoaXMudGVtcGxhdGUgKyAnPC9zcGFuPicgOiAnPHN0cm9uZyB2LWh0bWw9XFxcIml0ZW1cXFwiPjwvc3Ryb25nPicsXFxyXFxuICAgICAgICBwcm9wczogeyBpdGVtOiB7ZGVmYXVsdDogbnVsbH0gfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQgJiYgdmFsICE9PSB0aGlzLmFzaWduKSB0aGlzLl9fdXBkYXRlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7IHRoaXMudmFsID0gdmFsIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2V0SXRlbXMgKGRhdGEpIHtcXHJcXG4gICAgICBpZiAodGhpcy5hc3luYykge1xcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuYXN5bmNLZXkgPyBkYXRhW3RoaXMuYXN5bmNLZXldIDogZGF0YVxcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5pdGVtcyA9IChkYXRhIHx8IFtdKS5maWx0ZXIodmFsdWUgPT4ge1xcclxcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgeyByZXR1cm4gdHJ1ZSB9XFxyXFxuICAgICAgICAgIHZhbHVlID0gdGhpcy5tYXRjaENhc2UgPyB2YWx1ZSA6IHZhbHVlLnRvTG93ZXJDYXNlKClcXHJcXG4gICAgICAgICAgdmFyIHF1ZXJ5ID0gdGhpcy5tYXRjaENhc2UgPyB0aGlzLnZhbCA6IHRoaXMudmFsLnRvTG93ZXJDYXNlKClcXHJcXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hTdGFydCA/IHZhbHVlLmluZGV4T2YocXVlcnkpID09PSAwIDogdmFsdWUuaW5kZXhPZihxdWVyeSkgIT09IC0xXFxyXFxuICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KVxcclxcbiAgICAgIH1cXHJcXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMFxcclxcbiAgICB9LFxcclxcbiAgICBzZXRWYWx1ZSAodmFsdWUpIHtcXHJcXG4gICAgICB0aGlzLmFzaWduID0gdmFsdWVcXHJcXG4gICAgICB0aGlzLnZhbCA9IHZhbHVlXFxyXFxuICAgICAgdGhpcy5pdGVtcyA9IFtdXFxyXFxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIHJlc2V0ICgpIHsgdGhpcy5zZXRWYWx1ZShudWxsKSB9LFxcclxcbiAgICBzZXRBY3RpdmUgKGluZGV4KSB7IHRoaXMuY3VycmVudCA9IGluZGV4IH0sXFxyXFxuICAgIGlzQWN0aXZlIChpbmRleCkgeyByZXR1cm4gdGhpcy5jdXJyZW50ID09PSBpbmRleCB9LFxcclxcbiAgICBoaXQgKGUpIHtcXHJcXG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcXHJcXG4gICAgICB0aGlzLnNldFZhbHVlKHRoaXMub25IaXQodGhpcy5pdGVtc1t0aGlzLmN1cnJlbnRdLCB0aGlzKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdXAgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQgPiAwKSB7IHRoaXMuY3VycmVudC0tIH1cXHJcXG4gICAgICBlbHNlIHsgdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgZG93biAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkgeyB0aGlzLmN1cnJlbnQrKyB9XFxyXFxuICAgICAgZWxzZSB7IHRoaXMuY3VycmVudCA9IDAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX191cGRhdGUgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMudmFsKSB7XFxyXFxuICAgICAgICB0aGlzLnJlc2V0KClcXHJcXG4gICAgICAgIHJldHVyblxcclxcbiAgICAgIH1cXHJcXG4gICAgICB0aGlzLmFzaWduID0gJydcXHJcXG4gICAgICBpZiAodGhpcy5hc3luYykge1xcclxcbiAgICAgICAgZ2V0SlNPTih0aGlzLmFzeW5jICsgdGhpcy52YWwpLnRoZW4oZGF0YSA9PiB7XFxyXFxuICAgICAgICAgIHRoaXMuc2V0SXRlbXMoZGF0YSlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEpIHtcXHJcXG4gICAgICAgIHRoaXMuc2V0SXRlbXModGhpcy5kYXRhKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSwgJ2RlbGF5JywgREVMQVkpXFxyXFxuICAgIHRoaXMuX191cGRhdGUoKVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuLmRyb3Bkb3duLW1lbnUgPiBsaSA+IGEge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTkwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdHlwZW9mMiA9IF9fd2VicGFja19yZXF1aXJlX18oMTkxKTtcblx0XG5cdHZhciBfdHlwZW9mMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3R5cGVvZjIpO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdHZhciBERUxBWSA9IDMwMDsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYXN5bmM6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBkYXRhOiB7IHR5cGU6IEFycmF5IH0sXG5cdCAgICBkZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IERFTEFZIH0sXG5cdCAgICBhc3luY0tleTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogOCB9LFxuXHQgICAgbWF0Y2hDYXNlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBtYXRjaFN0YXJ0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBvbkhpdDoge1xuXHQgICAgICB0eXBlOiBGdW5jdGlvbixcblx0ICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoaXRlbSkge1xuXHQgICAgICAgIHJldHVybiBpdGVtO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0ZW1wbGF0ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCcgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJycgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFzaWduOiAnJyxcblx0ICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcblx0ICAgICAgbm9SZXN1bHRzOiB0cnVlLFxuXHQgICAgICBjdXJyZW50OiAwLFxuXHQgICAgICBpdGVtczogW10sXG5cdCAgICAgIHZhbDogdGhpcy52YWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgdGVtcGxhdGVDb21wOiBmdW5jdGlvbiB0ZW1wbGF0ZUNvbXAoKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdGVtcGxhdGU6IHR5cGVvZiB0aGlzLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/ICc8c3Bhbj4nICsgdGhpcy50ZW1wbGF0ZSArICc8L3NwYW4+JyA6ICc8c3Ryb25nIHYtaHRtbD1cIml0ZW1cIj48L3N0cm9uZz4nLFxuXHQgICAgICAgIHByb3BzOiB7IGl0ZW06IHsgZGVmYXVsdDogbnVsbCB9IH1cblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCAmJiBfdmFsICE9PSB0aGlzLmFzaWduKSB0aGlzLl9fdXBkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZXRJdGVtczogZnVuY3Rpb24gc2V0SXRlbXMoZGF0YSkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcblx0ICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5hc3luY0tleSA/IGRhdGFbdGhpcy5hc3luY0tleV0gOiBkYXRhO1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkodmFsdWUpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB2YWx1ZSA9IF90aGlzLm1hdGNoQ2FzZSA/IHZhbHVlIDogdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICAgIHZhciBxdWVyeSA9IF90aGlzLm1hdGNoQ2FzZSA/IF90aGlzLnZhbCA6IF90aGlzLnZhbC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMTtcblx0ICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMDtcblx0ICAgIH0sXG5cdCAgICBzZXRWYWx1ZTogZnVuY3Rpb24gc2V0VmFsdWUodmFsdWUpIHtcblx0ICAgICAgdGhpcy5hc2lnbiA9IHZhbHVlO1xuXHQgICAgICB0aGlzLnZhbCA9IHZhbHVlO1xuXHQgICAgICB0aGlzLml0ZW1zID0gW107XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy5zZXRWYWx1ZShudWxsKTtcblx0ICAgIH0sXG5cdCAgICBzZXRBY3RpdmU6IGZ1bmN0aW9uIHNldEFjdGl2ZShpbmRleCkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQgPSBpbmRleDtcblx0ICAgIH0sXG5cdCAgICBpc0FjdGl2ZTogZnVuY3Rpb24gaXNBY3RpdmUoaW5kZXgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY3VycmVudCA9PT0gaW5kZXg7XG5cdCAgICB9LFxuXHQgICAgaGl0OiBmdW5jdGlvbiBoaXQoZSkge1xuXHQgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5vbkhpdCh0aGlzLml0ZW1zW3RoaXMuY3VycmVudF0sIHRoaXMpKTtcblx0ICAgIH0sXG5cdCAgICB1cDogZnVuY3Rpb24gdXAoKSB7XG5cdCAgICAgIGlmICh0aGlzLmN1cnJlbnQgPiAwKSB7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50LS07XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZG93bjogZnVuY3Rpb24gZG93bigpIHtcblx0ICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkge1xuXHQgICAgICAgIHRoaXMuY3VycmVudCsrO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuY3VycmVudCA9IDA7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9fdXBkYXRlID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnZhbCkge1xuXHQgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hc2lnbiA9ICcnO1xuXHQgICAgICBpZiAodGhpcy5hc3luYykge1xuXHQgICAgICAgICgwLCBfdXRpbHMuZ2V0SlNPTikodGhpcy5hc3luYyArIHRoaXMudmFsKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICBfdGhpczIuc2V0SXRlbXMoZGF0YSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG5cdCAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpO1xuXHQgICAgICB9XG5cdCAgICB9LCAnZGVsYXknLCBERUxBWSk7XG5cdCAgICB0aGlzLl9fdXBkYXRlKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHR2YXIgX2l0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cdFxuXHR2YXIgX2l0ZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2l0ZXJhdG9yKTtcblx0XG5cdHZhciBfc3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTIpO1xuXHRcblx0dmFyIF9zeW1ib2wyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltYm9sKTtcblx0XG5cdHZhciBfdHlwZW9mID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgX2l0ZXJhdG9yMi5kZWZhdWx0ID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mKF9pdGVyYXRvcjIuZGVmYXVsdCkgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG5cdCAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xuXHR9IDogZnVuY3Rpb24gKG9iaikge1xuXHQgIHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5MyksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDE5MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxOTQpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMyk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjA0KTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMDUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNykuU3ltYm9sO1xuXG4vKioqLyB9LFxuLyogMTk0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdC8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cblx0dmFyIGdsb2JhbCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuXHQgICwgaGFzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgREVTQ1JJUFRPUlMgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KVxuXHQgICwgJGV4cG9ydCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgLCByZWRlZmluZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpXG5cdCAgLCBNRVRBICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk1KS5LRVlcblx0ICAsICRmYWlscyAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNilcblx0ICAsIHNoYXJlZCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Mylcblx0ICAsIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Nylcblx0ICAsIHVpZCAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NClcblx0ICAsIHdrcyAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OClcblx0ICAsIHdrc0V4dCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSlcblx0ICAsIHdrc0RlZmluZSAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTYpXG5cdCAgLCBrZXlPZiAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk3KVxuXHQgICwgZW51bUtleXMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OClcblx0ICAsIGlzQXJyYXkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDEpXG5cdCAgLCBhbk9iamVjdCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCB0b0lPYmplY3QgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b1ByaW1pdGl2ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG5cdCAgLCBjcmVhdGVEZXNjICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCBfY3JlYXRlICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpXG5cdCAgLCBnT1BORXh0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNjApXG5cdCAgLCAkR09QRCAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjAyKVxuXHQgICwgJERQICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuXHQgICwgJGtleXMgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgZ09QRCAgICAgICAgICAgPSAkR09QRC5mXG5cdCAgLCBkUCAgICAgICAgICAgICA9ICREUC5mXG5cdCAgLCBnT1BOICAgICAgICAgICA9IGdPUE5FeHQuZlxuXHQgICwgJFN5bWJvbCAgICAgICAgPSBnbG9iYWwuU3ltYm9sXG5cdCAgLCAkSlNPTiAgICAgICAgICA9IGdsb2JhbC5KU09OXG5cdCAgLCBfc3RyaW5naWZ5ICAgICA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeVxuXHQgICwgUFJPVE9UWVBFICAgICAgPSAncHJvdG90eXBlJ1xuXHQgICwgSElEREVOICAgICAgICAgPSB3a3MoJ19oaWRkZW4nKVxuXHQgICwgVE9fUFJJTUlUSVZFICAgPSB3a3MoJ3RvUHJpbWl0aXZlJylcblx0ICAsIGlzRW51bSAgICAgICAgID0ge30ucHJvcGVydHlJc0VudW1lcmFibGVcblx0ICAsIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKVxuXHQgICwgQWxsU3ltYm9scyAgICAgPSBzaGFyZWQoJ3N5bWJvbHMnKVxuXHQgICwgT1BTeW1ib2xzICAgICAgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKVxuXHQgICwgT2JqZWN0UHJvdG8gICAgPSBPYmplY3RbUFJPVE9UWVBFXVxuXHQgICwgVVNFX05BVElWRSAgICAgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nXG5cdCAgLCBRT2JqZWN0ICAgICAgICA9IGdsb2JhbC5RT2JqZWN0O1xuXHQvLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcblx0dmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cdFxuXHQvLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcblx0dmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG5cdCAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBkUCh0aGlzLCAnYScsIHt2YWx1ZTogN30pLmE7IH1cblx0ICB9KSkuYSAhPSA3O1xuXHR9KSA/IGZ1bmN0aW9uKGl0LCBrZXksIEQpe1xuXHQgIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuXHQgIGlmKHByb3RvRGVzYylkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcblx0ICBkUChpdCwga2V5LCBEKTtcblx0ICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKWRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG5cdH0gOiBkUDtcblx0XG5cdHZhciB3cmFwID0gZnVuY3Rpb24odGFnKXtcblx0ICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuXHQgIHN5bS5fayA9IHRhZztcblx0ICByZXR1cm4gc3ltO1xuXHR9O1xuXHRcblx0dmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xuXHR9IDogZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG5cdH07XG5cdFxuXHR2YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCl7XG5cdCAgaWYoaXQgPT09IE9iamVjdFByb3RvKSRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG5cdCAgYW5PYmplY3QoaXQpO1xuXHQgIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG5cdCAgYW5PYmplY3QoRCk7XG5cdCAgaWYoaGFzKEFsbFN5bWJvbHMsIGtleSkpe1xuXHQgICAgaWYoIUQuZW51bWVyYWJsZSl7XG5cdCAgICAgIGlmKCFoYXMoaXQsIEhJRERFTikpZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuXHQgICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSlpdFtISURERU5dW2tleV0gPSBmYWxzZTtcblx0ICAgICAgRCA9IF9jcmVhdGUoRCwge2VudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpfSk7XG5cdCAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuXHQgIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xuXHR9O1xuXHR2YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKXtcblx0ICBhbk9iamVjdChpdCk7XG5cdCAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKVxuXHQgICAgLCBpICAgID0gMFxuXHQgICAgLCBsID0ga2V5cy5sZW5ndGhcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKGwgPiBpKSRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblx0dmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApe1xuXHQgIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcblx0fTtcblx0dmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSl7XG5cdCAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcblx0ICBpZih0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSlyZXR1cm4gZmFsc2U7XG5cdCAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xuXHR9O1xuXHR2YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcblx0ICBpdCAgPSB0b0lPYmplY3QoaXQpO1xuXHQgIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG5cdCAgaWYoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybjtcblx0ICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG5cdCAgaWYoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKUQuZW51bWVyYWJsZSA9IHRydWU7XG5cdCAgcmV0dXJuIEQ7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuXHQgIHZhciBuYW1lcyAgPSBnT1BOKHRvSU9iamVjdChpdCkpXG5cdCAgICAsIHJlc3VsdCA9IFtdXG5cdCAgICAsIGkgICAgICA9IDBcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpe1xuXHQgICAgaWYoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKXJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfSByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXHR2YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCl7XG5cdCAgdmFyIElTX09QICA9IGl0ID09PSBPYmplY3RQcm90b1xuXHQgICAgLCBuYW1lcyAgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSlcblx0ICAgICwgcmVzdWx0ID0gW11cblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG5cdCAgICBpZihoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcblx0ICB9IHJldHVybiByZXN1bHQ7XG5cdH07XG5cdFxuXHQvLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcblx0aWYoIVVTRV9OQVRJVkUpe1xuXHQgICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKXtcblx0ICAgIGlmKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKXRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuXHQgICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG5cdCAgICB2YXIgJHNldCA9IGZ1bmN0aW9uKHZhbHVlKXtcblx0ICAgICAgaWYodGhpcyA9PT0gT2JqZWN0UHJvdG8pJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuXHQgICAgICBpZihoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKXRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG5cdCAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG5cdCAgICB9O1xuXHQgICAgaWYoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKXNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8sIHRhZywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0fSk7XG5cdCAgICByZXR1cm4gd3JhcCh0YWcpO1xuXHQgIH07XG5cdCAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuXHQgICAgcmV0dXJuIHRoaXMuX2s7XG5cdCAgfSk7XG5cdFxuXHQgICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXHQgICREUC5mICAgPSAkZGVmaW5lUHJvcGVydHk7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXyg2MSkuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oMjAwKS5mICA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0ICBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OSkuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cdFxuXHQgIGlmKERFU0NSSVBUT1JTICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KSl7XG5cdCAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcblx0ICB9XG5cdFxuXHQgIHdrc0V4dC5mID0gZnVuY3Rpb24obmFtZSl7XG5cdCAgICByZXR1cm4gd3JhcCh3a3MobmFtZSkpO1xuXHQgIH1cblx0fVxuXHRcblx0JGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1N5bWJvbDogJFN5bWJvbH0pO1xuXHRcblx0Zm9yKHZhciBzeW1ib2xzID0gKFxuXHQgIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG5cdCAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuXHQpLnNwbGl0KCcsJyksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3Moc3ltYm9sc1tpKytdKTtcblx0XG5cdGZvcih2YXIgc3ltYm9scyA9ICRrZXlzKHdrcy5zdG9yZSksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3NEZWZpbmUoc3ltYm9sc1tpKytdKTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG5cdCAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG5cdCAgJ2Zvcic6IGZ1bmN0aW9uKGtleSl7XG5cdCAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG5cdCAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuXHQgICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG5cdCAgfSxcblx0ICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcblx0ICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihrZXkpe1xuXHQgICAgaWYoaXNTeW1ib2woa2V5KSlyZXR1cm4ga2V5T2YoU3ltYm9sUmVnaXN0cnksIGtleSk7XG5cdCAgICB0aHJvdyBUeXBlRXJyb3Ioa2V5ICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG5cdCAgfSxcblx0ICB1c2VTZXR0ZXI6IGZ1bmN0aW9uKCl7IHNldHRlciA9IHRydWU7IH0sXG5cdCAgdXNlU2ltcGxlOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSBmYWxzZTsgfVxuXHR9KTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG5cdCAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuXHQgIGNyZWF0ZTogJGNyZWF0ZSxcblx0ICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcblx0ICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuXHQgIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG5cdCAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG5cdCAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuXHQgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcblx0ICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuXHQgIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuXHQgIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcblx0ICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcblx0fSk7XG5cdFxuXHQvLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcblx0JEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uKCl7XG5cdCAgdmFyIFMgPSAkU3ltYm9sKCk7XG5cdCAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cblx0ICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcblx0ICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuXHQgIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7YTogU30pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG5cdH0pKSwgJ0pTT04nLCB7XG5cdCAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpe1xuXHQgICAgaWYoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG5cdCAgICB2YXIgYXJncyA9IFtpdF1cblx0ICAgICAgLCBpICAgID0gMVxuXHQgICAgICAsIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG5cdCAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuXHQgICAgcmVwbGFjZXIgPSBhcmdzWzFdO1xuXHQgICAgaWYodHlwZW9mIHJlcGxhY2VyID09ICdmdW5jdGlvbicpJHJlcGxhY2VyID0gcmVwbGFjZXI7XG5cdCAgICBpZigkcmVwbGFjZXIgfHwgIWlzQXJyYXkocmVwbGFjZXIpKXJlcGxhY2VyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG5cdCAgICAgIGlmKCRyZXBsYWNlcil2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuXHQgICAgICBpZighaXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTtcblx0ICAgIH07XG5cdCAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG5cdCAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG5cdCAgfVxuXHR9KTtcblx0XG5cdC8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcblx0JFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgX193ZWJwYWNrX3JlcXVpcmVfXygxMCkoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcblx0Ly8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG5cdC8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cblx0c2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcblx0Ly8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cblx0c2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG5cbi8qKiovIH0sXG4vKiAxOTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBNRVRBICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDQpKCdtZXRhJylcblx0ICAsIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMylcblx0ICAsIGhhcyAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHNldERlc2MgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZlxuXHQgICwgaWQgICAgICAgPSAwO1xuXHR2YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbigpe1xuXHQgIHJldHVybiB0cnVlO1xuXHR9O1xuXHR2YXIgRlJFRVpFID0gIV9fd2VicGFja19yZXF1aXJlX18oMTYpKGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcblx0fSk7XG5cdHZhciBzZXRNZXRhID0gZnVuY3Rpb24oaXQpe1xuXHQgIHNldERlc2MoaXQsIE1FVEEsIHt2YWx1ZToge1xuXHQgICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG5cdCAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuXHQgIH19KTtcblx0fTtcblx0dmFyIGZhc3RLZXkgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcblx0ICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG5cdCAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuXHQgIGlmKCFoYXMoaXQsIE1FVEEpKXtcblx0ICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG5cdCAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuXHQgICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcblx0ICAgIGlmKCFjcmVhdGUpcmV0dXJuICdFJztcblx0ICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG5cdCAgICBzZXRNZXRhKGl0KTtcblx0ICAvLyByZXR1cm4gb2JqZWN0IElEXG5cdCAgfSByZXR1cm4gaXRbTUVUQV0uaTtcblx0fTtcblx0dmFyIGdldFdlYWsgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcblx0ICBpZighaGFzKGl0LCBNRVRBKSl7XG5cdCAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuXHQgICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuIHRydWU7XG5cdCAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuXHQgICAgaWYoIWNyZWF0ZSlyZXR1cm4gZmFsc2U7XG5cdCAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuXHQgICAgc2V0TWV0YShpdCk7XG5cdCAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcblx0ICB9IHJldHVybiBpdFtNRVRBXS53O1xuXHR9O1xuXHQvLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcblx0dmFyIG9uRnJlZXplID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSlzZXRNZXRhKGl0KTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cdHZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdCAgS0VZOiAgICAgIE1FVEEsXG5cdCAgTkVFRDogICAgIGZhbHNlLFxuXHQgIGZhc3RLZXk6ICBmYXN0S2V5LFxuXHQgIGdldFdlYWs6ICBnZXRXZWFrLFxuXHQgIG9uRnJlZXplOiBvbkZyZWV6ZVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZ2xvYmFsICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBjb3JlICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIExJQlJBUlkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNylcblx0ICAsIHdrc0V4dCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSlcblx0ICAsIGRlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkuZjtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcblx0ICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuXHQgIGlmKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwge3ZhbHVlOiB3a3NFeHQuZihuYW1lKX0pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgZ2V0S2V5cyAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNClcblx0ICAsIHRvSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgZWwpe1xuXHQgIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuXHQgICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG5cdCAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG5cdCAgICAsIGluZGV4ICA9IDBcblx0ICAgICwga2V5O1xuXHQgIHdoaWxlKGxlbmd0aCA+IGluZGV4KWlmKE9ba2V5ID0ga2V5c1tpbmRleCsrXV0gPT09IGVsKXJldHVybiBrZXk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG5cdHZhciBnZXRLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNClcblx0ICAsIGdPUFMgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5OSlcblx0ICAsIHBJRSAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHZhciByZXN1bHQgICAgID0gZ2V0S2V5cyhpdClcblx0ICAgICwgZ2V0U3ltYm9scyA9IGdPUFMuZjtcblx0ICBpZihnZXRTeW1ib2xzKXtcblx0ICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdClcblx0ICAgICAgLCBpc0VudW0gID0gcElFLmZcblx0ICAgICAgLCBpICAgICAgID0gMFxuXHQgICAgICAsIGtleTtcblx0ICAgIHdoaWxlKHN5bWJvbHMubGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSlyZXN1bHQucHVzaChrZXkpO1xuXHQgIH0gcmV0dXJuIHJlc3VsdDtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0ZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqKi8gfSxcbi8qIDIwMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0ZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKiovIH0sXG4vKiAyMDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG5cdHZhciBjb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKXtcblx0ICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDIwMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIHBJRSAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDApXG5cdCAgLCBjcmVhdGVEZXNjICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpXG5cdCAgLCB0b0lPYmplY3QgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCB0b1ByaW1pdGl2ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBJRThfRE9NX0RFRklORSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpXG5cdCAgLCBnT1BEICAgICAgICAgICA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdFxuXHRleHBvcnRzLmYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCl7XG5cdCAgTyA9IHRvSU9iamVjdChPKTtcblx0ICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG5cdCAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcblx0ICAgIHJldHVybiBnT1BEKE8sIFApO1xuXHQgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblx0ICBpZihoYXMoTywgUCkpcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXG5cbi8qKiovIH0sXG4vKiAyMDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTk2KSgnYXN5bmNJdGVyYXRvcicpO1xuXG4vKioqLyB9LFxuLyogMjA1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE5NikoJ29ic2VydmFibGUnKTtcblxuLyoqKi8gfSxcbi8qIDIwNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICBvcGVuOiBfdm0uc2hvd0Ryb3Bkb3duXG5cdCAgICB9LFxuXHQgICAgc3RhdGljU3R5bGU6IHtcblx0ICAgICAgXCJwb3NpdGlvblwiOiBcInJlbGF0aXZlXCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwibW9kZWxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLnZhbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwidmFsXCJcblx0ICAgIH1dLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uX3MoX3ZtLnZhbClcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImJsdXJcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnNob3dEcm9wZG93biA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwia2V5ZG93blwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJkb3duXCIsIDQwKSkgeyByZXR1cm47IH1cblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uZG93bigkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5oaXQoJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnJlc2V0KCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJ1cFwiLCAzOCkpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnVwKCRldmVudClcblx0ICAgICAgfV0sXG5cdCAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHJlZjogXCJkcm9wZG93blwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZHJvcGRvd24tbWVudVwiXG5cdCAgfSwgX3ZtLl9sKChfdm0uaXRlbXMpLCBmdW5jdGlvbihpdGVtLCBpKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICBhY3RpdmU6IF92bS5pc0FjdGl2ZShpKVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgICB9LFxuXHQgICAgICAgIFwibW91c2Vtb3ZlXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLnNldEFjdGl2ZShpKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fYyhfdm0udGVtcGxhdGVDb21wLCB7XG5cdCAgICAgIHRhZzogXCJjb21wb25lbnRcIixcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcIml0ZW1cIjogaXRlbVxuXHQgICAgICB9XG5cdCAgICB9KV0sIDEpXSlcblx0ICB9KSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi01YjVmNWU5NFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfVxuLyoqKioqKi8gXSlcbn0pO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dnVlLXN0cmFwLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi92dWUtc3RyYXAvZGlzdC92dWUtc3RyYXAuanNcbi8vIG1vZHVsZSBpZCA9IDQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); - -/***/ }, -/* 43 */ -/***/ function(module, exports, __webpack_require__) { - -eval("// style-loader: Adds some css to the DOM by adding a \r\n'],sourceRoot:"webpack://"}])},function(t,e){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;e=0&&g.splice(e,1)}function s(t){var e=document.createElement("style");return e.type="text/css",o(t,e),e}function l(t,e){var n,r,i;if(e.singleton){var o=m++;n=v||(v=s(e)),r=u.bind(null,n,o,!1),i=u.bind(null,n,o,!0)}else n=s(e),r=c.bind(null,n),i=function(){a(n)};return r(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;r(t=e)}else i()}}function u(t,e,n,r){var i=n?"":r.css;if(t.styleSheet)t.styleSheet.cssText=y(e,i);else{var o=document.createTextNode(i),a=t.childNodes;a[e]&&t.removeChild(a[e]),a.length?t.insertBefore(o,a[e]):t.appendChild(o)}}function c(t,e){var n=e.css,r=e.media,i=e.sourceMap;if(r&&t.setAttribute("media",r),i&&(n+="\n/*# sourceURL="+i.sources[0]+" */",n+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(i))))+" */"),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}var d={},f=function(t){var e;return function(){return"undefined"==typeof e&&(e=t.apply(this,arguments)),e}},p=f(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),h=f(function(){return document.head||document.getElementsByTagName("head")[0]}),v=null,m=0,g=[];t.exports=function(t,e){e=e||{},"undefined"==typeof e.singleton&&(e.singleton=p()),"undefined"==typeof e.insertAt&&(e.insertAt="bottom");var n=i(t);return r(n,e),function(t){for(var o=[],a=0;a0&&this._delayClose(),this.$emit("input",t)},value:function(t){this.val!==t&&(this.val=t)}},created:function(){this._delayClose=(0,r.delayer)(function(){this.val=!1},"durationNum")}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("transition",{attrs:{name:"fade"}},[t._c("div",{directives:[{name:"show",rawName:"v-show",value:t.val,expression:"val"}],"class":["alert","alert-"+t.type,t.placement],style:{width:t.width},attrs:{role:"alert"}},[t._c("button",{directives:[{name:"show",rawName:"v-show",value:t.dismissable,expression:"dismissable"}],staticClass:"close",attrs:{type:"button"},on:{click:function(e){t.val=!1}}},[t._c("span",[t._v("×")])]),t._v(" "),t._t("default")],2)])},staticRenderFns:[]}},function(t,e,n){var r,i;n(83),r=n(85);var o=n(86);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Aside.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){var r=n(84);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.aside-open {\r\n transition: transform 0.3s;\n}\n.aside-open.has-push-right {\r\n transform: translateX(-300px);\n}\n.aside {\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n z-index: 1049;\r\n overflow: auto;\r\n background: #fff;\n}\n.aside.left {\r\n left: 0;\r\n right: auto;\n}\n.aside.right {\r\n left: auto;\r\n right: 0;\n}\n.slideleft-enter {\r\n transform:translateX(-100%);\n}\n.slideleft-enter-active {\r\n animation:slideleft-in .3s;\n}\n.slideleft-leave-active {\r\n animation:slideleft-out .3s;\n}\n@keyframes slideleft-in {\n0% {\r\n transform: translateX(-100%);\r\n opacity: 0;\n}\n100% {\r\n transform: translateX(0);\r\n opacity: 1;\n}\n}\n@keyframes slideleft-out {\n0% {\r\n transform: translateX(0);\r\n opacity: 1;\n}\n100% {\r\n transform: translateX(-100%);\r\n opacity: 0;\n}\n}\n.slideright-enter-active {\r\n animation:slideright-in .3s;\n}\n.slideright-leave-active {\r\n animation:slideright-out .3s;\n}\n@keyframes slideright-in {\n0% {\r\n transform: translateX(100%);\r\n opacity: 0;\n}\n100% {\r\n transform: translateX(0);\r\n opacity: 1;\n}\n}\n@keyframes slideright-out {\n0% {\r\n transform: translateX(0);\r\n opacity: 1;\n}\n100% {\r\n transform: translateX(100%);\r\n opacity: 0;\n}\n}\n.aside:focus {\r\n outline: 0;\n}\n@media (max-width: 991px) {\n.aside {\r\n min-width: 240px;\n}\n}\n.aside .aside-dialog .aside-header {\r\n border-bottom: 1px solid #e5e5e5;\r\n min-height: 16.43px;\r\n padding: 6px 15px;\r\n background: #337ab7;\r\n color: #fff;\n}\n.aside .aside-dialog .aside-header .close {\r\n margin-right: -8px;\r\n padding: 4px 8px;\r\n color: #fff;\r\n font-size: 25px;\r\n opacity: .8;\n}\n.aside .aside-dialog .aside-body {\r\n position: relative;\r\n padding: 15px;\n}\n.aside .aside-dialog .aside-footer {\r\n padding: 15px;\r\n text-align: right;\r\n border-top: 1px solid #e5e5e5;\n}\n.aside .aside-dialog .aside-footer .btn+.btn {\r\n margin-left: 5px;\r\n margin-bottom: 0;\n}\n.aside .aside-dialog .aside-footer .btn-group .btn+.btn {\r\n margin-left: -1px;\n}\n.aside .aside-dialog .aside-footer .btn-block+.btn-block {\r\n margin-left: 0;\n}\n.aside-backdrop {\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n z-index: 1040;\r\n opacity: 0;\r\n transition: opacity .3s ease;\r\n background-color: #000;\n}\n.aside-backdrop.in {\r\n opacity: .5;\r\n filter: alpha(opacity=50);\n}\r\n","",{version:3,sources:["/./src/Aside.vue?5739621f"],names:[],mappings:";AAkFA;EACA,2BAAA;CACA;AACA;EACA,8BAAA;CACA;AACA;EACA,gBAAA;EACA,OAAA;EACA,UAAA;EACA,cAAA;EACA,eAAA;EACA,iBAAA;CACA;AACA;EACA,QAAA;EACA,YAAA;CACA;AACA;EACA,WAAA;EACA,SAAA;CACA;AACA;EACA,4BAAA;CACA;AACA;EACA,2BAAA;CACA;AACA;EACA,4BAAA;CACA;AACA;AACA;IACA,6BAAA;IACA,WAAA;CACA;AACA;IACA,yBAAA;IACA,WAAA;CACA;CACA;AACA;AACA;IACA,yBAAA;IACA,WAAA;CACA;AACA;IACA,6BAAA;IACA,WAAA;CACA;CACA;AACA;EACA,4BAAA;CACA;AACA;EACA,6BAAA;CACA;AACA;AACA;IACA,4BAAA;IACA,WAAA;CACA;AACA;IACA,yBAAA;IACA,WAAA;CACA;CACA;AACA;AACA;IACA,yBAAA;IACA,WAAA;CACA;AACA;IACA,4BAAA;IACA,WAAA;CACA;CACA;AACA;IACA,WAAA;CACA;AACA;AACA;IACA,iBAAA;CACA;CACA;AACA;EACA,iCAAA;EACA,oBAAA;EACA,kBAAA;EACA,oBAAA;EACA,YAAA;CACA;AACA;EACA,mBAAA;EACA,iBAAA;EACA,YAAA;EACA,gBAAA;EACA,YAAA;CACA;AACA;EACA,mBAAA;EACA,cAAA;CACA;AACA;EACA,cAAA;EACA,kBAAA;EACA,8BAAA;CACA;AACA;EACA,iBAAA;EACA,iBAAA;CACA;AACA;EACA,kBAAA;CACA;AACA;EACA,eAAA;CACA;AACA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,WAAA;EACA,6BAAA;EACA,uBAAA;CACA;AACA;EACA,YAAA;EACA,0BAAA;CACA",file:"Aside.vue",sourcesContent:["\r\n\r\n\r\n\r\n\r\n"],sourceRoot:"webpack://"}])},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(65),o=n(1),a=r(o);e["default"]={props:{header:{type:String},placement:{type:String,"default":"right"},show:{type:Boolean,required:!0},width:{type:Number,"default":320}},watch:{show:function(t,e){var n=this;this.$emit("input",t),this.$emit(this.show?"open":"close");var r=document.body,o=(0,i.getScrollBarWidth)();if(t){this._backdrop||(this._backdrop=document.createElement("div")),this._backdrop.className="aside-backdrop",r.appendChild(this._backdrop),r.classList.add("modal-open"),0!==o&&(r.style.paddingRight=o+"px");this._backdrop.clientHeight;this._backdrop.classList.add("in"),(0,a["default"])(this._backdrop).on("click",function(){return n.trigger_close()})}else(0,a["default"])(this._backdrop).on("transitionend",function(){(0,a["default"])(n._backdrop).off();try{r.classList.remove("modal-open"),r.style.paddingRight="0",r.removeChild(n._backdrop),n._backdrop=null}catch(t){}}),this._backdrop.className="aside-backdrop"}},methods:{trigger:function(){var t=this;return{close:function(){return t.trigger_close()},open:function(){return t.trigger_open()}}},trigger_close:function(){this.$emit("close")},trigger_open:function(){this.$emit("open")}},mounted:function(){var t=this;this.$emit("trigger",function(){return t.trigger})}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("transition",{attrs:{name:"slide"+t.placement}},[t.show?t._c("div",{staticClass:"aside","class":t.placement,style:{width:t.width+"px"}},[t._c("div",{staticClass:"aside-dialog"},[t._c("div",{staticClass:"aside-content"},[t._c("div",{staticClass:"aside-header"},[t._c("button",{staticClass:"close",attrs:{type:"button"},on:{click:t.trigger_close}},[t._c("span",[t._v("×")])]),t._v(" "),t._c("h4",{staticClass:"aside-title"},[t._t("header",[t._v(t._s(t.header))])],2)]),t._v(" "),t._c("div",{staticClass:"aside-body"},[t._t("default")],2)])])]):t._e()])},staticRenderFns:[]}},function(t,e,n){var r,i;r=n(88);var o=n(89);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\ButtonGroup.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={props:{buttons:{type:Boolean,"default":!0},disabled:{type:Boolean,"default":!1},justified:{type:Boolean,"default":!1},type:{type:String,"default":"default"},value:{"default":null},vertical:{type:Boolean,"default":!1}},computed:{btnGroup:function(){return!this.disabled}},data:function(){return{val:this.value}},watch:{val:function(t){this.$emit("input",t)},value:function(t){this.val=t}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{"class":{"btn-group":t.buttons,"btn-group-justified":t.justified,"btn-group-vertical":t.vertical},attrs:{"data-toggle":t.buttons&&"buttons"}},[t._t("default")],2)},staticRenderFns:[]}},function(t,e,n){var r,i;n(91),r=n(93);var o=n(94);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Carousel.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i._scopeId="data-v-322dee41",i.functional,t.exports=r},function(t,e,n){var r=n(92);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.carousel-control[data-v-322dee41] {\r\n cursor: pointer;\n}\r\n","",{version:3,sources:["/./src/Carousel.vue?2f446342"],names:[],mappings:";AA4GA;EACA,gBAAA;CACA",file:"Carousel.vue",sourcesContent:['\r\n\r\n\r\n\r\n\r\n'], +sourceRoot:"webpack://"}])},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(1),o=r(i);e["default"]={props:{indicators:{type:Boolean,"default":!0},controls:{type:Boolean,"default":!0},interval:{type:Number,"default":5e3}},data:function(){return{indicator_list:[],index:0,isAnimating:!1}},watch:{index:function(t,e){this.slide(t>e?"left":"right",t,e)}},methods:{indicatorClick:function(t){return!this.isAnimating&&this.index!==t&&(this.isAnimating=!0,void(this.index=t))},slide:function(t,e,n){var r=this;if(this.$el){var i=(0,o["default"])(".item",this.$el);if(i.length){var a=i[e]||i[0];(0,o["default"])(a).addClass("left"===t?"next":"prev");a.clientHeight;(0,o["default"])([i[n],a]).addClass(t).on("transitionend",function(){i.off("transitionend").className="item",(0,o["default"])(a).addClass("active"),r.isAnimating=!1})}}},next:function(){return!(!this.$el||this.isAnimating)&&(this.isAnimating=!0,void(this.index+1<(0,o["default"])(".item",this.$el).length?this.index+=1:this.index=0))},prev:function(){return!(!this.$el||this.isAnimating)&&(this.isAnimating=!0,void(0===this.index?this.index=(0,o["default"])(".item",this.$el).length-1:this.index-=1))},toggleInterval:function(t){void 0===t&&(t=this._intervalID),this._intervalID&&(clearInterval(this._intervalID),delete this._intervalID),t&&this.interval>0&&(this._intervalID=setInterval(this.next,this.interval))}},mounted:function(){var t=this;this.toggleInterval(!0),(0,o["default"])(this.$el).on("mouseenter",function(){return t.toggleInterval(!1)}).on("mouseleave",function(){return t.toggleInterval(!0)})},beforeDestroy:function(){this.toggleInterval(!1),(0,o["default"])(this.$el).off("mouseenter mouseleave")}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{staticClass:"carousel slide",attrs:{"data-ride":"carousel"}},[t._c("ol",{directives:[{name:"show",rawName:"v-show",value:t.indicators,expression:"indicators"}],staticClass:"carousel-indicators"},t._l(t.indicator_list,function(e,n){return t._c("li",{"class":{active:n===t.index},on:{click:function(e){t.indicatorClick(n)}}},[t._c("span")])})),t._v(" "),t._c("div",{staticClass:"carousel-inner",attrs:{role:"listbox"}},[t._t("default")],2),t._v(" "),t._c("div",{directives:[{name:"show",rawName:"v-show",value:t.controls,expression:"controls"}],staticClass:"carousel-controls hidden-xs"},[t._c("a",{staticClass:"left carousel-control",attrs:{role:"button"},on:{click:t.prev}},[t._c("span",{staticClass:"glyphicon glyphicon-chevron-left",attrs:{"aria-hidden":"true"}})]),t._v(" "),t._c("a",{staticClass:"right carousel-control",attrs:{role:"button"},on:{click:t.next}},[t._c("span",{staticClass:"glyphicon glyphicon-chevron-right",attrs:{"aria-hidden":"true"}})])])])},staticRenderFns:[]}},function(t,e,n){var r,i;n(96),r=n(98);var o=n(99);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Checkbox.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i._scopeId="data-v-6922bf24",i.functional,t.exports=r},function(t,e,n){var r=n(97);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\nlabel.checkbox[data-v-6922bf24] {\r\n position: relative;\r\n padding-left: 18px;\n}\nlabel.checkbox > input[data-v-6922bf24] {\r\n box-sizing: border-box;\r\n position: absolute;\r\n z-index: -1;\r\n padding: 0;\r\n opacity: 0;\r\n margin: 0;\n}\nlabel.checkbox > .icon[data-v-6922bf24] {\r\n position: absolute;\r\n top: .2rem;\r\n left: 0;\r\n display: block;\r\n width: 1.4rem;\r\n height: 1.4rem;\r\n line-height:1rem;\r\n text-align: center;\r\n user-select: none;\r\n border-radius: .35rem;\r\n background-repeat: no-repeat;\r\n background-position: center center;\r\n background-size: 50% 50%;\n}\nlabel.checkbox:not(.active) > .icon[data-v-6922bf24] {\r\n background-color: #ddd;\r\n border: 1px solid #bbb;\n}\nlabel.checkbox > input:focus ~ .icon[data-v-6922bf24] {\r\n outline: 0;\r\n border: 1px solid #66afe9;\r\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);\n}\nlabel.checkbox.active > .icon[data-v-6922bf24] {\r\n background-size: 1rem 1rem;\r\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNyIgaGVpZ2h0PSI3Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJtNS43MywwLjUybC0zLjEyNDIyLDMuMzQxNjFsLTEuMzM4OTUsLTEuNDMyMTJsLTEuMjQ5NjksMS4zMzY2NWwyLjU4ODYzLDIuNzY4NzZsNC4zNzM5LC00LjY3ODI2bC0xLjI0OTY5LC0xLjMzNjY1bDAsMGwwLjAwMDAyLDAuMDAwMDF6Ii8+PC9zdmc+);\n}\nlabel.checkbox.active .btn-default[data-v-6922bf24] { filter: brightness(75%);\n}\nlabel.checkbox.disabled[data-v-6922bf24],\r\nlabel.checkbox.readonly[data-v-6922bf24],\r\n.btn.readonly[data-v-6922bf24] {\r\n filter: alpha(opacity=65);\r\n box-shadow: none;\r\n opacity: .65;\n}\nlabel.btn > input[type=checkbox][data-v-6922bf24] {\r\n position: absolute;\r\n clip: rect(0,0,0,0);\r\n pointer-events: none;\n}\r\n","",{version:3,sources:["/./src/Checkbox.vue?58a1e5c4"],names:[],mappings:";AAuFA;EACA,mBAAA;EACA,mBAAA;CACA;AACA;EACA,uBAAA;EACA,mBAAA;EACA,YAAA;EACA,WAAA;EACA,WAAA;EACA,UAAA;CACA;AACA;EACA,mBAAA;EACA,WAAA;EACA,QAAA;EACA,eAAA;EACA,cAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;EACA,kBAAA;EACA,sBAAA;EACA,6BAAA;EACA,mCAAA;EACA,yBAAA;CACA;AACA;EACA,uBAAA;EACA,uBAAA;CACA;AACA;EACA,WAAA;EACA,0BAAA;EACA,0EAAA;CACA;AACA;EACA,2BAAA;EACA,kZAAA;CACA;AACA,sDAAA,wBAAA;CAAA;AAEA;;;EAGA,0BAAA;EACA,iBAAA;EACA,aAAA;CACA;AACA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;CACA",file:"Checkbox.vue",sourcesContent:['\r\n\r\n\r\n\r\n\r\n'],sourceRoot:"webpack://"}])},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={props:{button:{type:Boolean,"default":!1},disabled:{type:Boolean,"default":!1},falseValue:{"default":!1},name:{type:String,"default":null},readonly:{type:Boolean,"default":!1},trueValue:{"default":!0},type:{type:String,"default":null},value:{"default":!1}},data:function(){return{checked:this.value===this.trueValue}},computed:{inGroup:function(){return this.$parent&&this.$parent.btnGroup&&!this.$parent._radioGroup},isButton:function(){return this.button||this.$parent&&this.$parent.btnGroup&&this.$parent.buttons},isFalse:function(){return this.value===this.falseValue},isTrue:function(){return this.value===this.trueValue},parentValue:function(){return this.$parent.val},typeColor:function(){return this.type||this.$parent&&this.$parent.type||"default"}},watch:{checked:function(t,e){var n=t?this.trueValue:this.falseValue;this.$emit("checked",t),this.$emit("input",n),this.updateParent()},parentValue:function(t){this.updateFromParent()},value:function(t,e){var n=t===this.trueValue;this.checked!==n&&(this.checked=n)}},created:function(){if(this.inGroup){var t=this.$parent;t._checkboxGroup=!0,t.val instanceof Array||(t.val=[])}},mounted:function(){this.updateFromParent()},methods:{updateFromParent:function(){if(this.inGroup){var t=this.$parent.val.indexOf(this.trueValue);this.checked=~t}},updateParent:function(){if(this.inGroup){var t=this.$parent.val.indexOf(this.trueValue);this.checked&&!~t&&this.$parent.val.push(this.trueValue),!this.checked&&~t&&this.$parent.val.splice(t,1)}},toggle:function(){this.disabled||this.readonly||(this.checked=!this.checked)}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c(t.isButton?"a":"label",{tag:"a","class":[t.isButton?"btn btn-"+t.typeColor:"open checkbox "+t.typeColor,{active:t.checked,disabled:t.disabled,readonly:t.readonly}],on:{click:t.toggle}},[t.name?t._c("input",{attrs:{type:"hidden",name:t.name},domProps:{value:t.checked?t.trueValue:t.falseValue}}):t._e(),t._v(" "),t.isButton?t._e():t._c("span",{staticClass:"icon dropdown-toggle","class":[t.checked?"btn-"+t.typeColor:"",{bg:"default"===t.typeColor}]}),t._v(" "),!t.isButton&&t.checked&&"default"===t.typeColor?t._c("span",{staticClass:"icon"}):t._e(),t._v(" "),t._t("default")],2)},staticRenderFns:[]}},function(t,e,n){var r,i;n(101),r=n(103);var o=n(104);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Datepicker.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){var r=n(102);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.datepicker {\r\n position: relative;\r\n display: inline-block;\n}\ninput.datepicker-input.with-reset-button {\r\n padding-right: 25px;\n}\n.datepicker > button.close {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n outline: none;\r\n z-index: 2;\r\n display: block;\r\n width: 34px;\r\n height: 34px;\r\n line-height: 34px;\r\n text-align: center;\n}\n.datepicker > button.close:focus {\r\n opacity: .2;\n}\n.datepicker-popup {\r\n position: absolute;\r\n border: 1px solid #ccc;\r\n border-radius: 5px;\r\n background: #fff;\r\n margin-top: 2px;\r\n z-index: 1000;\r\n box-shadow: 0 6px 12px rgba(0,0,0,0.175);\n}\n.datepicker-inner {\r\n width: 218px;\n}\n.datepicker-body {\r\n padding: 10px 10px;\n}\n.datepicker-ctrl p,\r\n.datepicker-ctrl span,\r\n.datepicker-body span {\r\n display: inline-block;\r\n width: 28px;\r\n line-height: 28px;\r\n height: 28px;\r\n border-radius: 4px;\n}\n.datepicker-ctrl p {\r\n width: 65%;\n}\n.datepicker-ctrl span {\r\n position: absolute;\n}\n.datepicker-body span {\r\n text-align: center;\n}\n.datepicker-monthRange span {\r\n width: 48px;\r\n height: 50px;\r\n line-height: 45px;\n}\n.datepicker-item-disable {\r\n background-color: white!important;\r\n cursor: not-allowed!important;\n}\n.decadeRange span:first-child,\r\n.decadeRange span:last-child,\r\n.datepicker-item-disable,\r\n.datepicker-item-gray {\r\n color: #999;\n}\n.datepicker-dateRange-item-active:hover,\r\n.datepicker-dateRange-item-active {\r\n background: rgb(50, 118, 177)!important;\r\n color: white!important;\n}\n.datepicker-monthRange {\r\n margin-top: 10px\n}\n.datepicker-monthRange span,\r\n.datepicker-ctrl span,\r\n.datepicker-ctrl p,\r\n.datepicker-dateRange span {\r\n cursor: pointer;\n}\n.datepicker-monthRange span:hover,\r\n.datepicker-ctrl p:hover,\r\n.datepicker-ctrl i:hover,\r\n.datepicker-dateRange span:hover,\r\n.datepicker-dateRange-item-hover {\r\n background-color : #eeeeee;\n}\n.datepicker-weekRange span {\r\n font-weight: bold;\n}\n.datepicker-label {\r\n background-color: #f8f8f8;\r\n font-weight: 700;\r\n padding: 7px 0;\r\n text-align: center;\n}\n.datepicker-ctrl {\r\n position: relative;\r\n height: 30px;\r\n line-height: 30px;\r\n font-weight: bold;\r\n text-align: center;\n}\n.month-btn {\r\n font-weight: bold;\r\n -webkit-user-select:none;\r\n -moz-user-select:none;\r\n -ms-user-select:none;\r\n user-select:none;\n}\n.datepicker-preBtn {\r\n left: 2px;\n}\n.datepicker-nextBtn {\r\n right: 2px;\n}\r\n","",{version:3,sources:["/./src/Datepicker.vue?52006f6c"],names:[],mappings:";AAiVA;EACA,mBAAA;EACA,sBAAA;CACA;AACA;EACA,oBAAA;CACA;AACA;EACA,mBAAA;EACA,OAAA;EACA,SAAA;EACA,cAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;CACA;AACA;EACA,YAAA;CACA;AACA;EACA,mBAAA;EACA,uBAAA;EACA,mBAAA;EACA,iBAAA;EACA,gBAAA;EACA,cAAA;EACA,yCAAA;CACA;AACA;EACA,aAAA;CACA;AACA;EACA,mBAAA;CACA;AACA;;;EAGA,sBAAA;EACA,YAAA;EACA,kBAAA;EACA,aAAA;EACA,mBAAA;CACA;AACA;EACA,WAAA;CACA;AACA;EACA,mBAAA;CACA;AACA;EACA,mBAAA;CACA;AACA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;CACA;AACA;EACA,kCAAA;EACA,8BAAA;CACA;AACA;;;;EAIA,YAAA;CACA;AAEA;;EAEA,wCAAA;EACA,uBAAA;CACA;AACA;EACA,gBAAA;CACA;AACA;;;;EAIA,gBAAA;CACA;AACA;;;;;EAKA,2BAAA;CACA;AACA;EACA,kBAAA;CACA;AACA;EACA,0BAAA;EACA,iBAAA;EACA,eAAA;EACA,mBAAA;CACA;AACA;EACA,mBAAA;EACA,aAAA;EACA,kBAAA;EACA,kBAAA;EACA,mBAAA;CACA;AACA;EACA,kBAAA;EACA,yBAAA;EACA,sBAAA;EACA,qBAAA;EACA,iBAAA;CACA;AACA;EACA,UAAA;CACA;AACA;EACA,WAAA;CACA",file:"Datepicker.vue",sourcesContent:['\r\n\r\n\r\n\r\n\r\n'], +sourceRoot:"webpack://"}])},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(65);e["default"]={props:{value:{type:String},format:{"default":"MM/dd/yyyy"},disabledDaysOfWeek:{type:Array,"default":function(){return[]}},width:{type:String},clearButton:{type:Boolean,"default":!1},lang:{type:String,"default":navigator.language},placeholder:{type:String},iconsFont:{type:String,"default":"glyphicon"}},data:function(){return{currDate:new Date,dateRange:[],decadeRange:[],displayDayView:!1,displayMonthView:!1,displayYearView:!1,val:this.value}},watch:{currDate:function(){this.getDateRange()},format:function(){this.val=this.stringify(this.currDate)},val:function(t,e){this.$emit("input",t)},value:function(t){this.val!==t&&(this.val=t)}},computed:{text:function(){return(0,r.translations)(this.lang)},preBtnClasses:function(){return"datepicker-preBtn "+this.iconsFont+" "+this.iconsFont+"-chevron-left"},nextBtnClasses:function(){return"datepicker-nextBtn "+this.iconsFont+" "+this.iconsFont+"-chevron-right"},disabledDaysArray:function(){return this.disabledDaysOfWeek.map(function(t){return parseInt(t,10)})}},methods:{close:function(){this.displayDayView=this.displayMonthView=this.displayYearView=!1},inputClick:function(){this.currDate=this.parse(this.val)||this.parse(new Date),this.displayMonthView||this.displayYearView?this.displayDayView=!1:this.displayDayView=!this.displayDayView},preNextDecadeClick:function(t){var e=this.currDate.getFullYear(),n=this.currDate.getMonth(),r=this.currDate.getDate();0===t?this.currDate=new Date(e-10,n,r):this.currDate=new Date(e+10,n,r)},preNextMonthClick:function(t){var e=this.currDate.getFullYear(),n=this.currDate.getMonth(),r=this.currDate.getDate();if(0===t){var i=this.getYearMonth(e,n-1);this.currDate=new Date(i.year,i.month,r)}else{var o=this.getYearMonth(e,n+1);this.currDate=new Date(o.year,o.month,r)}},preNextYearClick:function(t){var e=this.currDate.getFullYear(),n=this.currDate.getMonth(),r=this.currDate.getDate();0===t?this.currDate=new Date(e-1,n,r):this.currDate=new Date(e+1,n,r)},yearSelect:function(t){this.displayYearView=!1,this.displayMonthView=!0,this.currDate=new Date(t,this.currDate.getMonth(),this.currDate.getDate())},daySelect:function(t){return"datepicker-item-disable"!==t.sclass&&(this.currDate=t.date,this.val=this.stringify(this.currDate),this.displayDayView=!1,void 0)},switchMonthView:function(){this.displayDayView=!1,this.displayMonthView=!0},switchDecadeView:function(){this.displayMonthView=!1,this.displayYearView=!0},monthSelect:function(t){this.displayMonthView=!1,this.displayDayView=!0,this.currDate=new Date(this.currDate.getFullYear(),t,this.currDate.getDate())},getYearMonth:function(t,e){return e>11?(t++,e=0):e<0&&(t--,e=11),{year:t,month:e}},stringifyDecadeHeader:function(t){var e=t.getFullYear().toString(),n=e.substring(0,e.length-1)+0,r=parseInt(n,10)+10;return n+"-"+r},stringifyDayHeader:function(t){return this.text.months[t.getMonth()]+" "+t.getFullYear()},parseMonth:function(t){return this.text.months[t.getMonth()]},stringifyYearHeader:function(t){return t.getFullYear()},stringify:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.format;if(t||(t=this.parse()),!t)return"";var n=t.getFullYear(),r=t.getMonth()+1,i=t.getDate(),o=this.parseMonth(t);return e.replace(/yyyy/g,n).replace(/yy/g,n).replace(/MMMM/g,o).replace(/MMM/g,o.substring(0,3)).replace(/MM/g,("0"+r).slice(-2)).replace(/M(?!a)/g,r).replace(/dd/g,("0"+i).slice(-2)).replace(/d/g,i)},parse:function(t){void 0!==t&&null!==t||(t=this.val);var e=10!==t.length||"dd-MM-yyyy"!==this.format&&"dd/MM/yyyy"!==this.format?new Date(t):new Date(t.substring(6,10),t.substring(3,5)-1,t.substring(0,2));return isNaN(e.getFullYear())?new Date:e},getDayCount:function(t,e){var n=[31,28,31,30,31,30,31,31,30,31,30,31];return 1===e&&(t%400===0||t%4===0&&t%100!==0)?29:n[e]},getDateRange:function(){this.dateRange=[],this.decadeRange=[];for(var t={year:this.currDate.getFullYear(),month:this.currDate.getMonth(),day:this.currDate.getDate()},e=t.year.toString(),n=e.substring(0,e.length-1)+0-1,r=0;r<12;r++)this.decadeRange.push({text:n+r});var i=new Date(t.year,t.month,1),o=i.getDay()+1;0===o&&(o=7);var a=this.getDayCount(t.year,t.month);if(o>1)for(var s=this.getYearMonth(t.year,t.month-1),l=this.getDayCount(s.year,s.month),u=1;u-1&&(f="datepicker-item-disable"),this.dateRange.push({text:c,date:d,sclass:f})}for(var p=1;p<=a;p++){var h=new Date(t.year,t.month,p),v="";this.disabledDaysArray.indexOf(h.getDay())>-1&&(v="datepicker-item-disable"),p==t.day&&h.getFullYear()==t.year&&h.getMonth()==t.month&&(v="datepicker-dateRange-item-active"),this.dateRange.push({text:p,date:h,sclass:v})}if(this.dateRange.length<42)for(var m=42-this.dateRange.length,g=this.getYearMonth(t.year,t.month+1),y=1;y<=m;y++){var A=new Date(g.year,g.month,y),b="datepicker-item-gray";this.disabledDaysArray.indexOf(A.getDay())>-1&&(b="datepicker-item-disable"),this.dateRange.push({text:y,date:A,sclass:b})}}},mounted:function(){var t=this;this.$emit("child-created",this),this.currDate=this.parse(this.val)||this.parse(new Date),this._blur=function(e){t.$el.contains(e.target)||t.close()},window.addEventListener("click",this._blur)},beforeDestroy:function(){window.removeEventListener("click",this._blur)}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{staticClass:"datepicker"},[t._c("input",{directives:[{name:"model",rawName:"v-model",value:t.val,expression:"val"}],staticClass:"form-control datepicker-input","class":{"with-reset-button":t.clearButton},style:{width:t.width},attrs:{type:"text",placeholder:t.placeholder},domProps:{value:t._s(t.val)},on:{click:t.inputClick,input:function(e){e.target.composing||(t.val=e.target.value)}}}),t._v(" "),t.clearButton&&t.val?t._c("button",{staticClass:"close",attrs:{type:"button"},on:{click:function(e){t.val=""}}},[t._c("span",[t._v("×")])]):t._e(),t._v(" "),t._c("div",{directives:[{name:"show",rawName:"v-show",value:t.displayDayView,expression:"displayDayView"}],staticClass:"datepicker-popup"},[t._c("div",{staticClass:"datepicker-inner"},[t._c("div",{staticClass:"datepicker-body"},[t._c("div",{staticClass:"datepicker-ctrl"},[t._c("span",{"class":t.preBtnClasses,attrs:{"aria-hidden":"true"},on:{click:function(e){t.preNextMonthClick(0)}}}),t._v(" "),t._c("span",{"class":t.nextBtnClasses,attrs:{"aria-hidden":"true"},on:{click:function(e){t.preNextMonthClick(1)}}}),t._v(" "),t._c("p",{on:{click:t.switchMonthView}},[t._v(t._s(t.stringifyDayHeader(t.currDate)))])]),t._v(" "),t._c("div",{staticClass:"datepicker-weekRange"},t._l(t.text.daysOfWeek,function(e){return t._c("span",[t._v(t._s(e))])})),t._v(" "),t._c("div",{staticClass:"datepicker-dateRange"},t._l(t.dateRange,function(e){return t._c("span",{"class":e.sclass,on:{click:function(n){t.daySelect(e)}}},[t._v(t._s(e.text))])}))])])]),t._v(" "),t._c("div",{directives:[{name:"show",rawName:"v-show",value:t.displayMonthView,expression:"displayMonthView"}],staticClass:"datepicker-popup"},[t._c("div",{staticClass:"datepicker-inner"},[t._c("div",{staticClass:"datepicker-body"},[t._c("div",{staticClass:"datepicker-ctrl"},[t._c("span",{"class":t.preBtnClasses,attrs:{"aria-hidden":"true"},on:{click:function(e){t.preNextYearClick(0)}}}),t._v(" "),t._c("span",{"class":t.nextBtnClasses,attrs:{"aria-hidden":"true"},on:{click:function(e){t.preNextYearClick(1)}}}),t._v(" "),t._c("p",{on:{click:t.switchDecadeView}},[t._v(t._s(t.stringifyYearHeader(t.currDate)))])]),t._v(" "),t._c("div",{staticClass:"datepicker-monthRange"},[t._l(t.text.months,function(e,n){return[t._c("span",{"class":{"datepicker-dateRange-item-active":t.text.months[t.parse(t.val).getMonth()]===e&&t.currDate.getFullYear()===t.parse(t.val).getFullYear()},domProps:{textContent:t._s(e.substr(0,3))},on:{click:function(e){t.monthSelect(n)}}})]})],2)])])]),t._v(" "),t._c("div",{directives:[{name:"show",rawName:"v-show",value:t.displayYearView,expression:"displayYearView"}],staticClass:"datepicker-popup"},[t._c("div",{staticClass:"datepicker-inner"},[t._c("div",{staticClass:"datepicker-body"},[t._c("div",{staticClass:"datepicker-ctrl"},[t._c("span",{"class":t.preBtnClasses,attrs:{"aria-hidden":"true"},on:{click:function(e){t.preNextDecadeClick(0)}}}),t._v(" "),t._c("span",{"class":t.nextBtnClasses,attrs:{"aria-hidden":"true"},on:{click:function(e){t.preNextDecadeClick(1)}}}),t._v(" "),t._c("p",[t._v(t._s(t.stringifyDecadeHeader(t.currDate)))])]),t._v(" "),t._c("div",{staticClass:"datepicker-monthRange decadeRange"},[t._l(t.decadeRange,function(e){return[t._c("span",{"class":{"datepicker-dateRange-item-active":t.parse(t.val).getFullYear()===e.text},domProps:{textContent:t._s(e.text)},on:{click:function(n){n.stopPropagation(),t.yearSelect(e.text)}}})]})],2)])])])])},staticRenderFns:[]}},function(t,e,n){var r,i;r=n(106);var o=n(107);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Dropdown.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(1),o=r(i),a=n(66),s=r(a);e["default"]={directives:{ClickOutside:s["default"]},props:{disabled:{type:Boolean,"default":!1},size:{type:String,"default":null},text:{type:String,"default":null},type:{type:String,"default":"default"},value:{type:Boolean,"default":!1}},data:function(){var t=this.value;return{show:t}},watch:{show:function(t){this.$emit("input",t)},value:function(t){this.show=t}},computed:{buttonSize:function(){return~["lg","sm","xs"].indexOf(this.size)?"btn-"+this.size:""},inInput:function(){return this.$parent._input},isLi:function(){return this.$parent._isTabs||this.$parent._navbar||this.$parent.menu},menu:function(){return!this.$parent||this.$parent.navbar},slots:function(){return this._slotContents},submenu:function(){return this.$parent&&(this.$parent.menu||this.$parent.submenu)}},methods:{blur:function(){this.show=!1},toggle:function(){this.disabled||(this.show=!this.show)}},mounted:function(){var t=this;(0,o["default"])("ul",this.$el).on("click","li>a",function(e){t.show=!1})},beforeDestroy:function(){(0,o["default"])("ul",this.$el).off()}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c(t.isLi?"li":"div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.blur,expression:"blur"}],tag:"div","class":[{open:t.show,disabled:t.disabled,dropdown:t.isLi,"input-group-btn":t.inInput,"btn-group":!t.isLi&&!t.inInput}]},[t._t("before"),t._v(" "),t.isLi?t._c("a",{"class":["dropdown-toggle",t.buttonSize,{disabled:t.disabled}],attrs:{role:"button"},on:{keyup:function(e){t._k(e.keyCode,"esc",27)||(t.show=!1)},click:function(e){e.preventDefault(),t.toggle(e)}}},[t._t("button",[t._v(t._s(t.text))]),t._v(" "),t._c("span",{staticClass:"caret"})],2):t._c("button",{"class":["btn btn-"+t.type,t.buttonSize,"dropdown-toggle"],attrs:{type:"button",disabled:t.disabled},on:{keyup:function(e){t._k(e.keyCode,"esc",27)||(t.show=!1)},click:function(e){e.preventDefault(),t.toggle(e)}}},[t._t("button",[t._v(t._s(t.text))]),t._v(" "),t._c("span",{staticClass:"caret"})],2),t._v(" "),t._t("dropdown-menu",[t._c("ul",{staticClass:"dropdown-menu"},[t._t("default")],2)])],2)},staticRenderFns:[]}},function(t,e,n){var r,i;r=n(109);var o=n(110);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\FormGroup.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(1);r(i);e["default"]={props:{enterSubmit:{type:Boolean,"default":!1},icon:{type:Boolean,"default":!1},lang:{type:String,"default":navigator.language}},data:function(){return{children:[],valid:null,timeout:null}},watch:{valid:function(t,e){this.$emit("isvalid",t),this.$emit(t?"valid":"invalid"),t!==e&&this._parent&&this._parent.validate()}},methods:{validate:function(){var t=!0;return this.children.some(function(e){var n=e.validate?e.validate():void 0!==e.valid?e.valid:e.required&&!~["",null,void 0].indexOf(e.value);return n||(t=!1),!t}),this.valid=t,t===!0}},created:function(){this._formGroup=!0;for(var t=this.$parent;t&&!t._formGroup;)t=t.$parent;t&&t._formGroup&&(t.children.push(this),this._parent=t)},mounted:function(){this.validate()},beforeDestroy:function(){if(this._parent){var t=this._parent.children.indexOf(this);this._parent.children.splice(t,1)}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("span",[t._t("default")],2)},staticRenderFns:[]}},function(t,e,n){var r,i;r=n(112);var o=n(113);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\FormValidator.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(1);r(i);e["default"]={props:{enterSubmit:{type:Boolean,"default":!1},icon:{type:Boolean,"default":!1},lang:{type:String,"default":navigator.language},value:null},data:function(){return{children:[],valid:null,timeout:null}},watch:{valid:function(t,e){this.$emit("isvalid",t),this.$emit("input",t),this.$emit(t?"valid":"invalid"),t!==e&&this._parent&&this._parent.validate()}},methods:{validate:function(){var t=!this.children.every(function(t){return t.validate?t.validate():void 0!==t.valid?t.valid:t.required&&!~["",null,void 0].indexOf(t.value)});return this.valid=!t,!t}},created:function(){this._formValidator=!0;for(var t=this.$parent;t&&!t._formValidator;)t=t.$parent;t&&t._formValidator&&(t.children.push(this),this._parent=t)},mounted:function(){this.validate()},beforeDestroy:function(){if(this._parent){var t=this._parent.children.indexOf(this);this._parent.children.splice(t,1)}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("span",[t._t("default")],2)},staticRenderFns:[]}},function(t,e,n){var r,i;n(115),r=n(117);var o=n(118);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Input.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i._scopeId="data-v-652ad7b9",i.functional,t.exports=r},function(t,e,n){var r=n(116);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.form-group[data-v-652ad7b9] {\r\n position: relative;\n}\nlabel~.close[data-v-652ad7b9] {\r\n top: 25px;\n}\n.input-group>.icon[data-v-652ad7b9] {\r\n position: relative;\r\n display: table-cell;\r\n width:0;\r\n z-index: 3;\n}\n.close[data-v-652ad7b9] {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n z-index: 2;\r\n display: block;\r\n width: 34px;\r\n height: 34px;\r\n line-height: 34px;\r\n text-align: center;\n}\n.has-feedback .close[data-v-652ad7b9] {\r\n right: 20px;\n}\r\n","",{version:3,sources:["/./src/Input.vue?56ce169d"],names:[],mappings:";AA0QA;EACA,mBAAA;CACA;AACA;EACA,UAAA;CACA;AACA;EACA,mBAAA;EACA,oBAAA;EACA,QAAA;EACA,WAAA;CACA;AACA;EACA,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;CACA;AACA;EACA,YAAA;CACA",file:"Input.vue",sourcesContent:['\r\n\r\n\r\n\r\n\r\n'],sourceRoot:"webpack://"}])},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(65),o=n(1),a=r(o),s=300;e["default"]={props:{clearButton:{type:Boolean,"default":!1},cols:{type:Number,"default":null},datalist:{type:Array,"default":null},disabled:{type:Boolean,"default":!1},enterSubmit:{type:Boolean,"default":!1},error:{type:String,"default":null},help:{type:String,"default":null},hideHelp:{type:Boolean,"default":!0},icon:{type:Boolean,"default":!1},label:{type:String,"default":null},lang:{type:String,"default":navigator.language},mask:null,maskDelay:{type:Number,"default":100},match:{type:String,"default":null},max:{type:String,"default":null},maxlength:{type:Number,"default":null},min:{type:String,"default":null},minlength:{type:Number,"default":0},name:{type:String,"default":null},pattern:{"default":null},placeholder:{type:String,"default":null},readonly:{type:Boolean,"default":!1},required:{type:Boolean,"default":!1},rows:{type:Number,"default":3},step:{type:Number,"default":null},type:{type:String,"default":"text"},url:{type:String,"default":null},urlMap:{type:Function,"default":null},validationDelay:{type:Number,"default":250},value:{"default":null}},data:function(){var t=this.value;return{options:this.datalist,val:t,valid:null,timeout:null}},computed:{canValidate:function(){return!this.disabled&&!this.readonly&&(this.required||this.regex||this.nativeValidate||null!==this.match)},errorText:function(){var t=this.value,e=[this.error];return!t&&this.required&&e.push("("+this.text.required.toLowerCase()+")"),t&&t.length\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n\r\n\r\n\r\n'],sourceRoot:"webpack://"}])},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(123),o=r(i),a=n(65);e["default"]={props:{backdrop:{type:Boolean,"default":!0},callback:{type:Function,"default":null},cancelText:{type:String,"default":"Close"},effect:{type:String,"default":null},large:{type:Boolean,"default":!1},okText:{type:String,"default":"Save changes"},small:{type:Boolean,"default":!1},title:{type:String,"default":""},value:{type:Boolean,required:!0},width:{"default":null}},data:function(){return{transition:!1,val:null}},computed:{optionalWidth:function(){return null===this.width?null:(0,o["default"])(this.width)?this.width+"px":this.width}},watch:{transition:function(t,e){if(t!==e){var n=this.$el,r=document.body;t?this.val?(n.querySelector(".modal-content").focus(),n.style.display="block",setTimeout(function(){return n.classList.add("in")},0),r.classList.add("modal-open"),0!==(0,a.getScrollBarWidth)()&&(r.style.paddingRight=(0,a.getScrollBarWidth)()+"px")):n.classList.remove("in"):(this.$emit(this.val?"opened":"closed"),this.val||(n.style.display="none",r.style.paddingRight=null,r.classList.remove("modal-open")))}},val:function(t,e){this.$emit("input",t),(null===e?t===!0:t!==e)&&(this.transition=!0)},value:function(t,e){t!==e&&(this.val=t)}},methods:{action:function(t,e){null!==t&&(t&&this.callback instanceof Function&&this.callback(),this.$emit(t?"ok":"cancel",e),this.val=t||!1)}},mounted:function(){this.val=this.value}}},function(t,e,n){t.exports={"default":n(124),__esModule:!0}},function(t,e,n){n(125),t.exports=n(7).Number.isInteger},function(t,e,n){var r=n(5);r(r.S,"Number",{isInteger:n(126)})},function(t,e,n){var r=n(13),i=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{"class":["modal",t.effect],attrs:{role:"dialog"},on:{click:function(e){t.backdrop&&t.action(!1,1)},transitionend:function(e){t.transition=!1}}},[t._c("div",{"class":["modal-dialog",{"modal-lg":t.large,"modal-sm":t.small}],style:{width:t.optionalWidth},attrs:{role:"document"},on:{click:function(e){e.stopPropagation(),t.action(null)}}},[t._c("div",{staticClass:"modal-content"},[t._t("modal-header",[t._c("div",{staticClass:"modal-header"},[t._c("button",{staticClass:"close",attrs:{type:"button"},on:{click:function(e){t.action(!1,2)}}},[t._c("span",[t._v("×")])]),t._v(" "),t._c("h4",{staticClass:"modal-title"},[t._t("title",[t._v(t._s(t.title))])],2)])]),t._v(" "),t._t("modal-body",[t._c("div",{staticClass:"modal-body"},[t._t("default")],2)]),t._v(" "),t._t("modal-footer",[t._c("div",{staticClass:"modal-footer"},[t._c("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:function(e){t.action(!1,3)}}},[t._v(t._s(t.cancelText))]),t._v(" "),t._c("button",{staticClass:"btn btn-primary",attrs:{type:"button"},on:{click:function(e){t.action(!0,4)}}},[t._v(t._s(t.okText))])])])],2)])])},staticRenderFns:[]}},function(t,e,n){var r,i;r=n(129);var o=n(130);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Navbar.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(1),o=r(i);e["default"]={props:{type:{type:String,"default":"default"},placement:{type:String,"default":""},container:{type:String,"default":""}},data:function(){return{id:"bs-example-navbar-collapse-1",collapsed:!0,styles:{}}},computed:{slots:function(){return this._slotContents}},methods:{toggleCollapse:function(t){t&&t.preventDefault(),this.collapsed=!this.collapsed}},created:function(){this._navbar=!0},mounted:function(){var t=this;try{!function(){var e=(0,o["default"])('.dropdown>[data-toggle="dropdown"]',t.$el).parent();e&&e.on("click",".dropdown-toggle",function(t){t.preventDefault(),e.each(function(e){e.contains(t.target)&&e.classList.toggle("open")})}).on("click",".dropdown-menu>li>a",function(t){e.each(function(e){e.contains(t.target)&&e.classList.remove("open")})}).onBlur(function(t){e.each(function(e){e.contains(t.target)||e.classList.remove("open")})})}()}catch(e){}(0,o["default"])(this.$el).on("click touchstart","li:not(.dropdown)>a",function(e){setTimeout(function(){t.collapsed=!0},200)}).onBlur(function(e){t.$el.contains(e.target)||(t.collapsed=!0)});var n=this.$el.offsetHeight;"top"===this.placement&&(document.body.style.paddingTop=n+"px"),"bottom"===this.placement&&(document.body.style.paddingBottom=n+"px"),this.$slots.collapse&&(0,o["default"])('[data-toggle="collapse"]',this.$el).on("click",function(e){return t.toggleCollapse(e)})},beforeDestroy:function(){(0,o["default"])(".dropdown",this.$el).off("click").offBlur(),this.$slots.collapse&&(0,o["default"])('[data-toggle="collapse"]',this.$el).off("click")}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("nav",{"class":["navbar","navbar-"+t.type,"static"===t.placement?"navbar-static-top":"navbar-fixed-"+t.placement]},[t._c("div",{"class":"fluid"===t.container?"container-fluid":"container"},[t._c("div",{staticClass:"navbar-header"},[t.$slots.collapse?t._e():t._c("button",{staticClass:"navbar-toggle collapsed",attrs:{type:"button","aria-expanded":"false"},on:{click:t.toggleCollapse}},[t._c("span",{staticClass:"sr-only"},[t._v("Toggle navigation")]),t._v(" "),t._c("span",{staticClass:"icon-bar"}),t._v(" "),t._c("span",{staticClass:"icon-bar"}),t._v(" "),t._c("span",{staticClass:"icon-bar"})]),t._v(" "),t._t("collapse"),t._v(" "),t._t("brand")],2),t._v(" "),t._c("div",{"class":["navbar-collapse",{collapse:t.collapsed}]},[t._c("ul",{staticClass:"nav navbar-nav"},[t._t("default")],2),t._v(" "),t.$slots.left?t._c("ul",{staticClass:"nav navbar-nav navbar-left"},[t._t("left")],2):t._e(),t._v(" "),t.$slots.right?t._c("ul",{staticClass:"nav navbar-nav navbar-right"},[t._t("right")],2):t._e()])])])},staticRenderFns:[]}},function(t,e,n){var r,i;r=n(132);var o=n(133);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Option.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={props:{value:null},data:function(){return{loading:!0}},mounted:function(){if(this.$parent._select){this.$parent.options||(this.$parent.options=[]);var t={};t[this.$parent.optionsLabel]=this.$el.innerHTML,t[this.$parent.optionsValue]=this.value,this.$parent.options.push(t),this.loading=!1}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t.loading?t._c("li",[t._t("default")],2):t._e()},staticRenderFns:[]}},function(t,e,n){var r,i;n(135),r=n(137);var o=n(138);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Panel.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){var r=n(136);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.accordion-toggle {\r\n cursor: pointer;\n}\n.collapse-enter-active,\r\n.collapse-leave-active {\r\n transition: all .5s ease;\r\n overflow: hidden;\n}\n.collapse-enter,\r\n.collapse-leave-active {\n}\r\n\r\n","",{version:3,sources:["/./src/Panel.vue?60e798e2"],names:[],mappings:";AAyEA;EACA,gBAAA;CACA;AACA;;EAEA,yBAAA;EACA,iBAAA;CACA;AACA;;CAGA",file:"Panel.vue",sourcesContent:['\r\n\r\n\r\n\r\n\r\n'],sourceRoot:"webpack://"}])},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={props:{header:{type:String},isOpen:{type:Boolean,"default":null},type:{type:String,"default":null}},data:function(){return{open:this.isOpen}},watch:{isOpen:function(t){this.open=t}},computed:{inAccordion:function(){return this.$parent&&this.$parent._isAccordion},panelType:function(){return"panel-"+(this.type||this.$parent&&this.$parent.type||"default")}},methods:{toggle:function(){this.open=!this.open,this.inAccordion&&this.$parent.openChild(this)},enter:function(t){t.style.height="auto";var e=getComputedStyle(t).height;t.style.height="0px",t.offsetHeight,t.style.height=e},afterEnter:function(t){t.style.height="auto"},beforeLeave:function(t){t.style.height=getComputedStyle(t).height,t.offsetHeight,t.style.height="0px"}},created:function(){null===this.isOpen&&(this.open=!this.inAccordion)}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{"class":["panel",t.panelType]},[t._c("div",{"class":["panel-heading",{"accordion-toggle":t.inAccordion}],on:{click:function(e){e.preventDefault(),t.inAccordion&&t.toggle()}}},[t._t("header",[t._c("h4",{staticClass:"panel-title"},[t._v(t._s(t.header))])])],2),t._v(" "),t._c("transition",{attrs:{name:"collapse"},on:{enter:t.enter,"after-enter":t.afterEnter,"before-leave":t.beforeLeave}},[t.open?t._c("div",{staticClass:"panel-collapse"},[t._c("div",{staticClass:"panel-body"},[t._t("default")],2)]):t._e()])],1)},staticRenderFns:[]}},function(t,e,n){var r,i;n(140),r=n(142);var o=n(144);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Popover.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){var r=n(141);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.popover.top,\r\n.popover.left,\r\n.popover.right,\r\n.popover.bottom {\r\n display: block;\n}\n.scale-enter {\r\n animation:scale-in 0.15s ease-in;\n}\n.scale-leave-active {\r\n animation:scale-out 0.15s ease-out;\n}\n@keyframes scale-in {\n0% {\r\n transform: scale(0);\r\n opacity: 0;\n}\n100% {\r\n transform: scale(1);\r\n opacity: 1;\n}\n}\n@keyframes scale-out {\n0% {\r\n transform: scale(1);\r\n opacity: 1;\n}\n100% {\r\n transform: scale(0);\r\n opacity: 0;\n}\n}\r\n","",{version:3,sources:["/./src/Popover.vue?e616963a"],names:[],mappings:";AAyBA;;;;EAIA,eAAA;CACA;AACA;EACA,iCAAA;CACA;AACA;EACA,mCAAA;CACA;AACA;AACA;IACA,oBAAA;IACA,WAAA;CACA;AACA;IACA,oBAAA;IACA,WAAA;CACA;CACA;AACA;AACA;IACA,oBAAA;IACA,WAAA;CACA;AACA;IACA,oBAAA;IACA,WAAA;CACA;CACA",file:"Popover.vue",sourcesContent:['\r\n\r\n\r\n\r\n\r\n'],sourceRoot:"webpack://"}])},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(143),o=r(i);e["default"]={mixins:[o["default"]],props:{trigger:{type:String,"default":"click"}}}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(1),o=r(i);e["default"]={props:{content:{type:String},effect:{type:String,"default":"fade"},header:{type:Boolean,"default":!0},placement:{type:String,"default":"top"},title:{type:String},trigger:{type:String}},data:function(){return{top:0,left:0,show:!1}},computed:{events:function(){return{contextmenu:["contextmenu"],hover:["mouseleave","mouseenter"],focus:["blur","focus"]}[this.trigger]||["click"]}},methods:{beforeEnter:function(){var t=this;this.position(),setTimeout(function(){return t.position()},30)},position:function(){var t=this;this.$nextTick(function(){var e=t.$refs.popover,n=t.$refs.trigger.children[0];switch(t.placement){case"top":t.left=n.offsetLeft-e.offsetWidth/2+n.offsetWidth/2,t.top=n.offsetTop-e.offsetHeight;break;case"left":t.left=n.offsetLeft-e.offsetWidth,t.top=n.offsetTop+n.offsetHeight/2-e.offsetHeight/2;break;case"right":t.left=n.offsetLeft+n.offsetWidth,t.top=n.offsetTop+n.offsetHeight/2-e.offsetHeight/2;break;case"bottom":t.left=n.offsetLeft-e.offsetWidth/2+n.offsetWidth/2,t.top=n.offsetTop+n.offsetHeight}e.style.top=t.top+"px",e.style.left=t.left+"px"})},toggle:function(t){t&&"contextmenu"===this.trigger&&t.preventDefault(),this.show=!this.show,this.show&&this.beforeEnter()}},mounted:function(){var t=this,e=this.$refs.trigger.children[0];e&&("focus"!==this.trigger||~e.tabIndex||(e=(0,o["default"])("a,input,select,textarea,button",e),e.length))&&this.events.forEach(function(n){(0,o["default"])(e).on(n,t.toggle)})},beforeDestroy:function(){this._trigger&&(0,o["default"])(this._trigger).off()}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("span",{ref:"trigger"},[t._t("default"),t._v(" "),t._c("transition",{attrs:{name:t.effect}},[t.show?t._c("div",{ref:"popover","class":["popover",t.placement]},[t._c("div",{staticClass:"arrow"}),t._v(" "),t.title?t._c("h3",{staticClass:"popover-title"},[t._t("title",[t._v(t._s(t.title))])],2):t._e(),t._v(" "),t._c("div",{staticClass:"popover-content"},[t._t("content",[t._c("span",{domProps:{innerHTML:t._s(t.content)}})])],2)]):t._e()])],2)},staticRenderFns:[]}},function(t,e,n){var r,i;r=n(146);var o=n(147);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Progressbar.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(65);e["default"]={props:{animated:{type:Boolean,"default":!1},label:{"default":!1},now:{required:!0},striped:{type:Boolean,"default":!1},type:{type:String}},computed:{labelBool:function(){return r.coerce["boolean"](this.label)},nowNum:function(){return r.coerce.number(this.now)}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{"class":["progress-bar","progress-bar-"+t.type,{active:t.animated,"progress-bar-striped":t.striped}],style:{width:t.nowNum+"%"},domProps:{textContent:t._s(t.labelBool?t.nowNum+"%":null)}})},staticRenderFns:[]}},function(t,e,n){var r,i;n(149),r=n(151);var o=n(152);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Radio.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){var r=n(150);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.radio { position: relative;\n}\n.radio > label > input {\r\n position: absolute;\r\n margin: 0;\r\n padding: 0;\r\n opacity: 0;\r\n z-index: -1;\r\n box-sizing: border-box;\n}\n.radio > label > .icon {\r\n position: absolute;\r\n top: .15rem;\r\n left: 0;\r\n display: block;\r\n width: 1.4rem;\r\n height: 1.4rem;\r\n text-align: center;\r\n user-select: none;\r\n border-radius: .7rem;\r\n background-repeat: no-repeat;\r\n background-position: center center;\r\n background-size: 50% 50%;\n}\n.radio:not(.active) > label > .icon {\r\n background-color: #ddd;\r\n border: 1px solid #bbb;\n}\n.radio > label > input:focus ~ .icon {\r\n outline: 0;\r\n border: 1px solid #66afe9;\r\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);\n}\n.radio.active > label > .icon {\r\n background-size: 1rem 1rem;\r\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxzdmcgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxjaXJjbGUgY3g9IjUiIGN5PSI1IiByPSI0IiBmaWxsPSIjZmZmIi8+PC9zdmc+);\n}\n.radio.active .btn-default { filter: brightness(75%);\n}\n.radio.disabled > label > .icon,\r\n.radio.readonly > label > .icon,\r\n.btn.readonly {\r\n filter: alpha(opacity=65);\r\n box-shadow: none;\r\n opacity: .65;\n}\nlabel.btn > input[type=radio] {\r\n position: absolute;\r\n clip: rect(0,0,0,0);\r\n pointer-events: none;\n}\r\n","",{version:3,sources:["/./src/Radio.vue?11624c48"],names:[],mappings:";AA8GA,SAAA,mBAAA;CAAA;AACA;EACA,mBAAA;EACA,UAAA;EACA,WAAA;EACA,WAAA;EACA,YAAA;EACA,uBAAA;CACA;AACA;EACA,mBAAA;EACA,YAAA;EACA,QAAA;EACA,eAAA;EACA,cAAA;EACA,eAAA;EACA,mBAAA;EACA,kBAAA;EACA,qBAAA;EACA,6BAAA;EACA,mCAAA;EACA,yBAAA;CACA;AACA;EACA,uBAAA;EACA,uBAAA;CACA;AACA;EACA,WAAA;EACA,0BAAA;EACA,0EAAA;CACA;AACA;EACA,2BAAA;EACA,8OAAA;CACA;AACA,6BAAA,wBAAA;CAAA;AAEA;;;EAGA,0BAAA;EACA,iBAAA;EACA,aAAA;CACA;AACA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;CACA",file:"Radio.vue",sourcesContent:['\r\n\r\n\r\n\r\n\r\n'], +sourceRoot:"webpack://"}])},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={props:{button:{type:Boolean,"default":!1},disabled:{type:Boolean,"default":!1},name:{type:String,"default":null},readonly:{type:Boolean,"default":!1},selectedValue:{"default":!0},type:{type:String,"default":null},value:{"default":!1}},data:function(){return{check:this.value}},computed:{active:function(){return this.check===this.selectedValue},inGroup:function(){return this.$parent&&this.$parent.btnGroup&&!this.$parent._checkboxGroup},parentValue:function(){return this.$parent.val},buttonStyle:function(){return this.button||this.$parent&&this.$parent.btnGroup&&this.$parent.buttons},typeColor:function(){return this.type||this.$parent&&this.$parent.type||"default"}},watch:{check:function(t){this.selectedValue===t&&(this.$emit("input",t),this.$emit("checked",!0),this.updateParent())},parentValue:function(t){this.updateFromParent()},value:function(t){this.selectedValue==t?this.check=t:this.check=!1}},created:function(){if(this.inGroup){var t=this.$parent;t._radioGroup=!0,this.updateFromParent()}},methods:{updateFromParent:function(){this.inGroup&&(this.selectedValue==this.$parent.val?this.check=this.selectedValue:this.check=!1)},updateParent:function(){this.inGroup&&this.selectedValue===this.check&&(this.$parent.val=this.selectedValue)},focus:function(){this.$refs.input.focus()},toggle:function(){this.disabled||(this.focus(),this.readonly||(this.check=this.selectedValue))}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c(t.buttonStyle?"label":"div",{tag:"div","class":[t.buttonStyle?"btn btn-"+t.typeColor:"radio "+t.typeColor,{active:t.active,disabled:t.disabled,readonly:t.readonly}],on:{click:function(e){e.preventDefault(),t.toggle(e)}}},[t.buttonStyle?[t._c("input",{directives:[{name:"show",rawName:"v-show",value:!t.readonly,expression:"!readonly"},{name:"model",rawName:"v-model",value:t.check,expression:"check"}],ref:"input",attrs:{type:"radio",autocomplete:"off",name:t.name,readonly:t.readonly,disabled:t.disabled},domProps:{value:t.selectedValue,checked:t._q(t.check,t.selectedValue)},on:{click:function(e){t.check=t.selectedValue}}}),t._v(" "),t._t("default")]:t._c("label",{staticClass:"open"},[t._c("input",{directives:[{name:"model",rawName:"v-model",value:t.check,expression:"check"}],ref:"input",attrs:{type:"radio",autocomplete:"off",name:t.name,readonly:t.readonly,disabled:t.disabled},domProps:{value:t.selectedValue,checked:t._q(t.check,t.selectedValue)},on:{click:function(e){t.check=t.selectedValue}}}),t._v(" "),t._c("span",{staticClass:"icon dropdown-toggle","class":[t.active?"btn-"+t.typeColor:"",{bg:"default"===t.typeColor}]}),t._v(" "),t.active&&"default"===t.typeColor?t._c("span",{staticClass:"icon"}):t._e(),t._v(" "),t._t("default")],2)],2)},staticRenderFns:[]}},function(t,e,n){var r,i;n(154),r=n(156);var o=n(157);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Select.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i._scopeId="data-v-e514dbc6",i.functional,t.exports=r},function(t,e,n){var r=n(155);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.form-control.dropdown-toggle[data-v-e514dbc6]{\r\n height: auto;\r\n padding-right: 24px;\n}\n.form-control.dropdown-toggle[data-v-e514dbc6]:after{\r\n content: ' ';\r\n position: absolute;\r\n right: 13px;\r\n top: 50%;\r\n margin: -1px 0 0;\r\n border-top: 4px dashed;\r\n border-top: 4px solid \\9;\r\n border-right: 4px solid transparent;\r\n border-left: 4px solid transparent;\n}\n.bs-searchbox[data-v-e514dbc6] {\r\n position: relative;\r\n margin: 4px 8px;\n}\n.bs-searchbox .close[data-v-e514dbc6] {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n z-index: 2;\r\n display: block;\r\n width: 34px;\r\n height: 34px;\r\n line-height: 34px;\r\n text-align: center;\n}\n.bs-searchbox input[data-v-e514dbc6]:focus,\r\n.form-control.dropdown-toggle[data-v-e514dbc6]:focus {\r\n outline: 0;\r\n border-color: #66afe9 !important;\r\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);\n}\n.secret[data-v-e514dbc6] {\r\n border: 0;\r\n clip: rect(0 0 0 0);\r\n height: 1px;\r\n margin: -1px;\r\n overflow: hidden;\r\n padding: 0;\r\n position: absolute;\r\n width: 1px;\n}\n.form-control.dropdown-toggle>.close[data-v-e514dbc6] { margin-left: 5px;\n}\n.notify.out[data-v-e514dbc6] { position: relative;\n}\n.notify.in[data-v-e514dbc6],\r\n.notify>div[data-v-e514dbc6] {\r\n position: absolute;\r\n width: 96%;\r\n margin: 0 2%;\r\n min-height: 26px;\r\n padding: 3px 5px;\r\n background: #f5f5f5;\r\n border: 1px solid #e3e3e3;\r\n box-shadow: inset 0 1px 1px rgba(0,0,0,.05);\r\n pointer-events: none;\n}\n.notify>div[data-v-e514dbc6] {\r\n top: 5px;\r\n z-index: 1;\n}\n.notify.in[data-v-e514dbc6] {\r\n opacity: .9;\r\n bottom: 5px;\n}\n.btn-group-justified .dropdown-toggle>span[data-v-e514dbc6]:not(.close) {\r\n width: calc(100% - 18px);\r\n display: inline-block;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n margin-bottom: -4px;\n}\n.btn-group-justified .dropdown-menu[data-v-e514dbc6] { width: 100%;\n}\r\n","",{version:3,sources:["/./src/Select.vue?68298c13"],names:[],mappings:";AAuQA;EACA,aAAA;EACA,oBAAA;CACA;AACA;EACA,aAAA;EACA,mBAAA;EACA,YAAA;EACA,SAAA;EACA,iBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CACA;AACA;EACA,mBAAA;EACA,gBAAA;CACA;AACA;EACA,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;CACA;AACA;;EAEA,WAAA;EACA,iCAAA;EACA,0EAAA;CACA;AACA;EACA,UAAA;EACA,oBAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;EACA,WAAA;EACA,mBAAA;EACA,WAAA;CACA;AACA,wDAAA,iBAAA;CAAA;AACA,+BAAA,mBAAA;CAAA;AACA;;EAEA,mBAAA;EACA,WAAA;EACA,aAAA;EACA,iBAAA;EACA,iBAAA;EACA,oBAAA;EACA,0BAAA;EACA,4CAAA;EACA,qBAAA;CACA;AACA;EACA,SAAA;EACA,WAAA;CACA;AACA;EACA,YAAA;EACA,YAAA;CACA;AACA;EACA,yBAAA;EACA,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,wBAAA;EACA,oBAAA;CACA;AACA,uDAAA,YAAA;CAAA",file:"Select.vue",sourcesContent:['\r\n\r\n\r\n\r\n\r\n\r\n'],sourceRoot:"webpack://"}])},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(65),o=n(66),a=r(o),s={};e["default"]={directives:{ClickOutside:a["default"]},props:{clearButton:{type:Boolean,"default":!1},closeOnSelect:{type:Boolean,"default":!1},disabled:{type:Boolean,"default":!1},lang:{type:String,"default":navigator.language},limit:{type:Number,"default":1024},minSearch:{type:Number,"default":0},multiple:{type:Boolean,"default":!1},name:{type:String,"default":null},options:{type:Array,"default":function(){return[]}},optionsLabel:{type:String,"default":"label"},optionsValue:{type:String,"default":"value"},parent:{"default":!0},placeholder:{type:String,"default":null},readonly:{type:Boolean,"default":null},required:{type:Boolean,"default":null},search:{type:Boolean,"default":!1},searchText:{type:String,"default":null},countText:{type:String,"default":null},showCount:{type:Boolean,"default":!1},url:{type:String,"default":null},value:null},data:function(){return{list:[],loading:null,searchValue:null,show:!1,notify:!1,val:null,valid:null}},computed:{canSearch:function(){return this.minSearch?this.list.length>=this.minSearch:this.search},classes:function(){return[{open:this.show,disabled:this.disabled},this["class"],this.isLi?"dropdown":this.inInput?"input-group-btn":"btn-group"]},filteredOptions:function(){var t=this,e=(this.searchValue||"").toLowerCase();return e?this.list.filter(function(n){return~n[t.optionsLabel].toLowerCase().search(e)}):this.list},hasParent:function(){return this.parent instanceof Array?this.parent.length:this.parent},inInput:function(){return this.$parent._input},isLi:function(){return this.$parent._navbar||this.$parent.menu||this.$parent._tabset},limitText:function(){return this.text.limit.replace("{{limit}}",this.limit)},selected:function(){var t=this;if(0===this.list.length)return"";var e=this.values.map(function(e){return(t.list.find(function(n){return n[t.optionsValue]===e})||{})[t.optionsLabel]}).filter(function(t){return void 0!==t});return this.$emit("selected",e),e.join(", ")},selectedText:function(){return this.countText||this.text.selected.replace("{{count}}",this.values.length)},showPlaceholder:function(){return 0!==this.values.length&&this.hasParent?null:this.placeholder||this.text.notSelected},text:function(){return(0,i.translations)(this.lang)},values:function(){return this.val instanceof Array?this.val:~[null,void 0].indexOf(this.val)?[]:[this.val]},valOptions:function(){var t=this;return this.list.map(function(e){return e[t.optionsValue]})}},watch:{options:function(t){t instanceof Array&&this.setOptions(t)},show:function(t){t&&(this.$refs.search?this.$refs.search.focus():this.$refs.btn.focus())},url:function(){this.urlChanged()},valid:function(t,e){this.$emit("isvalid",t),this.$emit(t?"valid":"invalid"),t!==e&&this._parent&&this._parent.validate()},value:function(t,e){t!==e&&(this.val=t)},val:function(t,e){var n=this;void 0===t&&(this.val=t=null),t!==e&&(this.$emit("change",t),this.$emit("input",t)),t instanceof Array&&t.length>this.limit&&(this.val=t.slice(0,this.limit),this.notify=!0,s.limit&&clearTimeout(s.limit),s.limit=setTimeout(function(){s.limit=!1,n.notify=!1},1500)),this.valid=this.validate()}},methods:{close:function(){this.show=!1},checkData:function(){if(this.multiple){this.limit<1&&(this.limit=1),this.val instanceof Array||(this.val=null===this.val||void 0===this.val?[]:[this.val]);var t=this.valOptions;this.val=this.val.filter(function(e){return~t.indexOf(e)}),this.values.length>this.limit&&(this.val=this.val.slice(0,this.limit))}else~this.valOptions.indexOf(this.val)||(this.val=null)},clear:function(){this.disabled||this.readonly||(this.val=this.val instanceof Array?[]:null,this.toggle())},clearSearch:function(){this.searchValue="",this.$refs.search.focus()},isSelected:function(t){return this.values.indexOf(t)>-1},select:function(t){if(this.val instanceof Array){var e=this.val.slice(0);~e.indexOf(t)?e.splice(e.indexOf(t),1):e.push(t),this.val=e,this.closeOnSelect&&this.toggle()}else this.val=t,this.toggle()},setOptions:function(t){var e=this;this.list=t.map(function(t){if(t instanceof Object)return t;var n={};return n[e.optionsLabel]=t,n[e.optionsValue]=t,n}),this.$emit("options",this.list)},toggle:function(){this.disabled&&!this.show||(this.show=!this.show,this.show||this.$refs.btn.focus())},urlChanged:function(){var t=this;this.url&&this.$http&&(this.loading=!0,this.$http.get(this.url).then(function(e){var n=e.data instanceof Array?e.data:[];try{n=JSON.parse(n)}catch(r){}t.setOptions(n),t.loading=!1,t.checkData()},function(e){t.loading=!1}))},validate:function(){return!this.required||(this.val instanceof Array?this.val.length>0:null!==this.val)}},created:function(){this.setOptions(this.options),this.val=this.value,this._select=!0,void 0!==this.val&&this.parent||(this.val=null),!this.multiple&&this.val instanceof Array&&(this.val=this.val[0]),this.checkData(),this.url&&this.urlChanged();for(var t=this.$parent;t&&!t._formValidator;)t=t.$parent;t&&t._formValidator&&(t.children.push(this),this._parent=t)},mounted:function(){this._parent&&this._parent.children.push(this),this.setOptions(this.options),this.val=this.value,this.checkData()},beforeDestroy:function(){if(this._parent){var t=this._parent.children.indexOf(this);this._parent.children.splice(t,1)}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.close,expression:"close"}],ref:"select","class":t.classes},[t._c("div",{ref:"btn",staticClass:"form-control dropdown-toggle",attrs:{tabindex:"1",disabled:t.disabled||!t.hasParent,readonly:t.readonly},on:{blur:function(e){t.canSearch?null:t.close()},click:function(e){t.toggle()},keydown:[function(e){t._k(e.keyCode,"esc",27)||(e.stopPropagation(),e.preventDefault(),t.close(e))},function(e){t._k(e.keyCode,"space",32)||(e.stopPropagation(),e.preventDefault(),t.toggle(e))},function(e){t._k(e.keyCode,"enter",13)||(e.stopPropagation(),e.preventDefault(),t.toggle(e))}]}},[t._c("span",{staticClass:"btn-content",domProps:{innerHTML:t._s(t.loading?t.text.loading:t.showPlaceholder||(t.multiple&&t.showCount?t.selectedText:t.selected))}}),t._v(" "),t.clearButton&&t.values.length?t._c("span",{staticClass:"close",on:{click:function(e){t.clear()}}},[t._v("×")]):t._e()]),t._v(" "),t._c("select",{directives:[{name:"model",rawName:"v-model",value:t.val,expression:"val"}],ref:"sel",staticClass:"secret",attrs:{name:t.name,multiple:t.multiple,required:t.required,readonly:t.readonly,disabled:t.disabled},on:{change:function(e){t.val=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){var e="_value"in t?t._value:t.value;return e})[0]}}},[t.required?t._c("option",{attrs:{value:""}}):t._e(),t._v(" "),t._l(t.list,function(e){return t._c("option",{domProps:{value:e[t.optionsValue]}},[t._v(t._s(e[t.optionsLabel]))])})],2),t._v(" "),t._c("ul",{staticClass:"dropdown-menu"},[t.list.length?[t.canSearch?t._c("li",{staticClass:"bs-searchbox"},[t._c("input",{directives:[{name:"model",rawName:"v-model",value:t.searchValue,expression:"searchValue"}],ref:"search",staticClass:"form-control",attrs:{type:"text",placeholder:t.searchText||t.text.search,autocomplete:"off"},domProps:{value:t._s(t.searchValue)},on:{keyup:function(e){t._k(e.keyCode,"esc",27)||t.close(e)},input:function(e){e.target.composing||(t.searchValue=e.target.value)}}}),t._v(" "),t._c("span",{directives:[{name:"show",rawName:"v-show",value:t.searchValue,expression:"searchValue"}],staticClass:"close",on:{click:t.clearSearch}},[t._v("×")])]):t._e(),t._v(" "),t.required&&!t.clearButton?t._c("li",[t._c("a",{on:{mousedown:function(e){e.preventDefault(),t.clear()&&t.close()}}},[t._v(t._s(t.placeholder||t.text.notSelected))])]):t._e(),t._v(" "),t._l(t.filteredOptions,function(e){return t._c("li",{attrs:{id:e[t.optionsValue]}},[t._c("a",{on:{mousedown:function(n){n.preventDefault(),t.select(e[t.optionsValue])}}},[t._c("span",{domProps:{innerHTML:t._s(e[t.optionsLabel])}}),t._v(" "),t._c("span",{directives:[{name:"show",rawName:"v-show",value:t.isSelected(e[t.optionsValue]),expression:"isSelected(option[optionsValue])"}],staticClass:"glyphicon glyphicon-ok check-mark"})])])})]:t._e(),t._v(" "),t._t("default"),t._v(" "),t.notify&&!t.closeOnSelect?t._c("transition",{attrs:{name:"fadein"}},[t._c("div",{staticClass:"notify in"},[t._v(t._s(t.limitText))])]):t._e()],2),t._v(" "),t.notify&&t.closeOnSelect?t._c("transition",{attrs:{name:"fadein"}},[t._c("div",{staticClass:"notify out"},[t._c("div",[t._v(t._s(t.limitText))])])]):t._e()],1)},staticRenderFns:[]}},function(t,e,n){var r,i;r=n(159);var o=n(160);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Slider.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={computed:{index:function(){return this.$parent.$children.indexOf(this)},show:function(){return this.$parent.index===this.index}},mounted:function(){this.$parent.indicator_list&&this.$parent.indicator_list.push(this.index),0===this.index&&this.$el.classList.add("active")}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{staticClass:"item"},[t._t("default")],2)},staticRenderFns:[]}},function(t,e,n){var r,i;n(162),r=n(164);var o=n(165);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Spinner.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){var r=n(163);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,'\n@keyframes spin {\n100% {\r\n transform: rotate(360deg);\n}\n}\n.spinner-gritcode {\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n right: 0;\r\n z-index: 9998;\r\n position: absolute;\r\n width: 100%;\r\n text-align: center;\r\n background: rgba(255, 255, 255, 0.9);\n}\n.spinner-gritcode.spinner-fixed {\r\n position: fixed;\n}\n.spinner-gritcode .spinner-wrapper {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n -ms-transform: translate(-50%, -50%);\n}\n.spinner-gritcode .spinner-circle {\r\n position: relative;\r\n border: 4px solid #ccc;\r\n border-right-color: #337ab7;\r\n border-radius: 50%;\r\n display: inline-block;\r\n animation: spin 0.6s linear;\r\n animation-iteration-count: infinite;\r\n width: 3em;\r\n height: 3em;\r\n z-index: 2;\n}\n.spinner-gritcode .spinner-text {\r\n position: relative;\r\n text-align: center;\r\n margin-top: 0.5em;\r\n z-index: 2;\r\n width: 100%;\r\n font-size: 95%;\r\n color: #337ab7;\n}\n.spinner-gritcode.spinner-sm .spinner-circle {\r\n width: 1.5em;\r\n height: 1.5em;\n}\n.spinner-gritcode.spinner-md .spinner-circle {\r\n width: 2em;\r\n height: 2em;\n}\n.spinner-gritcode.spinner-lg .spinner-circle {\r\n width: 2.5em;\r\n height: 2.5em;\n}\n.spinner-gritcode.spinner-xl .spinner-circle {\r\n width: 3.5em;\r\n height: 3.5em;\n}\n.lt-ie10 .spinner-gritcode .spinner-circle,\r\n.ie9 .spinner-gritcode .spinner-circle,\r\n.oldie .spinner-gritcode .spinner-circle,\r\n.no-csstransitions .spinner-gritcode .spinner-circle,\r\n.no-csstransforms3d .spinner-gritcode .spinner-circle {\r\n background: url("http://i2.wp.com/www.thegreatnovelingadventure.com/wp-content/plugins/wp-polls/images/loading.gif") center center no-repeat;\r\n animation: none;\r\n margin-left: 0;\r\n margin-top: 5px;\r\n border: none;\r\n width: 32px;\r\n height: 32px;\n}\r\n',"",{version:3,sources:["/./src/Spinner.vue?65fc5a8f"],names:[],mappings:";AA2FA;AACA;IACA,0BAAA;CACA;CACA;AACA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,SAAA;EACA,cAAA;EACA,mBAAA;EACA,YAAA;EACA,mBAAA;EACA,qCAAA;CACA;AACA;EACA,gBAAA;CACA;AACA;EACA,mBAAA;EACA,SAAA;EACA,UAAA;EACA,iCAAA;EACA,qCAAA;CACA;AACA;EACA,mBAAA;EACA,uBAAA;EACA,4BAAA;EACA,mBAAA;EACA,sBAAA;EACA,4BAAA;EACA,oCAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;CACA;AACA;EACA,mBAAA;EACA,mBAAA;EACA,kBAAA;EACA,WAAA;EACA,YAAA;EACA,eAAA;EACA,eAAA;CACA;AACA;EACA,aAAA;EACA,cAAA;CACA;AACA;EACA,WAAA;EACA,YAAA;CACA;AACA;EACA,aAAA;EACA,cAAA;CACA;AACA;EACA,aAAA;EACA,cAAA;CACA;AACA;;;;;EAKA,6IAAA;EACA,gBAAA;EACA,eAAA;EACA,gBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;CACA",file:"Spinner.vue",sourcesContent:["\r\n\r\n\r\n\r\n\r\n"], +sourceRoot:"webpack://"}])},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(65),i=500;e["default"]={props:{fixed:{type:Boolean,"default":!1},global:{type:Boolean,"default":!1},size:{type:String,"default":"md"},text:{type:String,"default":""},value:{"default":!1}},data:function(){return{active:this.value,locked:!1}},computed:{spinnerSize:function(){return"spinner-"+(this.size?this.size:"sm")}},watch:{active:function(t,e){t!==e&&this.$emit("input",t)},value:function(t,e){t!==e&&this[t?"show":"hide"]()}},methods:{hide:function(){this.active=!1},show:function(t){t&&(t.text&&(this.text=t.text),t.size&&(this.size=t.size),t.fixed&&(this.fixed=t.fixed)),this._body.style.overflowY="hidden",this._started=new Date,this.active=!0,this.locked=!0,this._unlock()}},created:function(){if(this._body=document.body,this._bodyOverflow=document.body.style.overflowY,this._unlock=(0,r.delayer)(function(){this.locked=!1,this._body.style.overflowY=this._bodyOverflow},i),this.global&&!this.$root._globalSpinner){this.$root._globalSpinner=!0;var t=this;this._global={hide:function(){t.hide()},show:function(){t.show()}},this.$root.$on("spinner::show",this._global.show),this.$root.$on("spinner::hide",this._global.hide)}},beforeDestroy:function(){this._global&&(this.$root.$off("spinner::show",this._global.show),this.$root.$off("spinner::hide",this._global.hide),delete this.$root._globalSpinner),clearTimeout(this._spinnerAnimation),this._body.style.overflowY=this._bodyOverflow}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{directives:[{name:"show",rawName:"v-show",value:t.active||t.locked,expression:"active||locked"}],"class":["spinner spinner-gritcode",t.spinnerSize,{"spinner-fixed":t.fixed}]},[t._c("div",{staticClass:"spinner-wrapper"},[t._c("div",{staticClass:"spinner-circle"}),t._v(" "),t._c("div",{staticClass:"spinner-text"},[t._v(t._s(t.text))])])])},staticRenderFns:[]}},function(t,e,n){var r,i;r=n(167);var o=n(168);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Tab.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={props:{disabled:{type:Boolean,"default":!1},header:{type:String}},data:function(){return{fadein:!1}},computed:{active:function n(){var t=this,n=!this._tabs||this._tabs.show===this;return this.fadein=!1,n&&setTimeout(function(){t.fadein=!0},0),n},index:function(){return this._tabs.tabs.indexOf(this)},transition:function(){return this._tabs?this._tabs.effect:null}},created:function(){this._isTab=!0;for(var t=this;!this._tabs&&t.$parent;)t._isTabGroup&&(t.tabs.push(this),this._tabGroup=t),t._isTabs&&(t.tabs.push(this),this._tabs=t,this._tabGroup||t.headers.push(this)),t=t.$parent;if(!this._tabs)throw Error("tab depend on tabs.")},beforeDestroy:function(){var t=this;if(this._tabGroup&&(this._tabGroup.tabs=this._tabGroup.tabs.filter(function(e){return e!==t})),this._tabs&&(this._tabs.tabs=this._tabs.tabs.filter(function(e){return e!==t})),this._tabs&&(this._tabs.active===this.index&&(this._tabs.index=0),this._ingroup)){var e=this.$parent.tabs.indexOf(this);~e&&this.$parent.tabs.splice(e,1)}if(this._tabs){var n=this._tabs.tabs.indexOf(this);~n&&this._tabs.tabs.splice(n,1)}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{ref:"panel","class":["tab-pane",{"active fade":t.active,"in":t.fadein}],attrs:{role:"tabpanel"}},[t._t("default")],2)},staticRenderFns:[]}},function(t,e,n){var r,i;n(170),r=n(172);var o=n(173);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\TabGroup.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){var r=n(171);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.tab-content .tab-pane { display: none;\n}\n.tab-content .tab-pane.active { display: block;\n}\r\n","",{version:3,sources:["/./src/TabGroup.vue?22ae1c08"],names:[],mappings:";AAkCA,yBAAA,cAAA;CAAA;AACA,gCAAA,eAAA;CAAA",file:"TabGroup.vue",sourcesContent:["\r\n\r\n\r\n\r\n\r\n"],sourceRoot:"webpack://"}])},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={props:{disabled:{type:Boolean,"default":!1},header:{type:String}},data:function(){return{show:!1,tabs:[]}},computed:{active:function(){return~this.tabs.indexOf(this._tabs.show)}},methods:{blur:function(){this.show=!1},toggle:function(){this.show=!this.show}},created:function(){if(this._isTabGroup=!0,this.$parent){if(this.$parent._isTabGroup)throw Error("Can't nest tab-groups.");if(!this.$parent._isTabs)throw Error("tab-group depend on tabs.")}this._tabs=this.$parent,this._tabs.headers.push(this)}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("span",[t._t("default")],2)},staticRenderFns:[]}},function(t,e,n){var r,i;n(175),r=n(177);var o=n(178);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Tabs.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){var r=n(176);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n[tabs] > .tab-content {\r\n margin: 15px 0;\n}\r\n","",{version:3,sources:["/./src/Tabs.vue?4317b9af"],names:[],mappings:";AA0EA;EACA,eAAA;CACA",file:"Tabs.vue",sourcesContent:['\r\n\r\n\r\n\r\n'],sourceRoot:"webpack://"}])},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(65),o=n(105),a=r(o);e["default"]={components:{dropdown:a["default"]},props:{justified:!1,navStyle:{type:String,"default":null},value:{type:Number,"default":0}},data:function(){var t=this.value||0;return{index:t,headers:[],tabs:[]}},watch:{index:function(t){this.$emit("active",t),this.$emit("input",t)},value:function(t){this.index=t}},computed:{navStyleClass:function(){return["nav",~["pills","stacked"].indexOf(this.navStyle)?"nav-"+this.navStyle:"nav-tabs",{"nav-justified":i.coerce["boolean"](this.justified),"nav-pills":"stacked"===this.navStyle}]},show:function(){return this.tabs[this.index]||this.tabs[0]}},methods:{select:function(t){t.disabled||(this.index=this.tabs.indexOf(t))}},created:function(){this._isTabs=!0}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{attrs:{tabs:""}},[t._c("ul",{"class":t.navStyleClass,attrs:{role:"tablist"}},[t._l(t.headers,function(e){return[e._isTab?t._c("li",{"class":{active:e.active,disabled:e.disabled},on:{click:function(n){n.preventDefault(),t.select(e)}}},[t._t("header",[t._c("a",{attrs:{href:"#"},domProps:{innerHTML:t._s(e.header)}})])],2):t._e(),t._v(" "),e._isTabGroup?t._c("dropdown",{"class":{active:e.active},attrs:{text:e.header,disabled:e.disabled}},t._l(e.tabs,function(e){return t._c("li",{"class":{disabled:e.disabled}},[t._c("a",{attrs:{href:"#"},on:{click:function(n){n.preventDefault(),t.select(e)}}},[t._v(t._s(e.header))])])})):t._e()]})],2),t._v(" "),t._c("div",{staticClass:"tab-content"},[t._t("default")],2)])},staticRenderFns:[]}},function(t,e,n){var r,i;r=n(180);var o=n(181);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\ToggleButton.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(65);e["default"]={props:{disabled:{"default":null},falseType:{"default":null},name:null,readonly:{"default":null},trueType:{"default":"primary"},value:!1},data:function(){return{active:r.coerce["boolean"](this.value),types:{danger:"btn-danger",info:"btn-info",primary:"btn-primary",success:"btn-success",warning:"btn-warning"}}},watch:{active:function(t,e){t!==e&&(this.$emit("changed",t),this.$emit(t?"enabled":"disabled"),this.$emit("input",t))},value:function(t,e){t!==e&&(this.active=r.coerce["boolean"](this.value))}},computed:{boolDisabled:function(){return r.coerce["boolean"](this.disabled)},boolReadonly:function(){return r.coerce["boolean"](this.readonly)},type:function(){return this.types[this.value?this.trueType:this.falseType]||"btn-default"}},methods:{toggle:function(){this.boolDisabled||this.boolReadonly||(this.active=!this.active)}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("a",{"class":["btn",t.type,{readonly:t.boolReadonly}],attrs:{href:"javascript:void(0)",disabled:t.boolDisabled},on:{click:t.toggle}},[t._c("span",{"class":["glyphicon","glyphicon-"+(t.value?"ok":"remove")]}),t._v(" "),t._t("default"),t._v(" "),t.name?t._c("input",{attrs:{type:"hidden",name:t.name},domProps:{value:t.active?1:0}}):t._e()],2)},staticRenderFns:[]}},function(t,e,n){var r,i;n(183),r=n(185);var o=n(186);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Tooltip.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){var r=n(184);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.tooltip.top,\r\n.tooltip.left,\r\n.tooltip.right,\r\n.tooltip.bottom {\r\n opacity: .9;\n}\n.fadein-enter {\r\n animation:fadein-in 0.3s ease-in;\n}\n.fadein-leave-active {\r\n animation:fadein-out 0.3s ease-out;\n}\n@keyframes fadein-in {\n0% {\r\n opacity: 0;\n}\n100% {\r\n opacity: .9;\n}\n}\n@keyframes fadein-out {\n0% {\r\n opacity: .9;\n}\n100% {\r\n opacity: 0;\n}\n}\r\n","",{version:3,sources:["/./src/Tooltip.vue?37d183ec"],names:[],mappings:";AA2BA;;;;EAIA,YAAA;CACA;AACA;EACA,iCAAA;CACA;AACA;EACA,mCAAA;CACA;AACA;AACA;IACA,WAAA;CACA;AACA;IACA,YAAA;CACA;CACA;AACA;AACA;IACA,YAAA;CACA;AACA;IACA,WAAA;CACA;CACA",file:"Tooltip.vue",sourcesContent:['\r\n\r\n\r\n\r\n\r\n'],sourceRoot:"webpack://"}])},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(143),o=r(i);e["default"]={mixins:[o["default"]],props:{effect:{type:String,"default":"scale"},trigger:{type:String,"default":"hover"}}}},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("span",{ref:"trigger"},[t._t("default"),t._v(" "),t._c("transition",{attrs:{name:t.effect}},[t.show?t._c("div",{ref:"popover","class":["tooltip",t.placement]},[t._c("div",{staticClass:"tooltip-arrow"}),t._v(" "),t._c("div",{staticClass:"tooltip-inner"},[t._t("content",[t._c("div",{domProps:{innerHTML:t._s(t.content)}})])],2)]):t._e()])],2)},staticRenderFns:[]}},function(t,e,n){var r,i;n(188),r=n(190);var o=n(206);i=r=r||{},"object"!=typeof r["default"]&&"function"!=typeof r["default"]||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t}),i=r=r["default"]),"function"==typeof i&&(i=i.options),i.__file="C:\\laragon\\www\\vue-strap\\src\\Typeahead.vue",i.render=o.render,i.staticRenderFns=o.staticRenderFns,i.functional,t.exports=r},function(t,e,n){var r=n(189);"string"==typeof r&&(r=[[t.id,r,""]]);n(79)(r,{});r.locals&&(t.exports=r.locals)},function(t,e,n){e=t.exports=n(78)(),e.push([t.id,"\n.dropdown-menu > li > a {\r\n cursor: pointer;\n}\r\n","",{version:3,sources:["/./src/Typeahead.vue?73fcd4be"],names:[],mappings:";AAkIA;EACA,gBAAA;CACA",file:"Typeahead.vue",sourcesContent:['\r\n\r\n\r\n\r\n'],sourceRoot:"webpack://"}])},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(191),o=r(i),a=n(65),s=300;e["default"]={props:{async:{type:String},data:{type:Array},delay:{type:Number,"default":s},asyncKey:{type:String,"default":null},limit:{type:Number,"default":8},matchCase:{type:Boolean,"default":!1},matchStart:{type:Boolean,"default":!1},onHit:{type:Function,"default":function(t){return t}},placeholder:{type:String},template:{type:String},type:{type:String,"default":"text"},value:{type:String,"default":""}},data:function(){return{asign:"",showDropdown:!1,noResults:!0,current:0,items:[],val:this.value}},computed:{templateComp:function(){return{template:"string"==typeof this.template?""+this.template+"":'',props:{item:{"default":null}}}}},watch:{val:function(t,e){this.$emit("input",t),t!==e&&t!==this.asign&&this.__update()},value:function(t){this.val!==t&&(this.val=t)}},methods:{setItems:function(t){var e=this;this.async?(this.items=this.asyncKey?t[this.asyncKey]:t,this.items=this.items.slice(0,this.limit)):this.items=(t||[]).filter(function(t){if("object"===("undefined"==typeof t?"undefined":(0,o["default"])(t)))return!0;t=e.matchCase?t:t.toLowerCase();var n=e.matchCase?e.val:e.val.toLowerCase();return e.matchStart?0===t.indexOf(n):t.indexOf(n)!==-1}).slice(0,this.limit),this.showDropdown=this.items.length>0},setValue:function(t){this.asign=t,this.val=t,this.items=[],this.loading=!1,this.showDropdown=!1},reset:function(){this.setValue(null)},setActive:function(t){this.current=t},isActive:function(t){return this.current===t},hit:function(t){t.preventDefault(),this.setValue(this.onHit(this.items[this.current],this))},up:function(){this.current>0?this.current--:this.current=this.items.length-1},down:function(){this.currenti;)G(t,n=r[i++],e[n]);return t},Z=function(t,e){return void 0===e?x(t):X(x(t),e)},J=function(t){var e=B.call(this,t=_(t,!0));return!(this===q&&i(L,t)&&!i(F,t))&&(!(e||!i(this,t)||!i(L,t)||i(this,M)&&this[M][t])||e)},K=function(t,e){if(t=b(t),e=_(e,!0),t!==q||!i(L,e)||i(F,e)){var n=S(t,e);return!n||!i(L,e)||i(t,M)&&t[M][e]||(n.enumerable=!0),n}},Q=function(t){for(var e,n=O(b(t)),r=[],o=0;n.length>o;)i(L,e=n[o++])||e==M||e==l||r.push(e);return r},tt=function(t){for(var e,n=t===q,r=O(n?F:b(t)),o=[],a=0;r.length>a;)!i(L,e=r[a++])||n&&!i(q,e)||o.push(L[e]);return o};z||(D=function(){if(this instanceof D)throw TypeError("Symbol is not a constructor!");var t=f(arguments.length>0?arguments[0]:void 0),e=function(n){this===q&&e.call(F,n),i(this,M)&&i(this[M],t)&&(this[M][t]=!1),U(this,t,w(1,n))};return o&&H&&U(q,t,{configurable:!0,set:e}),W(t)},s(D[R],"toString",function(){return this._k}),k.f=K,$.f=G,n(61).f=C.f=Q,n(200).f=J,n(199).f=tt,o&&!n(27)&&s(q,"propertyIsEnumerable",J,!0),h.f=function(t){return W(p(t))}),a(a.G+a.W+a.F*!z,{Symbol:D});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),nt=0;et.length>nt;)p(et[nt++]);for(var et=E(p.store),nt=0;et.length>nt;)v(et[nt++]);a(a.S+a.F*!z,"Symbol",{"for":function(t){return i(P,t+="")?P[t]:P[t]=D(t)},keyFor:function(t){if(Y(t))return m(P,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){H=!0},useSimple:function(){H=!1}}),a(a.S+a.F*!z,"Object",{create:Z,defineProperty:G,defineProperties:X,getOwnPropertyDescriptor:K,getOwnPropertyNames:Q,getOwnPropertySymbols:tt}),j&&a(a.S+a.F*(!z||u(function(){var t=D();return"[null]"!=N([t])||"{}"!=N({a:t})||"{}"!=N(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!Y(t)){for(var e,n,r=[t],i=1;arguments.length>i;)r.push(arguments[i++]);return e=r[1],"function"==typeof e&&(n=e),!n&&y(e)||(e=function(t,e){if(n&&(e=n.call(this,t,e)),!Y(e))return e}),r[1]=e,N.apply(j,r)}}}),D[R][I]||n(10)(D[R],I,D[R].valueOf),d(D,"Symbol"),d(Math,"Math",!0),d(r.JSON,"JSON",!0)},function(t,e,n){var r=n(44)("meta"),i=n(13),o=n(29),a=n(11).f,s=0,l=Object.isExtensible||function(){return!0},u=!n(16)(function(){return l(Object.preventExtensions({}))}),c=function(t){a(t,r,{value:{i:"O"+ ++s,w:{}}})},d=function(t,e){if(!i(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!o(t,r)){if(!l(t))return"F";if(!e)return"E";c(t)}return t[r].i},f=function(t,e){if(!o(t,r)){if(!l(t))return!0;if(!e)return!1;c(t)}return t[r].w},p=function(t){return u&&h.NEED&&l(t)&&!o(t,r)&&c(t),t},h=t.exports={KEY:r,NEED:!1,fastKey:d,getWeak:f,onFreeze:p}},function(t,e,n){var r=n(6),i=n(7),o=n(27),a=n(55),s=n(11).f;t.exports=function(t){var e=i.Symbol||(i.Symbol=o?{}:r.Symbol||{});"_"==t.charAt(0)||t in e||s(e,t,{value:a.f(t)})}},function(t,e,n){var r=n(34),i=n(36);t.exports=function(t,e){for(var n,o=i(t),a=r(o),s=a.length,l=0;s>l;)if(o[n=a[l++]]===e)return n}},function(t,e,n){var r=n(34),i=n(199),o=n(200);t.exports=function(t){var e=r(t),n=i.f;if(n)for(var a,s=n(t),l=o.f,u=0;s.length>u;)l.call(t,a=s[u++])&&e.push(a);return e}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){var r=n(38);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){var r=n(200),i=n(19),o=n(36),a=n(18),s=n(29),l=n(14),u=Object.getOwnPropertyDescriptor;e.f=n(15)?u:function(t,e){if(t=o(t),e=a(e,!0),l)try{return u(t,e)}catch(n){}if(s(t,e))return i(!r.f.call(t,e),t[e])}},function(t,e){},function(t,e,n){n(196)("asyncIterator")},function(t,e,n){n(196)("observable")},function(t,e,n){t.exports={render:function(){var t=this;t.$createElement;return t._c("div",{"class":{open:t.showDropdown},staticStyle:{position:"relative"}},[t._c("input",{directives:[{name:"model",rawName:"v-model",value:t.val,expression:"val"}],staticClass:"form-control",attrs:{autocomplete:"off",placeholder:t.placeholder,type:t.type},domProps:{value:t._s(t.val)},on:{blur:function(e){t.showDropdown=!1},keydown:[function(e){t._k(e.keyCode,"down",40)||(e.preventDefault(),t.down(e))},function(e){t._k(e.keyCode,"enter",13)||t.hit(e)},function(e){t._k(e.keyCode,"esc",27)||t.reset(e)},function(e){t._k(e.keyCode,"up",38)||(e.preventDefault(),t.up(e))}],input:function(e){e.target.composing||(t.val=e.target.value)}}}),t._v(" "),t._c("ul",{ref:"dropdown",staticClass:"dropdown-menu"},t._l(t.items,function(e,n){return t._c("li",{"class":{active:t.isActive(n)}},[t._c("a",{on:{mousedown:function(e){e.preventDefault(),t.hit(e)},mousemove:function(e){t.setActive(n)}}},[t._c(t.templateComp,{tag:"component",attrs:{item:e}})],1)])}))])},staticRenderFns:[]}}])})},function(t,e,n){var r=n(19);"string"==typeof r&&(r=[[t.i,r,""]]),r.locals&&(t.exports=r.locals);n(2)("35eb52e6",r,!0)},function(t,e,n){var r=n(20);"string"==typeof r&&(r=[[t.i,r,""]]),r.locals&&(t.exports=r.locals);n(2)("2b43b308",r,!0)},function(t,e,n){var r=n(21);"string"==typeof r&&(r=[[t.i,r,""]]),r.locals&&(t.exports=r.locals);n(2)("3d6015d1",r,!0)},function(t,e,n){var r=n(22);"string"==typeof r&&(r=[[t.i,r,""]]),r.locals&&(t.exports=r.locals);n(2)("68acf94b",r,!0)},function(t,e,n){var r=n(23);"string"==typeof r&&(r=[[t.i,r,""]]),r.locals&&(t.exports=r.locals);n(2)("5c4373cc",r,!0)},function(t,e,n){var r=n(24);"string"==typeof r&&(r=[[t.i,r,""]]),r.locals&&(t.exports=r.locals);n(2)("02811649",r,!0)},function(t,e,n){var r=n(25);"string"==typeof r&&(r=[[t.i,r,""]]),r.locals&&(t.exports=r.locals);n(2)("9670dfd6",r,!0)},function(t,e){t.exports=function(t,e){for(var n=[],r={},i=0;i-1)return t.splice(n,1)}}function o(t,e){return oi.call(t,e)}function a(t){return"string"==typeof t||"number"==typeof t}function s(t){var e=Object.create(null);return function(n){var r=e[n];return r||(e[n]=t(n))}}function l(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n}function u(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function c(t,e){for(var n in e)t[n]=e[n];return t}function d(t){return null!==t&&"object"==typeof t}function f(t){return di.call(t)===fi}function p(t){for(var e={},n=0;nvi._maxUpdateCount)){Ti("You may have an infinite update loop "+(t.user?'in watcher with expression "'+t.expression+'"':"in a component render function."),t.vm);break}}$i&&vi.devtools&&$i.emit("flush"),U()}function Y(t){var e=t.id;if(null==Zi[e]){if(Zi[e]=!0,Qi){for(var n=Xi.length-1;n>=0&&Xi[n].id>t.id;)n--;Xi.splice(Math.max(n,to)+1,0,t)}else Xi.push(t);Ki||(Ki=!0,Ei(W))}}function G(t){ro.clear(),X(t,ro)}function X(t,e){var n,r,i=Array.isArray(t);if((i||d(t))&&Object.isExtensible(t)){if(t.__ob__){var o=t.__ob__.dep.id;if(e.has(o))return;e.add(o)}if(i)for(n=t.length;n--;)X(t[n],e);else for(r=Object.keys(t),n=r.length;n--;)X(t[r[n]],e)}}function Z(t){t._watchers=[],J(t),et(t),K(t),Q(t),nt(t)}function J(t){var e=t.$options.props;if(e){var n=t.$options.propsData||{},r=t.$options._propKeys=Object.keys(e),i=!t.$parent;Bi.shouldConvert=i;for(var o=function(i){var o=r[i];io[o]&&Ti('"'+o+'" is a reserved attribute and cannot be used as component prop.',t),E(t,o,L(o,e,n,t),function(){t.$parent&&!Bi.isSettingProps&&Ti("Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: \""+o+'"',t)})},a=0;a1?u(n):n;for(var r=u(arguments,1),i=0,o=n.length;i-1:t.test(e)}function Gt(t){var e={};e.get=function(){return vi},e.set=function(){Ti("Do not replace the Vue.config object, set individual fields instead.")},Object.defineProperty(t,"config",e),t.util=zi,t.set=S,t["delete"]=T,t.nextTick=Ei,t.options=Object.create(null),vi._assetTypes.forEach(function(e){t.options[e+"s"]=Object.create(null)}),t.options._base=t,c(t.options.components,vo),Vt(t),Ht(t),Ut(t),Wt(t)}function Xt(t){for(var e=t.data,n=t,r=t;r.child;)r=r.child._vnode,r.data&&(e=Zt(r.data,e));for(;n=n.parent;)n.data&&(e=Zt(e,n.data));return Jt(e)}function Zt(t,e){return{staticClass:Kt(t.staticClass,e.staticClass),"class":t["class"]?[t["class"],e["class"]]:e["class"]}}function Jt(t){var e=t["class"],n=t.staticClass;return n||e?Kt(n,Qt(e)):""}function Kt(t,e){return t?e?t+" "+e:t:e||""}function Qt(t){var e="";if(!t)return e;if("string"==typeof t)return t;if(Array.isArray(t)){for(var n,r=0,i=t.length;r-1?Do[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Do[t]=/HTMLUnknownElement/.test(e.toString())}function ne(t){if("string"==typeof t){var e=t;if(t=document.querySelector(t),!t)return Ti("Cannot find element: "+e),document.createElement("div")}return t}function re(t,e){var n=document.createElement(t);return"select"!==t?n:(e.data&&e.data.attrs&&"multiple"in e.data.attrs&&n.setAttribute("multiple","multiple"),n)}function ie(t,e){return document.createElementNS($o[t],e)}function oe(t){return document.createTextNode(t)}function ae(t){return document.createComment(t)}function se(t,e,n){t.insertBefore(e,n)}function le(t,e){t.removeChild(e)}function ue(t,e){t.appendChild(e)}function ce(t){return t.parentNode}function de(t){return t.nextSibling}function fe(t){return t.tagName}function pe(t,e){t.textContent=e}function he(t,e,n){t.setAttribute(e,n)}function ve(t,e){var n=t.data.ref;if(n){var r=t.context,o=t.child||t.elm,a=r.$refs;e?Array.isArray(a[n])?i(a[n],o):a[n]===o&&(a[n]=void 0):t.data.refInFor?Array.isArray(a[n])&&a[n].indexOf(o)<0?a[n].push(o):a[n]=[o]:a[n]=o}}function me(t){return null==t}function ge(t){return null!=t}function ye(t,e){return t.key===e.key&&t.tag===e.tag&&t.isComment===e.isComment&&!t.data==!e.data}function Ae(t,e,n){var r,i,o={};for(r=e;r<=n;++r)i=t[r].key,ge(i)&&(o[i]=r);return o}function be(e){function n(t){return new ao(T.tagName(t).toLowerCase(),{},[],(void 0),t)}function i(t,e){function n(){0===--n.listeners&&o(t)}return n.listeners=e,n}function o(t){var e=T.parentNode(t);e&&T.removeChild(e,t)}function s(t,e,n,r,i){if(t.isRootInsert=!i,!l(t,e,n,r)){var o=t.data,a=t.children,s=t.tag;ge(s)?(o&&o.pre&&O++,O||t.ns||vi.ignoredElements&&vi.ignoredElements.indexOf(s)>-1||!vi.isUnknownElement(s)||Ti("Unknown custom element: <"+s+'> - did you register the component correctly? For recursive components, make sure to provide the "name" option.',t.context),t.elm=t.ns?T.createElementNS(t.ns,s):T.createElement(s,t),v(t),d(t,a,e),ge(o)&&p(t,e),c(n,t.elm,r),o&&o.pre&&O--):t.isComment?(t.elm=T.createComment(t.text),c(n,t.elm,r)):(t.elm=T.createTextNode(t.text),c(n,t.elm,r))}}function l(t,e,n,r){var i=t.data;if(ge(i)){var o=ge(t.child)&&i.keepAlive;if(ge(i=i.hook)&&ge(i=i.init)&&i(t,!1,n,r),ge(t.child))return h(t,e),o&&u(t,e,n,r),!0}}function u(t,e,n,r){for(var i,o=t;o.child;)if(o=o.child._vnode,ge(i=o.data)&&ge(i=i.transition)){for(i=0;if?(u=me(n[v+1])?null:n[v+1].elm,m(t,u,n,d,v,r)):d>v&&y(t,e,c,f)}function _(t,e,n,r){if(t!==e){if(e.isStatic&&t.isStatic&&e.key===t.key&&(e.isCloned||e.isOnce))return e.elm=t.elm,void(e.child=t.child);var i,o=e.data,a=ge(o);a&&ge(i=o.hook)&&ge(i=i.prepatch)&&i(t,e);var s=e.elm=t.elm,l=t.children,u=e.children;if(a&&f(e)){for(i=0;i, or missing . Bailing hydration and performing full client-side render.")}t=n(t)}if(l=t.elm,u=T.parentNode(l),s(e,d,u,T.nextSibling(l)),e.parent){for(var h=e.parent;h;)h.elm=e.elm,h=h.parent;if(f(e))for(var v=0;v-1?e.split(/\s+/).forEach(function(e){return t.classList.add(e)}):t.classList.add(e);else{var n=" "+t.getAttribute("class")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Le(t,e){if(e&&e.trim())if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e);else{for(var n=" "+t.getAttribute("class")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");t.setAttribute("class",n.trim())}}function Fe(t){ra(function(){ra(t)})}function qe(t,e){(t._transitionClasses||(t._transitionClasses=[])).push(e),Pe(t,e)}function ze(t,e){t._transitionClasses&&i(t._transitionClasses,e),Le(t,e)}function Ve(t,e,n){var r=He(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Jo?ta:na,l=0,u=function(){t.removeEventListener(s,c),n()},c=function(e){e.target===t&&++l>=a&&u()};setTimeout(function(){l0&&(n=Jo,c=a,d=o.length):e===Ko?u>0&&(n=Ko,c=u,d=l.length):(c=Math.max(a,u),n=c>0?a>u?Jo:Ko:null,d=n?n===Jo?o.length:l.length:0);var f=n===Jo&&ia.test(r[Qo+"Property"]);return{type:n,timeout:c,propCount:d,hasTransform:f}}function Ue(t,e){for(;t.length1,T=n._enterCb=Ze(function(){E&&ze(n,w),T.cancelled?(E&&ze(n,_),$&&$(n)):k&&k(n),n._enterCb=null});t.data.show||Ct(t.data.hook||(t.data.hook={}),"insert",function(){var e=n.parentNode,r=e&&e._pending&&e._pending[t.key];r&&r.context===t.context&&r.tag===t.tag&&r.elm._leaveCb&&r.elm._leaveCb(),C&&C(n,T)},"transition-insert"),x&&x(n),E&&(qe(n,_),qe(n,w),Fe(function(){ze(n,_),T.cancelled||S||Ve(n,o,T)})),t.data.show&&(e&&e(),C&&C(n,T)),E||S||T()}}}function Ge(t,e){function n(){m.cancelled||(t.data.show||((r.parentNode._pending||(r.parentNode._pending={}))[t.key]=t),u&&u(r),h&&(qe(r,s),qe(r,l),Fe(function(){ze(r,s),m.cancelled||v||Ve(r,a,m)})),c&&c(r,m),h||v||m())}var r=t.elm;r._enterCb&&(r._enterCb.cancelled=!0,r._enterCb());var i=Xe(t.data.transition);if(!i)return e();if(!r._leaveCb&&1===r.nodeType){var o=i.css,a=i.type,s=i.leaveClass,l=i.leaveActiveClass,u=i.beforeLeave,c=i.leave,d=i.afterLeave,f=i.leaveCancelled,p=i.delayLeave,h=o!==!1&&!_i,v=c&&(c._length||c.length)>1,m=r._leaveCb=Ze(function(){r.parentNode&&r.parentNode._pending&&(r.parentNode._pending[t.key]=null),h&&ze(r,l),m.cancelled?(h&&ze(r,s),f&&f(r)):(e(),d&&d(r)),r._leaveCb=null});p?p(n):n()}}function Xe(t){if(t){if("object"==typeof t){var e={};return t.css!==!1&&c(e,oa(t.name||"v")),c(e,t),e}return"string"==typeof t?oa(t):void 0}}function Ze(t){var e=!1;return function(){e||(e=!0,t())}}function Je(t,e){e.data.show||Ye(e)}function Ke(t,e,n){var r=e.value,i=t.multiple;if(i&&!Array.isArray(r))return void Ti(':\nv-model does not support dynamic input types. Use v-if branches instead.'),"select"===o?Yr(t,r,i):"input"===o&&"checkbox"===a?Hr(t,r,i):"input"===o&&"radio"===a?Ur(t,r,i):Wr(t,r,i),!0}function Hr(t,e,n){null!=t.attrsMap.checked&&as("<"+t.tag+' v-model="'+e+"\" checked>:\ninline checked attributes will be ignored when using v-model. Declare initial values in the component's data option instead.");var r=n&&n.number,i=$n(t,"value")||"null",o=$n(t,"true-value")||"true",a=$n(t,"false-value")||"false";wn(t,"checked","Array.isArray("+e+")?_i("+e+","+i+")>-1:_q("+e+","+o+")"),kn(t,"change","var $$a="+e+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$c){$$i<0&&("+e+"=$$a.concat($$v))}else{$$i>-1&&("+e+"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{"+e+"=$$c}",null,!0)}function Ur(t,e,n){null!=t.attrsMap.checked&&as("<"+t.tag+' v-model="'+e+"\" checked>:\ninline checked attributes will be ignored when using v-model. Declare initial values in the component's data option instead.");var r=n&&n.number,i=$n(t,"value")||"null";i=r?"_n("+i+")":i,wn(t,"checked","_q("+e+","+i+")"),kn(t,"change",Xr(e,i),null,!0)}function Wr(t,e,n){"input"===t.tag&&t.attrsMap.value&&as("<"+t.tag+' v-model="'+e+'" value="'+t.attrsMap.value+"\">:\ninline value attributes will be ignored when using v-model. Declare initial values in the component's data option instead."),"textarea"===t.tag&&t.children.length&&as('